摘要:在用開發微信支付的時候,遇到了很多坑,我也對朋友說過,一步一坑。在安卓手機上也能回調出錯誤信息。需要引用,也需要使用,而且在安卓手機上面的提示特別不友好。結語微信支付文檔說實話真的很坑很坑。
在用JSAPI開發微信支付的時候,遇到了很多坑,我也對朋友說過,一步一坑。最后終于算是走出來了。期間翻閱過很多網友寫的教程,但是都不實用,JAVA,Python都有看過,大多數都是復制粘貼,倍感失望。
開發環境thinkphp5.0 php
(開始使用JSAPI需要一個概念,就是在整個JSAPI的邏輯里面,只存在一個隨機字符串 和一個 時間戳。相當于JSAPI類里的全局。)
注意:由于我這里用的http_build_query()body里面的中文會被格式化,所以這里先建議body使用非中文,至于中文解決,可以用正則去替換,或者不用http_build_query()
開始開發 全局初始化public function __construct($total_fee, $body, $openid) { $rand = rand(11, 99); $mp_info = get_mpid_info();//獲取微信信息 $this->appid = $mp_info["appid"]; $this->nonce_str = nonceStr(32); $this->spbill_create_ip = Request::instance()->ip(); $this->mch_id = $mp_info["mch_id"]; $this->key = $mp_info["paykey"]; $this->timestamp = time(); $this->sign;//一次簽名 $this->total_fee = $total_fee; $this->out_trade_no = time() . $rand; $this->notify_url = "http://uedream.cn/index.php"; $this->body = $body; $this->openid = $openid; $this->sign_type = "MD5"; $this->createsign(); //生成簽名方法,需要結合createsign方法 }
以上是初始化簽名結構體
獲取簽名文檔:https://pay.weixin.qq.com/wik...
public function createsign() { $build = [ "appid" => $this->appid, "body" => $this->body, "mch_id" => $this->mch_id, "nonce_str" => $this->nonce_str, "notify_url" => $this->notify_url, "openid" => $this->openid, "out_trade_no" => $this->out_trade_no, "sign_type" => $this->sign_type, "spbill_create_ip" => $this->spbill_create_ip, "timeStamp" => $this->timestamp, "total_fee" => $this->total_fee, "trade_type" => $this->trade_type, "key" => $this->key, ]; $string = http_build_query($build); $string = str_replace("%2F", "/", $string); //格式化網址 $string = str_replace("%3A", ":", $string); //格式化網址 $md5 = md5($string); $this->sign = strtoupper($md5); }統一下單
文檔:https://pay.weixin.qq.com/wik...
public function unifiedorder() { $data = [ "appid" => $this->appid, "body" => $this->body, "mch_id" => $this->mch_id, "nonce_str" => $this->nonce_str, "notify_url" => $this->notify_url, "openid" => $this->openid, "out_trade_no" => $this->out_trade_no, "sign" => $this->sign, "sign_type" => "MD5", "spbill_create_ip" => $this->spbill_create_ip, "timeStamp" => $this->timestamp, "total_fee" => $this->total_fee * 1, "trade_type" => $this->trade_type, ]; $xml = arrayToXml($data); $result = http_post(self::UNIFIEDORDER, $xml); $return = xmlToArray($result); $this->package = "prepay_id=" . $return["prepay_id"]; $this->renCreatesign();//這是二次簽名。文檔里面我是沒有看到,反正我是卡到這里了。 $returns = [ "appid" => $this->appid, "noncestr" => $this->nonce_str, "signtype" => $this->sign_type, "package" => $this->package, "sign" => $this->resign, "timestamp" => $this->timestamp, ]; return $returns; }
統一下單請忽略的所有的回調參數,只要prepay_id,其它的參數暫時看做障眼法,獲取到了統一下單,還需要進行二次簽名,上面代碼里面有一個$this->renCreatesign(),就是調用的二次簽名方法
二次簽名文檔:https://pay.weixin.qq.com/wik...
所謂的二次簽名就是,appId,nonceStr,package,signType,timeStamp,key的加密。一樣的簽名方式,可以參考簽名文檔,進行簽名。(上面參數已經按照ASCII進行排序,大小寫也請按照給出的進行加密)
注意: package格式為prepay_id=xxxxxxxxxxxx。xxxx部分為統一下單獲取的prepay_id
代碼參考:
public function renCreatesign() { $build_data = [ "appId" => $this->appid, "nonceStr" => $this->nonce_str, "package" => $this->package, "signType" => $this->sign_type, "timeStamp" => $this->timestamp, "key" => $this->key, ]; $result = http_build_query($build_data); $put_data = str_replace("%3D", "=", $result); //格式化網址 $signatrue = md5($put_data); $this->resign = strtoupper($signatrue); }
至此,所有的簽名應經完成,控制器使用unifiedorder()進行參數獲取。
前端這里開始使用jsapi做支付動作
WeixinJSBridge.invoke( "getBrandWCPayRequest", { appId: res.appid, //公眾號名稱,由商戶傳入 timeStamp: res.timeStamp, //時間戳,自1970年以來的秒數 nonceStr: res.nonce_str, //隨機串 package: res.package, signType: res.signType, //微信簽名方式: paySign: res.sign //微信簽名 }, function(res) { alert(JSON.stringify(res)); if (res.err_msg == "get_brand_wcpay_request:ok") { // 使用以上方式判斷前端返回,微信團隊鄭重提示: //res.err_msg將在用戶支付成功后返回ok,但并不保證它絕對可靠。 } } );
前端所有需要調用的參數均在unifiedorder()可以獲取到。
這里提一下WeixinJSBridge.invoke與wx.chooseWXPay 的區別。WeixinJSBridge.invoke可以不用引用weixinjs便可使用,也不需要config。在安卓手機上也能回調出錯誤信息。wx.chooseWXPay需要引用weixinjs,也需要使用config,而且在安卓手機上面的提示特別不友好。
結語微信支付文檔說實話真的很坑 很坑。貌似寫文檔的小哥這天情緒不好。寫出來的讓人也感覺到了情緒不好。以上為本人切身操作寫出的教程。如還有補充的地方可以隨時留言評論。
彩蛋文檔:https://github.com/datalinkag...
下載地址:
composer require datalinkage/wxpay
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29909.html
微信支付本身是提供了三大Web開發語言的SDK下載的,按理說應該很Easy怎么會有坑呢?其實坑大多出在文檔上,文檔不完善,很多東西都得你去摔一跤才明白,事先絕不告訴你,整個微信的文檔都跟屎一樣其次是參數命名,一會兒要用timeStamp一會兒卻又要用timestamp的,命名混亂就算了還非得區分大小寫,百度一下就知道坑過多少人了 這些都忍了,跌跌撞撞也就過來了。但最近做支付又遇到兩個大坑。經過數小...
摘要:那么有微信支付的能力嗎以上就是能力,可以做掃碼支付,例如我上面的,還可以做支付,也就是在微信里面訪問的頁面,點擊按鈕發起支付的方式,還有一個能力就是支持個人微信小程序的,個人微信小程序無需認證也可以使用支付接口實現。 個人微信支付寶免簽約支付解決方案 https://www.likeyunba.com/pay/ 我們知道要想使用微信支付,要具備以下條件 1、申請服務號2、要有企業資料(...
摘要:微信支付方式付款碼支付適用于線下場所支付支付是指商戶通過調用微信支付提供的接口,在支付場景中調起微信支付模塊完成收款。主要用于觸屏版的手機瀏覽器請求微信支付的場景。可以方便的從外部瀏覽器喚起微信支付。 微信支付方式(https://pay.weixin.qq.com/sta...): 1、付款碼支付————————適用于線下場所 2、JSAPI支付————————JSAPI支付是指商戶...
摘要:今天聊一下微信公眾號開發在授權網頁中的支付流程。前端獲得簽名后,再請求微信服務器,下面的支付流程就可以繼續下去了。 今天聊一下微信公眾號開發在授權網頁中的支付流程。 微型公眾號開發有以下幾個步驟:1.獲取全局access_token2.獲取網頁授權的access_token和refresh_token3.獲取網頁授權的簽名(前端用于獲取調用JSSDK的權限)4.公眾號支付-調用統一下單...
閱讀 3208·2021-11-08 13:18
閱讀 1363·2021-10-09 09:57
閱讀 1193·2021-09-22 15:33
閱讀 3985·2021-08-17 10:12
閱讀 5073·2021-08-16 11:02
閱讀 2689·2019-08-30 10:56
閱讀 971·2019-08-29 18:31
閱讀 3259·2019-08-29 16:30