先說一下這個版本 是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