php微信支付分開發 免押

寫在前面

先說一下這個版本 是V1.3的, 2020.03.15日更新版本   以前曾經作過一個支付分V1.0的。 v1.0和v1.3已是大不同了  ,因此若是你在作這個話看好版本,別讓我帶跑偏。html

前期準備

看到這篇文章,相信你已經作好了前期的準備工做,包括已經開通了微信支付分 ,向騰訊的商務提交了相關的文檔 得到了 屬於你本身的微信支付 service_id git

代碼編寫

微信支付分提供了比較詳盡的文檔  此次開發 也要接觸到他 api-v3 接口規則json

上個官方文檔接口api

     微信支付分文檔地址:   https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/payscore/chapter1_1.shtml微信

      api-v3規則文檔:           https://wechatpay-api.gitbook.io/wechatpay-api-v3/  app

固然了這個地址可能後面會有變動  那你就去百度找一下吧composer

   首先我們最重要的是建立微信支付分訂單   不說了 直接上代碼curl

 1 public function zhiFen($order0no='', $ya_money=2)
 2     {
 3         $url = "https://api.mch.weixin.qq.com/v3/payscore/serviceorder";
 4         $json = [ // JSON請求體
 5             'out_order_no' => $order0no,//訂單號
 6             'appid' => '',
 7             'service_id' => '',
 8             'service_introduction' => '陪護寶使用租金',
 9             'time_range' => ['start_time' => 'OnAccept'],
10             'risk_fund' => ['name' => 'DEPOSIT', 'amount' => 2],
11             'notify_url' => url('index', '', false, true),
12             'need_user_confirm' => true,
13         ];
14 
15         $arr_header[] = "Content-Type: application/json";
16         $arr_header[] = "Accept: application/json";
17         $arr_header[] = "User-Agent: " . $_SERVER['HTTP_USER_AGENT'];
18 
19         $http_method = 'POST';
20         $timestamp = time();
21         $nonce = $this->str_rand(32);
22         $body = json_encode($json, true);
23         $merchant_id = '';  //商戶號
24         $serial_no = '';       //這個是證書號  這個必須使用新版證書
25 
26         $url_parts = parse_url($url);
27         $path = APP_PATH . 'cert/';
28         $mch_private_key = PemUtil::loadPrivateKey($path . 'apiclient_key.pem');
29 
30         $canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
31         $message = $http_method . "\n" .
32             $canonical_url . "\n" .
33             $timestamp . "\n" .
34             $nonce . "\n" .
35             $body . "\n";
36 
37         openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');
38         $sign = base64_encode($raw_sign);
39 
40         $schema = 'WECHATPAY2-SHA256-RSA2048 ';
41         $token = sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',
42             $merchant_id, $nonce, $timestamp, $serial_no, $sign);
43         //這個是生成認證參數  並加到請求頭中
44         $arr_header[] = "Authorization:" . $schema . $token;
45         $res = $this->https_request($url, json_encode($json), $arr_header);
46         $res_arr = json_decode($res, true);
47         $sign_type = "HMAC-SHA256";//HMAC-SHA256簽名方式
48         $key = "hHezylOkgatMqYKrVeQthR4qfGvyOebD";
49         $res_arr['timestamp'] = $timestamp;
50         $res_arr['nonce_str'] = $nonce;
51         $res_arr['sign_type'] = $sign_type;
52 
53         $res_arr['sign'] = bc_sign([
54             'mch_id'=>$merchant_id,
55             'package'=>$res_arr['package'],
56             'timestamp'=>$timestamp,
57             'nonce_str'=>$nonce,
58             'sign_type'=>$sign_type,
59         ],$key);
60         $this->success('', $res_arr);
61     }
62 
63     //生成隨機字符串
64     public function str_rand($length = 32, $char = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')
65     {
66         if (!is_int($length) || $length < 0) {
67             return false;
68         }
69         $string = '';
70         for ($i = $length; $i > 0; $i--) {
71             $string .= $char[mt_rand(0, strlen($char) - 1)];
72         }
73 
74         return $string;
75     }
76 
77     //請求方法    
78     private function https_request($url, $data = null, $arr_header = [])
79     {
80         $curl = curl_init();
81         //curl_setopt ( $curl, CURLOPT_SAFE_UPLOAD, false);
82         curl_setopt($curl, CURLOPT_URL, $url);
83         curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
84         curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
85         if (!empty ($data)) {
86             curl_setopt($curl, CURLOPT_POST, 1);
87             curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
88         }
89 
90         if (!empty($arr_header)) {
91             curl_setopt($curl, CURLOPT_HTTPHEADER, $arr_header);
92         }
93 
94         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
95         $output = curl_exec($curl);
96         curl_close($curl);
97         return $output;
98     }
99     

          這個就是這個的請求方法   生成簽名的這個應該封裝一下   這裏爲了更好的展示  我就沒有封裝  ,  其實微信官方提供了一個composer封裝的方法  可是我麼有用   用的這種簡單粗暴的方法 微信支付

經過這個請求this

相關文章
相關標籤/搜索