creatNewPayment(Auth::id(), $request->input('id'), $request->input('amount')); // switch ($request->input('type')) { // case 2: // $type = 'qqpay'; // break; // case 3: // $type = 'wxpay'; // break; // case 1: // default: // $type = 'alipay'; // break; // } /* merchantId 商户号-平台统一提供的唯一ID号 true string merchantOrderId 商户订单号[自行维护唯一性] true string payCode 支付编码[alipay]|JD|zfb|wx] true string amount 支付金额(单位:元) 可以0.01元 true string callbackUrl 异步通知地址 true string notifyUrl 同步跳转地址 false string userLocalIp 用户IP true string sign 签名[参考平台签名算法] true string ext 附加参数[异步通知原路返回] false string SHA256 签名介绍 第一步,设所有发送或者接收到的数据为集合M,将集合M内的[参数名]按照参 ASCII 码从小到大排序(字典序) 第二步,使用 URL 键值对的格式(即 key1=value1&key2=value2…),将集合M内参数值,拼接成字符串 stringA; 参数中 sign 不参与签名 第三步,在 stringA 的最后拼接上 "&key=商户密钥值",得到字符串 stringB 第四步,对 stringB 进行 SHA256 运算,得到 stringC 第五步,将字符串 stringC 转换为大写,最后得到 签名值 sign */ $key = "e7c359e9146345de86a41a099cacd67f"; $data = [ 'merchantId' => "1654045635701374976", 'merchantOrderId' => $payment->trade_no, 'payCode' => "wgzfbsm", 'amount' => $payment->amount, 'userLocalIp' => "192.178.31.34", 'notifyUrl' => route('invoice'), 'callbackUrl' => route('payment.notify', ['method' => 'bypay']), ]; $str = $this->sortParams($data) . '&key=' . $key; //stringB Log::info("[BYPZ]请求支付接口". var_export($str, true)); $StringC = strtolower($this->sha256($str)); Log::info("[BYPZ]请求支付接口". var_export($StringC, true)); $data['sign'] = strtoupper($StringC); //stringC Log::info("[BYPZ]请求支付接口". var_export($data, true)); $postData = json_encode($data); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, "https://bjzf88.vip/api/unifiedOrder/v2"); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); curl_setopt($curl, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($postData)) ); $res = curl_exec($curl); curl_close($curl); $result = json_decode($res, true); if (!$result) { return Response::json(['status' => 'success', 'url' => "", 'message' => '网络异常!']); } Log::info("[BYPZ]请求支付接口". var_export($result, true)); if ($result["status"] != 200){ return Response::json(['status' => 'fail', 'message' => '创建订单失败!'.$result['error']]); } return Response::json(['status' => 'success', 'url' => $result['data'], 'message' => '创建订单成功!']); } public function notify(Request $request): void { $postData = file_get_contents('php://input'); $result = json_decode($postData,true); Log::info("[BYPZ]回调内容1". var_export($result, true)); $notifyData = [ 'merchantId'=>$result['merchantId'], 'merchantOrderId'=>$result['merchantOrderId'], 'orderId'=>$result['orderId'], 'amount'=>$result['amount'], 'factAmount'=>$result['factAmount'], 'ext'=>$result['ext'], 'state'=>$result['state'], 'sign'=>$result['sign'] ]; if ($this->verifySign($notifyData)){ exit('fail'); } Log::info("[BYPZ]回调内容". var_export($notifyData, true)); if ($this->paymentReceived($notifyData['merchantOrderId']) ) { $this->addPamentCallback($notifyData['merchantOrderId'] ,$notifyData['orderId'] ,""); Log::info('【BYPZ】paymentReceived:'.var_export($request->all(), true)); exit('success'); } } function ASCII($params = array()){ //ksort()对数组按照键名进行升序排序 ksort($params); //reset()内部指针指向数组中的第一个元素 reset($params); $str = http_build_query($params); return $str; } function verifySign($params) { $key = "e7c359e9146345de86a41a099cacd67f"; $sign = $params['sign']; unset($params['sign']); ksort($params); $str = $this->sortParams($params) . '&key='.$key; $StringC = strtolower($this->sha256($str)); if ($sign !== strtoupper($StringC)) { return false; } return $str; // 剃离sign,sign_type,空值 // unset($data['sign'], $data['sign_type'] , $data["method"]); // if ($filter) { // $data = array_filter($data); // } // 排序 // ksort($data, SORT_STRING); // reset($data); // // // $data["key"] = $key; // return strtoupper(md5(urldecode(http_build_query($data)))); } function sortParams($params) { ksort($params); $str = ''; foreach ($params as $key => $value) { $str .= $key . '=' . $value . '&'; } return rtrim($str, '&'); } function sha256($str) { $hash = hash('sha256', $str, true); $encdeStr = bin2hex($hash); return strtolower($encdeStr); } }