這篇文章帶給大家的內容是關於微信小程式支付的流程問題解析(程式碼解析),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
這幾天在做小程式的支付,沒有用官方的SDK,這裡就純用官方的文檔搞一發。
* 註:使用的PHP,不過支付流程都是這樣
#開發前必讀
主要流程
小程式前端傳送求參請求
- 接受請求封裝「統一下單」 取得
package
小程式接受「統一下單」 取得的 package
wx.requestPayment
發起付款請求##準備工具
申請小程式微信支付
拿到小程式微信支付的商家號碼及設定秘鑰
# 注意:小程式就只需要這兩步,如果是web的話還需要設定支付目錄授權域名,文檔裡面也有寫的:https://pay.weixin.qq.com/wik..統一下單官方文件:https://pay.weixin.qq.com/wik...
/** * 统一订单 */ public function unifiedorder(){ // 以下配置是必填项,如有其它需求请自行配置 $config = array( 'appid' => 'xxxxxxx',//这里是小程序appid 'mch_id' => 'xxxxxxx',//商户ID 'nonce_str' => $this->getNonceStr(),//随机字符串 'body' => '这里是测试 - 测试',//请按照文档要求填写合格名称 'out_trade_no' => time().$this->getNonceStr(2),//流水单号 'total_fee' => '20',//金额,分为单位,这里是0.2元 'spbill_create_ip' => '123.123.123.123',//当前IP 'notify_url' => 'http://xxxx.com',//请恕我愚昧,我没搞懂他有什么用 'trade_type' => 'JSAPI',//必须填写JSAPI 'openid' => 'xxxxxxxx'//当前用户的openid,在trade_type=JSAPI的时候,此项就变成必填项了 ); $config['sign'] = $this->getSignPay($config); $xmlData = $this->ToXml($config);//转成xml数据 $postData = $this->http_post($xmlData); $arrayData = $this->FromXml($postData); if($arrayData['return_code'] == 'SUCCESS' || $arrayData['result_code'] == 'SUCCESS'){ return $arrayData['prepay_id'];//重点来了:走了这么多路,就为了这个值。到这一步就证明成功一多半了。 }else{ return $arrayData;//返回错误 } } /** * 获取签名 */ public function getSignPay($config){ $key = 'xxxxxxx';//商户秘钥,就是自己生成的32位密码 $strA = 'appid='.$config['appid'].'&body='.$config['body'].'&mch_id='.$config['mch_id'].'&nonce_str='.$config['nonce_str'].'¬ify_url='.$config['notify_url'].'&spbill_create_ip'.$config['spbill_create_ip'].'&total_fee='.$config['total_fee'].'&trade_type='.$config['trade_type'];//ASCII 字典序 $strB = $strA.'&key='.$key; $sign = strtoupper(md5($strB));//大写MD5 return $sign; } /** * 随机字符串 32位 */ public function getNonceStr($length = 32){ $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str =""; for ( $i = 0; $i "; foreach ($data as $key=>$val){ $xml.="".$val."".$key.">"; } $xml.=""; return $xml; } /** * xml转array */ public function FromXml($xml){ if(!$xml){ throw new WxPayException("xml数据异常!"); } libxml_disable_entity_loader(true); $this->values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $this->values; } /** * post 请求 */ public function http_post($url,$param,$post_file=false){ $oCurl = curl_init(); if(stripos($url,"https://")!==FALSE){ curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1 } if (PHP_VERSION_ID >= 50500 && class_exists('\CURLFile')) { $is_curlFile = true; } else { $is_curlFile = false; if (defined('CURLOPT_SAFE_UPLOAD')) { curl_setopt($oCurl, CURLOPT_SAFE_UPLOAD, false); } } if (is_string($param)) { $strPOST = $param; }elseif($post_file) { if($is_curlFile) { foreach ($param as $key => $val) { if (substr($val, 0, 1) == '@') { } } } $strPOST = $param; } else { $aPOST = array(); foreach($param as $key=>$val){ $aPOST[] = $key."=".urlencode($val); } $strPOST = join("&", $aPOST); } curl_setopt($oCurl, CURLOPT_URL, $url); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($oCurl, CURLOPT_POST,true); curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if(intval($aStatus["http_code"])==200){ return $sContent; }else{ return false; } }
好了現在已經取得到了
prepay_id的值,我們的統一下單就算完成了,其實我更樂意叫他資料封
小程式微信支付
官方文件:https://developers .weixin.qq....
先來一個插曲,首先我們小程式的前端需要去觸發pay,實現的功能肯定是要點擊小程式的一個觸發,然後才能支付對吧,
pay:function(e){ //这里面使用post去请求。然后通过我接下来要写的API支付代码获取小程序支付参数 success:function(res){ wx.requestPayment({ 'timeStamp':toString(res.timeStamp),//这里转字符串,这里被坑过,不转的话可能会出现total_fee为空 'nonceStr':toString(res.nonceStr), 'package':toString(res.package), 'signType':'MD5', 'paySign':toString(res.paySign), success:function(res){ console.log(res);//这里可以跳转到带参地址 }, fail:function(res){ console.info('支付失败',res); }, complete:function(){ console.info('支付触发回调',res); } }) } }
api支付
也就是上面小程式碼的後端請求地址
/** * api组装数据 */ public function payApiBlack(){ $appid = 'xxxxxx';//小程序appid,上面有重复,不过这样比较直观 $timeStamp = time(); $nonceStr = $this->getNonceStr();//这是调用统一下单里面的方法,为了直观,我把这些代码都写在了一个类里 $package = 'prepay_id='.$this->unifiedorder(); $signType = 'MD5'; $key = 'xxxxxx';//这里是商户秘钥,32位,同上面也有 $strA = 'appId='.$appid.'&nonceStr='.$nonceStr.'package='.$package.'&= signType='.$signType.'&timeStamp='.$timeStamp.'&key='.$key; $paySign = strtoupper(md5($strA)); $data = array( 'appid'=>$appid, 'timeStamp'=>$timeStamp, 'nonceStr'=>$nonceStr, 'package'=>$package, 'signType'=>$signType ); return $data;//返回给小程序 }
以上就是全部程式碼,還有小程式的支付回呼沒有什麼訊息,所以,我的思路判斷success後進行跳轉帶參
//此代码为wx.requestPayment success,部分代码省略 //res 回调参数包括用户uid及其他重要传递 success:function(res){ wx.redirect({ url:'pages/pay/done?uid='+res.uid }) }
當然那個統一下單的notify_url 好像與回調有關,至於怎麼用,試了幾次回調的CURD都沒反應,所以有空再研究啦。
以上是微信小程式支付的流程問題解析(程式碼解析)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具