Cordova:8.0.0
Android studio:3.2.1
cordova-plugin-adam-wechat : 3.0.6
你看到這個標題肯定會驚訝,一個Cordova的微信支付插件,有這么誇張嗎?
一,不要使用的微信支付插件:https://github.com/xu-li/cordova-plugin-wechat
上面的插件,是目前大家在網上搜索文章時候,推薦最多的插件,但是,插件開發者,已經不再維護這個插件了,從最新版插件的代碼看,確實是那樣,其中從2.0.0開始的bug,到了最終的2.3.0也沒有修復,而且還增加了bug!如果真的想使用上面這個插件,而且你沒有能力去修改bug,我強烈建議你使用2.1.0版本,安裝命令如下:
cordova-plugin-wechat@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
安裝命令:
cordova-plugin-adam-wechat --variable wechatappid=你的APPID
這個插件,已經修復上面插件的所有錯誤!!我正在使用這個插件,而且測試完畢,在安卓和IOS下都工作正常,所以我推薦這個微信支付插件!此插件作者不僅維護這個插件,還維護着支付寶插件,感謝adam198824!!!
三,決定使用“adam-wechat”插件后,如何能夠順利測試我們的APP?
“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!!我在測試時候,有一個錯誤就是因為數據失效造成的,而我誤以為是插件本身有bug,隨后進入JAVA類里面,設置斷點、修改源代碼,各種方式調試、驗證,最終發現原來是我測試數據失效造成的!!目前,這個插件的代碼,我暫時沒有發現什么bug,應該可以放心使用,如果出現問題,那么應該是其它方面的,並不是插件bug造成的!
2,客戶端數據的格式:客戶端提交的數據是JSON數據,在客戶端生成一個標准JSON對象,隨后添加進所有需要提交參數就可以了,下面我給出了正確的代碼,如果你按照我寫代碼編寫你的程序,那么我覺得肯定可以!
下面代碼是我在JQuery mobile中的代碼:
//從生成微信支付數據服務器返回的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,生成簽名需要文件。
1,點擊Android studio的菜單,“Build”->"Genertate Signed Bundle/APK",打開生成簽名文件對話框。
2,選中“APK”單選按鈕,隨后點擊“Next”按鈕。
3,點擊”Create new..."按鈕,填寫必要信息后,點擊”OK“按鈕。
4,選中"Remember passwords"復選框,隨后點擊”Next“按鈕。
5,點擊”Build Type“下拉列表,選擇對那種編譯類型文件簽名;選中”V2 (Full APK Signature)“,對整個APK簽名,隨后點擊”Finish“按鈕,這樣生成簽名文件就完成了。
B,使用Android studio給安卓APP簽名過程。AS給APP簽名,有兩種方式,一種是編譯程序時候,自動加上簽名,就是我下面介紹的簽名方式,還有一種是單獨簽名,上面的“生成簽名需要文件”,有一步,可以完成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簽名串工具,獲取測試程序的簽名串,並且上傳到騰訊公司網站中,那么也應該測試不了微信支付!
A,從安裝了測試APP的手機里獲取簽名串。如果沒有安裝騰訊獲取簽名串工具,那么應該把它安裝到已經安裝了測試APP手機中,獲取簽名串,就靠這個工具。
工具下載:https://res.wx.qq.com/open/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
打開簽名串獲取工具,隨后輸入你測試程序的倒域名,隨后點擊”Get Sinature“按鈕,你會看到一行字符串,那就是要加入到騰訊網站中的簽字串,把它記錄下來。
B,登錄騰訊網站,修改APP信息。
1,進入騰訊管理網站。
打開上面網站,隨后點擊上面右側的”登錄“按鈕,在彈出對話框中輸入賬號和密碼后,點擊此對話框中的”登錄“按鈕后,進入這個網站。
2,點擊"修改",進入修改頁面。
3,選中”Android應用“復選框,隨后在”應用簽名“文本框中輸入從測試手機里獲取到的簽名串;”應用包名“,對應倒域名,全部輸入正確后,點擊”保存“按鈕,退出網站就可以了。
到此,對騰訊網站測試APP簽名信息同步完成了,這樣才真正可以測試加入微信支付功能的安卓APP!
(五)常見錯誤:
1,app沒有簽名。如果沒有簽名,肯定測試不了微信支付,上面已經介紹了如何用AS簽名,無論debug還是realease版本,簽名后,都可以測試微信支付接口。
2,提交數據格式不正確。參照我上面代碼,就會避免這個問題。如果數據格式不正確,提交支付請求后,會返回數據格式不正確的錯誤。
3,提交數據參數不符。運行程序后,直接會反饋這類錯誤提示。
4,測試數據失效。如果測試數據是很久之前生成的,那么很有可能發生此類錯誤,而且此類錯誤非常讓大家誤以為是自己編寫程序或插件的bug,如果測試時候,提交的測試數據都是動態生成的,可以避免此類問題!
5,沒有在微信支付接口管理網站登記測試APP。測試的APP,必須使用騰訊公司提供的獲取APP簽名工具,得到簽名字符串之后,進入騰訊公司微信支付管理網站,把安卓對應部分的簽名串修改成你在手機里獲取到的簽名串,否則測試也不能通過。