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