佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 詳解Html5微信支付爬坑之路

詳解Html5微信支付爬坑之路

熱門標(biāo)簽:硅谷的囚徒呼叫中心 檢查注冊(cè)表項(xiàng) 阿里云 使用U盤裝系統(tǒng) 智能手機(jī) 網(wǎng)站建設(shè) 美圖手機(jī) 百度競(jìng)價(jià)點(diǎn)擊價(jià)格的計(jì)算公式

前言

在開發(fā)微信公眾號(hào)活動(dòng)中,由于之前沒(méi)有接觸過(guò)與微信相關(guān)的開發(fā),所以導(dǎo)致掉坑,爬坑,不過(guò)也讓我對(duì)微信公眾和微信官方文檔的熟悉大大增加。

爬坑之路

爬坑一:?jiǎn)雾?yè)SPA和后端路由的問(wèn)題

這個(gè)我已經(jīng)單獨(dú)做總結(jié):https://www.jb51.net/article/144341.htm

爬坑二:安卓大概率調(diào)起微信支付失?。ㄒ胛⑿诺膉s-sdk包失?。?/p>

在微信的官方文檔中:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6

有這樣的一個(gè)DEMO:

function onBridgeReady(){
   WeixinJSBridge.invoke(
      'getBrandWCPayRequest', {
         "appId":"wx2421b1c4370ec43b",     //公眾號(hào)名稱,由商戶傳入     
         "timeStamp":"1395712654",         //時(shí)間戳,自1970年以來(lái)的秒數(shù)     
         "nonceStr":"e61463f8efa94090b1f366cccfbbb444", //隨機(jī)串     
         "package":"prepay_id=u802345jgfjsdfgsdg888",     
         "signType":"MD5",         //微信簽名方式:     
         "paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信簽名 
      },
      function(res){
      if(res.err_msg == "get_brand_wcpay_request:ok" ){
      // 使用以上方式判斷前端返回,微信團(tuán)隊(duì)鄭重提示:
            //res.err_msg將在用戶支付成功后返回ok,但并不保證它絕對(duì)可靠。
      } 
   }); 
}
if (typeof WeixinJSBridge == "undefined"){
   if( document.addEventListener ){
       document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
   }else if (document.attachEvent){
       document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
       document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
   }
}else{
   onBridgeReady();
}

在后端同事授權(quán)成功后,在活動(dòng)頁(yè)面頁(yè)面引入這段代碼,開開心心,build 提交 測(cè)試 嗯蘋果沒(méi)問(wèn)題,安卓好像沒(méi)問(wèn)題,然鵝安卓有時(shí)候調(diào)不起支付,開始以為是微信版本的原因,等等其他,但是,調(diào)起成功的概率也太TM低了,10次才能調(diào)起1次,得,肯定是代碼原因了。改吧。

解決思路:

開微信開發(fā)者工具,打log,最后發(fā)現(xiàn)在這一步時(shí)候if (typeof WeixinJSBridge == "undefined")

1.ios能夠調(diào)起微信瀏覽器的js-sdk

2.安卓大部分都走到undefined里面去了

這里其實(shí)我也不太清楚原因。個(gè)人感覺(jué)是微信安卓的內(nèi)置瀏覽器版本和這個(gè) WeixinJSBridge 方法的問(wèn)題。(希望有大神能夠解答一下)

既然js-sdk 調(diào)不起,那就手動(dòng)引入配置吧 //所以有時(shí)候偷懶反而更加麻煩,吸取教訓(xùn)

if (typeof WeixinJSBridge == "undefined"){
    console.log( WeixinJSBridge);
   if( document.addEventListener ){
       document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
   }else if (document.attachEvent){
       document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
       document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
   }
}else{
   onBridgeReady();
}

Vue引入微信js-sdk包

npm i -S weixin-js-sdk

在需要引入的頁(yè)面引入模塊

import wx from 'weixin-js-sdk'

配置(參考微信官方文檔:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115):

wx.config({
    debug: true, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來(lái),若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會(huì)通過(guò)log打出,僅在pc端時(shí)才會(huì)打印。
    appId: '', // 必填,公眾號(hào)的唯一標(biāo)識(shí)
    timestamp: , // 必填,生成簽名的時(shí)間戳
    nonceStr: '', // 必填,生成簽名的隨機(jī)串
    signature: '',// 必填,簽名
    jsApiList: [] // 必填,需要使用的JS接口列表 比如我要調(diào)用支付接口 那么就是 [chooseWXPay]
});

