123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- <?php
- namespace App\Http\Controllers\Gateway;
- use App\Models\Payment;
- use Auth;
- use Illuminate\Http\JsonResponse;
- use Illuminate\Http\Request;
- use Response;
- use Illuminate\Support\Facades\Http;
- use Illuminate\Support\Facades\Log;
- class bypay extends AbstractPayment
- {
- public function purchase(Request $request): JsonResponse
- {
- $payment = $this->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);
- }
- }
|