token = $config['token']; $this->mch_id = $config['mch_id']; $this->config = $config; } public static function make($config) { if (!self::$instance) self::$instance = new self($config); return self::$instance; } /** * 生成签名字符串 * @param array $requestData 需要签名的数组 * @param $payKey 私钥 * @return string * @deprecated */ public function md5Sign( array $requestData = array(),$payKey){ ksort($requestData); $keyVal=''; foreach ($requestData as $key => $val) { $keyVal.=$key."=".$val."&"; } $keyVal=$keyVal."key=".$payKey; return strtoupper(md5($keyVal)); } /** * 验证签名 * @param array $requestData 需要签名的数组 * @param $payKey 私钥 * @param $sign 签名结果 * @return string * @deprecated */ public function md5Verify(array $requestData = array(),$payKey, $sign) { ksort($requestData); $keyVal=''; foreach ($requestData as $key => $val) { $keyVal.=$key."=".$val."&"; } $keyVal=$keyVal."key=".$payKey; $mysgin = strtoupper(md5($keyVal)); if($mysgin == $sign) { return true; } else { return false; } } /** * 统一下单 * @param $pay_data * @return array */ public function orderBuy($pay_data) { // $request = [ // 'orderNo' => $pay_data['orderNo'], //商户订单号,最大长度60个字符 // 'customerId' => $pay_data['customerId'], //客户交易者账号 // 'orderCurrency' => $pay_data['orderCurrency'], //订单币种,固定值:USDT或CNY // 'orderAmount' => $pay_data['orderAmount'], //订单金额,USDT单位为个,CNY单位为元 // 'receiveUrl' => $this->config['notify_url'], // 通知回调地址 // 'pickupUrl' => $this->config['return_url'] . '?orderNo=' . $pay_data['orderNo'], // 交易完成后跳转URL // 'signType' => 'MD5', //固定值不要改 // ]; //商户号 $accountId = $this->mch_id; //商户秘钥 $key = $this->token; $payData=array(); //商户 $payData['accountId']=$accountId; //支付类型 $payData['payType']='1'; //订单号 $payData['orderId']=$pay_data['orderNo']; //商品名称 $payData['commodity']='商品'.mt_rand(100000,999999); //接口参数---其他支付接口参数请查看接口文档 $payData['interface'] = $this->config['interface']; //订单金额(元) $payData['amount']=$pay_data['orderAmount']; //用户请求ip $payData['requestIp']='127.0.0.1'; //异步回调地址 $payData['notifyUrl']=$this->config['notify_url']; $sign = $this->md5Sign($payData,$key); //签名 $payData['sign'] = $sign; Log::channel('pay_order')->info(json_encode($payData,true), []); $req=$this->httpPost($this->config['url'],$payData); return $req; } /* * 发送对象数据 * @param $url 请求url * @param $jsonStr 发送数组 * @return string */ private function httpPost($url, $param) { if (empty($url) || empty($param)) { return false; } $param = http_build_query($param); try { $ch = curl_init();//初始化curl curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS,$param); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //正式环境时解开注释 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $data = curl_exec($ch);//运行curl curl_close($ch); if (!$data) { throw new \Exception('请求出错'); } return $data; } catch (\Exception $e) { Log::channel('pay_order')->info('$this->config=>'.$e->getMessage(), []); return false; } } /** * 检查订单 * @param $order * @return bool|string */ public function checkOrder($order){ $url = 'http://www.shanyecaozf.com/gateway/Pay/order_query.html'; $payData['accountId'] = $this->mch_id; $payData['orderId'] = $order['orderNo']; $key = $this->token; $sign = $this->md5Sign($payData, $key); $payData['sign'] = $sign; $res = $this->httpPost($url, $payData); $res = is_array($res) ? $res : json_decode($res, 256); if ($res['status'] == 1) { if ($res['data']['trade_status'] == 200 && $res['data']['out_trade_no']==$order['orderNo']) { return true; } } return false; } /** * @param $para * @return bool|mixed * @deprecated */ public function checkSign($para) { $sign = $para['sign']; unset($para['sign']); $sign = $this->md5Verify($para, $this->token, $sign); return $sign; } }