Cordova - 徹底搞定安卓中的微信支付外掛!
Cordova:8.0.0
Android studio:3.2.1
你看到這個標題肯定會驚訝,一個Cordova的微信支付外掛,有這麼誇張嗎?
一,不要使用的微信支付外掛:https://github.com/xu-li/cordova-plugin-wechat
上面的外掛,是目前大家在網上搜索文章時候,推薦最多的外掛,但是,外掛開發者,已經不再維護這個外掛了,從最新版外掛的程式碼看,確實是那樣,其中從2.1.0開始的bug,到了最終的2.3.0也沒有修復,而且還增加了bug!如果真的想使用上面這個外掛,而且你沒有能力去修改bug,我強烈建議你使用2.1.0版本,安裝命令如下:
[email protected]2.1.0 --variable wechatappid=你的微信appid
下面是這個外掛的bug列表,以及修復方法:一共3個bug!
1,微信支付類安裝路徑錯誤。這個外掛在安裝時候,把微信支付類安裝到了錯誤路徑下。當你安裝這個外掛之後,你會發現在"你的工程目錄platforms\android"下有一個"src"資料夾,這個資料夾正常是不應該存在的,如果有是因為這個外掛安裝JS的bug導致的!這個bug從2.0.0開始,一直到2.3.0都沒有修復!!
修復方法1:修改安裝外掛安裝JS檔案。
開啟檔案“你的工程目錄\plugins\cordova-plugin-adam-wechat\scripts\android-install.js”,在44行左右,找到“targetFiles = ["EntryActivity.java", "WXEntryActivity.java", "WXPayEntryActivity.java"];”這行程式碼,把它上面的程式碼修改為:
var targetDir = path.join(projectRoot, "platforms", "android", "app","src","main","java", packageName.replace(/./g, path.sep), "wxapi");
修復方法2:不用修改此檔案,直接拷貝用到的微信支付類到正確的包下。這根據你的工程名稱決定了,假設現在工程的包結構為:“com.sunylat.test”,那麼就應該把安裝到上面錯誤目錄中的"wxapi"目錄,直接拷貝到“你的工程目錄\platforms\android\app\src\main\java\com\sunylat”。
2,JAVA類方法使用錯誤。Wechat.java中,有兩處低階的JAVA程式設計錯誤,當編譯的時候,會發現2.3.0,這個類中,有兩個編譯錯誤。
錯誤1:方法使用不當,使用的方法沒有輸入引數,而錯誤處加入了輸入引數。這個錯誤,因為不瞭解程式的詳細細節,暫時無法給出修復建議。
錯誤2:在靜態類中,使用非靜態類的欄位。這個錯誤,把"static"修飾符去掉就可以了。
對於一款這樣的外掛,無論從那個角度,我都不建議你繼續使用了!!!
二,推薦使用的微信支付外掛:
https://github.com/adam198824/cordova-plugin-wechat
這個外掛,已經修復上面外掛的所有錯誤!!我正在使用這個外掛,而且測試完畢,在安卓和IOS下都工作正常,所以我推薦這個微信支付外掛!此外掛作者不僅維護這個外掛,還維護著支付寶外掛,感謝adam198824!!!
三,如何能夠使用“adam-wechat”外掛?
“adam-wechat”外掛就是上面我途徑的差距,是“wechat”外掛的一個分支,修復了最後一個版本以及先前版本“wechat”外掛的的已知bug,上面我提到的3個bug!!僅僅知道這個外掛確實可以使用,可能還不行,因為我們開發程式,不可能直接就寫程式碼,隨後測試都不做,就釋出了,那麼怎麼能夠完成這個程式的測試過程?你真的耐心看下去!
(一)測試APP的準備工作:
1,微信支付介面準備。
A,必須通過騰訊公司稽核,拿到微信支付appid。
B,生成微信支付介面提交資料的工作已經完成,給微信支付介面提交資料前,必須生成對應的支付資料,隨後向微信支付介面提交這些資料,才能支付。
C,下載騰訊公司提供的簽名生成工具,下載後,安裝到測試手機中,等要測試手機APP時候,生成新增到騰訊微信支付介面驗證簽名的對應處。
工具下載:https://res.wx.qq.com/open/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
2,安裝“adam-wechat”外掛。執行安裝命令:
cordova plugin add cordova-plugin-adam-wechat --variable wechatappid=你的微信APPID
(二)編寫cordova程式中的程式碼:
1,最好每次都能夠獲取動態生成的支付資料。這一點非常重要,我幾乎除錯了一個晚上,驗證了這一點!微信支付介面,對於提交的資料是有時效性的,並不是所有已經生成的資料,不管間隔多長時間都能夠繼續提交!所以,如果能夠每次都獲取到要支付的資料,那麼你最好是先做這個工作,否則,間隔時間長了,資料失效,那麼提交肯定失敗,而且,所報錯誤並不是軟體本身引起的,極容易讓大家誤認為軟體本身有bug!!
2,客戶端資料的格式:客戶端提交的資料是JSON資料,在客戶端生成一個標準JSON物件,隨後新增進所有需要提交引數就可以了,下面我給出了正確的程式碼,如果你按照我寫程式碼編寫你的程式,那麼我覺得肯定可以!
//從生成微信支付資料伺服器返回的JSON字串
var responseText = "你從伺服器返回的JSON資料";
//解析伺服器返回JSON字串為JS物件
var responseObj = JSON.parse(responseText);
//解析微信支付需要的各個引數的物件
var objObject = responseObj.包含提交資料的JSON物件;
/* 注意問題:如果想真正使用,那麼這些引數肯定要動態生成,在除錯時候,最好就是動態獲取,否則肯定讓你鬱悶死, 因為這些提交的引數,是有時效性的,不是一直有效,如果超過時效,提交會失敗,你會誤以為外掛有bug,其實不是。 */ //宣告提交引數JSON物件 var params = {}; //加入要提交的各個引數 //注意:這個引數必須有,否則會導致引數格式不正確的錯誤,支付外掛對比本地儲存的appid後,決定是否儲存到欄位。 params["appid"] = objObject.appid; params["partnerid"] = objObject.partnerid; params["prepayid"] = objObject.prepayid; params["noncestr"] = objObject.noncestr; params["timestamp"] = objObject.timestamp; params["sign"] = objObject.sign; //呼叫微信支付外掛,向微信支付發起支付操作
Wechat.sendPaymentRequest(params, function () { alert("Success"); }, function (reason) { alert("Failed: " + reason); });
上述程式碼是對“adam-wechat”外掛,完整可正確執行的微信支付程式碼,本人測試完畢、正在使用的程式碼!
(三)用Android Studio給安卓程式簽名。無論你的程式是debug還是release版本,均可以測試微信支付介面,但是都需要進行簽名,否則無法呼叫微信支付介面。
安卓程式簽名,可以使用Android studio,也可以採用命令列工具簽名,我採用的是Android studio簽名。對於微信支付介面呼叫,無論你採用keystore還是jks檔案方式簽名,都可以!!網上有些介紹說必須keystore方式簽名,並非那樣,最終你測試一下就知道了!
官方說明:https://developer.android.com/studio/publish/app-signing
A,生成簽名需要檔案。
//
B,使用Android studio給安卓APP簽名過程:
1,開啟Cordova安卓工程:點選Android studio的選單,“File”->"Open",隨後選擇你建立的Cordova工程,選擇裡面的“android”。
2,開啟簽名配置對話方塊。在“android”工程名上滑鼠右鍵,“Open Moudle settings”。
3,選中對話方塊左側的“app”模組名稱,隨後點選“Signing”tab頁,點選"+",隨後輸入對應資訊。
name:隨意起,一會發布程式簽名用。
key Alias:生成簽名檔案時候對應值。
key password:生成簽名檔案時候對應值。
store file:生成的簽名檔案,Android studio生成為jks副檔名檔案。
store password:生成簽名檔案時候對應值。
當上面所有值填寫正確之後,點選“Build types”tab頁。
4,配置debug和release版本APP的簽名。給哪個版本APP配置簽名,就先選擇左側的哪個專案,隨後右面選擇主要是兩項:
A,“Signing config”,點選這個下拉列表,選擇剛才填寫的簽名配置資訊名稱。
B,“Debugable”,這個決定程式在這個版本是否可以除錯,如果是測試階段,建議選中。
隨後點選“OK”按鈕,完成debug和release版本的簽名配置,以後在生成不同版本軟體時候,都會給生成軟體自動簽名。
C,選擇生成APP版本。
1,點選Android Studio左側的“Build variants”。
2,點選“app”後面對應的下拉列表,選擇debug或release,編譯後就會生成對應版本的APP。
(四)向騰訊公司網站提供測試APP的簽名串。如果你沒有使用騰訊公司提供的獲取測試APP簽名串工具,獲取測試程式的簽名串,並且上傳到騰訊公司網站中,那麼也應該測試不了微信支付!
//
(五)常見錯誤:
1,app沒有簽名。如果沒有簽名,肯定測試不了微信支付,上面已經介紹瞭如何用AS簽名,無論debug還是realease版本,簽名後,都可以測試微信支付介面。
2,提交資料格式不正確。參照我上面程式碼,就會避免這個問題。如果資料格式不正確,提交支付請求後,會返回資料格式不正確的錯誤。
3,提交資料引數不符。執行程式後,直接會反饋這類錯誤提示。
4,測試資料失效。如果測試資料是很久之前生成的,那麼很有可能發生此類錯誤,而且此類錯誤非常讓大家誤以為是自己編寫程式或外掛的bug,如果測試時候,提交的測試資料都是動態生成的,可以避免此類問題!
5,沒有在微信支付介面管理網站登記測試APP。測試的APP,必須使用騰訊公司提供的獲取APP簽名工具,得到簽名字串之後,進入騰訊公司微信支付管理網站,把安卓對應部分的簽名串修改成你在手機裡獲取到的簽名串,否則測試也不能通過。