這里timestamp是小寫 s 是小寫,數(shù)據(jù)類型是 int 類型

接下來(lái)既然配置成功了,那就繼續(xù)看官方文檔

在官方文檔是這么說(shuō)的,有個(gè)ready的方法,在config驗(yàn)證成功之后,把接口放在里面確保執(zhí)行。

wx.ready(function(){
    // config信息驗(yàn)證后會(huì)執(zhí)行ready方法,所有接口調(diào)用都必須在config接口獲得結(jié)果之后,config是一個(gè)客戶端的異步操作,所以如果需要在頁(yè)面加載時(shí)就調(diào)用相關(guān)接口,則須把相關(guān)接口放在ready函數(shù)中調(diào)用來(lái)確保正確執(zhí)行。對(duì)于用戶觸發(fā)時(shí)才調(diào)用的接口,則可以直接調(diào)用,不需要放在ready函數(shù)中。
});

ready里面的引入?yún)?shù)(注意數(shù)據(jù)類型,和后端同事好好配合- -)

wx.chooseWXPay({
timestamp: 0, // 支付簽名時(shí)間戳,注意微信jssdk中的所有使用timestamp字段均為小寫。但最新版的支付后臺(tái)生成簽名使用的timeStamp字段名需大寫其中的S字符
nonceStr: '', // 支付簽名隨機(jī)串,不長(zhǎng)于 32 位
package: '', // 統(tǒng)一支付接口返回的prepay_id參數(shù)值,提交格式如:prepay_id=\*\*\*)
signType: '', // 簽名方式,默認(rèn)為'SHA1',使用新版支付需傳入'MD5'
paySign: '', // 支付簽名
success: function (res) {
// 支付成功后的回調(diào)函數(shù)
}
});

附上本人的demo

在ready里面使用Vue data中的數(shù)據(jù),一不小心掉到this指向的坑,如果不加bind,wx.chooseWXPay里面的參數(shù)是拿不到從后端請(qǐng)求回來(lái)的數(shù)據(jù)的,這里的this并不是指向VueComponent,自然無(wú)法獲取請(qǐng)求后我賦值給this.wx_config這個(gè)數(shù)組對(duì)象的數(shù)據(jù)。

getConfig(){
            wx.config({
                debug: this.wx_config.debug, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來(lái),若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會(huì)通過(guò)log打出,僅在pc端時(shí)才會(huì)打印。
                appId: this.wx_config.appId, // 必填,公眾號(hào)的唯一標(biāo)識(shí)
                timestamp: this.wx_config.timestamp, // 必填,生成簽名的時(shí)間戳
                nonceStr: this.wx_config.nonceStr, // 必填,生成簽名的隨機(jī)串
                signature:this.wx_config.signature,// 必填,簽名
                jsApiList: this.wx_config.jsApiList // 必填,需要使用的JS接口列表
            });
            //微信支付
            wx.ready(function() {
                // console.log(this.jsApiCall());
                wx.chooseWXPay({
                    timestamp: this.wechat_code.timestamp,
                    nonceStr:this.wechat_code.nonceStr,
                    package: this.wechat_code.package,
                    signType: this.wechat_code.signType,
                    paySign: this.wechat_code.paySign,
                    success: function () {
                        // 支付成功后的回調(diào)函數(shù)
                        alert("支付成功");
                        window.location.href = "/hd/becomevip";
                    },
                    cancel: function() {
                        alert("支付失敗");
                    }
                });
            }.bind(this));
        },

總結(jié):

踩坑總是難免的,總結(jié),還有不要因?yàn)榕侣闊┒蝗プ稣_的事~

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:賀州 山南 通遼 黃山 湖北 懷化 煙臺(tái) 湘潭

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解Html5微信支付爬坑之路》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    旅游| 鄂托克前旗| 曲松县| 平原县| 长泰县| 竹溪县| 庐江县| 周至县| 武夷山市| 芮城县| 永胜县| 雷波县| 石嘴山市| 蒲江县| 察哈| 镇赉县| 新巴尔虎右旗| 房产| 荃湾区| 时尚| 重庆市| 南投县| 青神县| 浏阳市| 昌乐县| 樟树市| 伊金霍洛旗| 宿松县| 论坛| 宁津县| 瓦房店市| 剑河县| 南江县| 黑龙江省| 兴山县| 安多县| 正蓝旗| 勃利县| 新郑市| 江津市| 永川市|