APICloud整合微信支付(wxPay第二種方案)
建立應用
開發者在使用APICloud提供的來自第三方開放平臺-微信開放平臺的相關模組時,需要開發者自行到微信開放平臺申請相應的appId(urlScheme),並將該appId以feature的形式配置到您專案的config檔案中。該appId的申請與您應用的建立過程有關,具體流程請參考如下介紹。
- 登入微信開放平臺賬號
- 進入管理中心,若您未登入賬號,微信開放平臺將要求您登入:
- 完成登入即可,進入管理中心:
- 點選建立移動應用,進入應用基本資訊填寫介面:
- 填寫完畢後下一步:
- 進入填寫平臺資訊介面:
- 勾選iOS應用:
- 勾選Android應用:
- 必填資訊獲取:
獲取應用包名:
Android平臺的包名獲取方式:
- 登入成功後進入應用概覽介面,如下圖:
- 獲取包名。在應用概覽區域點選應用簡介下方的小箭頭,在下拉的區域中即可檢視到本應用的包名、appKey、申請百度apiKey所需的SHA1安全碼碼值(百度key)等資訊。如下圖紅色圈區域:
將該包名填入"勾選Android應用"一步中的應用包名即可
獲取應用簽名:
- 進入微信開放平臺資源中心介面,並點選展開資源下載下拉選單:
- 選擇Android資源下載:
- 在右側的展開預覽介面中選擇下載“簽名生成工具”。您將會下載得到一個應用安裝包(apk檔案):
9.7、該應用將用於獲取手機上已安裝應用的簽名。 將該apk安裝至您的Android手機中。同時請確認該手機上已經安裝了您需要獲取簽名信息的應用。
該apk安裝後如圖:
- 在輸入框中輸入,檢視包名中獲取的應用包名,如圖:
- 點選Get Signature按鈕即可,該工具將自動運算出此包名對應應用的簽名,如下圖中綠色字元:
將該綠色字串一次輸入,勾選Android應用的應用簽名框中即可。
- 如過輸入的包名對應的應用在本裝置上不存在,則會出現類似以下情況:
所以請確保您的手機上一定安裝了相應的應用。
- 輸入完相關資訊後,點選“提交稽核”即可:
稽核通過後即可在應用詳情介面檢視到你需要的appId。
開發者資質認證
一切準備工作做好,建立的app會有AppId和Secret已經應用簽名和包名的資訊。如圖是我們應用的資訊。
請務必按照官方微信開放平臺接入的文件(前面這些)一步步完成,
準備工作做完了,準備好幾項資料:appid
我們使用wxPay的第二種支付方案,在模組內部處理簽名過程。
在接入開始之前我們需要注意的是:檢查APP是否使用模組pingpp,ipayNow,因為會產生衝突,這兩個模組是不能與wxPay同時新增的模組,所以需要先檢查,以防所有的工作都做好了,雲編譯(測試需要雲編譯,不能使用自定義loader,因為key.xml檔案的原因)的時候不好用!
準備接入:
1.在開發控制檯新增wxPay的模組。
2.配置config.xml。
使用此模組之前需先配置 config.xml 檔案,方法如下
- 名稱:wxPay
- 引數:urlScheme、apiKey、apiSecret
- 配置示例:
<feature name="wxPay">
<param name="urlScheme" value="wxd0d84bbf23b4a0e4"/>
<param name="apiKey" value="wxd0d84bbf23b4a0e4"/>
<param name="apiSecret" value="a354f72aa1b4c2b8eaad137ac81434cd"/>
</feature>
欄位描述:
urlScheme:(必須配置)用於實現應用間跳轉及資料交換,本應用可以啟動微信客戶端,也可以從微信客戶端跳回本應用。urlScheme 的 value 值是從微信開放平臺獲取的 appid。appid 申請方法參考微信開放平臺接入文件。
apiKey:(必須配置)從微信開放平臺獲取的 appid,值與 urlScheme 相同。appid 申請方法參考微信開放平臺接入文件。
apiSecret:從微信開放平臺獲取的 secret。獲取支付 token 需要配置此項。token 申請方法參考微信開放平臺接入文件。
key.xml 配置詳解:
key.xml
檔案(適用於支付方案二、支付方案一忽略本檔案)需要放在 widget/res
檔案目錄下,格式如下:
<?xml version="1.0" encoding="UTF-8" ?>
<security>
<item name="wxPay_appId" value="wxd0d84bbf23b4a0e4"/>
<item name="wxPay_mchId" value="1234567890"/>
<item name="wxPay_partnerKey" value="***"/>
<item name="wxPay_notifyUrl" value="***"/>
<item name="其它服務需加密的引數配置 " value="***"/>
.
.
.
</security>
欄位描述:
wxPay_appId:在微信開發者平臺建立應用生成的 appId
wxPay_mchId:商戶號,填寫商戶對應引數
wxPay_partnerKey:商戶API金鑰,務必同在商戶平臺->賬戶設定->API安全裡填寫的金鑰保持一致,此金鑰是根據微信對商戶金鑰的規範自己生成的
wxPay_notifyUrl:接收微信支付非同步通知回撥地址,通知url必須為直接可訪問的url,不能攜帶引數
但萬年不變的是,首先我們需要調取我們的模組。然後走config的方法,在config方法回撥成功的時候執行pay方法,調起微信客戶端,執行微信支付的操作。
其中config方法因為我們在key.xml檔案中處理了這些資訊,所以我們在config裡面不用寫apiKey,mchId等這些資訊。
在下面的示例程式碼中寫了這幾個引數,其實我們不需要在這裡寫的。
示例程式碼
var wxPay = api.require('wxPay');
wxPay.config({
apiKey: '',
mchId: '',
partnerKey: '',
notifyUrl: ''
}, function(ret, err) {
if (ret.status) {
alert('配置商戶支付引數成功');
} else {
alert(err.code);
}
});
在err.code中,有以下幾種錯誤碼對應的錯誤資訊。我個人建議在alert的時候+上err.msg這樣更清晰,畢竟錯誤碼還需要去比對,建議將兩者同時輸出。雖然我config上沒有err但是在pay方法時候報錯-1,我alert了err.msg之後才知道是mchId和AppId不匹配的原因,然後找到產生錯誤的原因解決,就避免了很多不必要的麻煩。
err:
- 型別:JSON 物件
- 內部欄位:
{
code: 1 //數字型別;錯誤碼
//-1(未知錯誤)
//1(apiKey 值非法)
//2(mchId 值非法)
//3(partnerKey 值非法)
//4(notifyUrl 值非法)
}
在執行config成功後,我們執行pay方法,同樣的我要放上示例程式碼,獨立出方法的程式碼只是為了讓大家更好地理解。其中要注意的是,在呼叫的時候,會自動填上下面的description等引數,這個地方有一個坑需要大家注意就是timeExpire,這個到期時間因為是2009年的時間所以會產生time_expire時間過短,刷卡至少1分鐘,其他5分鐘這樣的錯誤提示。所以我建議大家留下前三個引數即可。
示例程式碼
var wxPay = api.require('wxPay');
wxPay.pay({
description: 'iPad mini 16G 白色',
totalFee: '888',
tradeNo: '1217752501201407033233368018',
spbillCreateIP: '196.168.1.1',
deviceInfo: '013467007045764',
detail: 'iPad mini 16G 白色',
attach: '說明',
feeType: 'CNY',
timeStart: '20091225091010',
timeExpire: '20091227091010',
goodsTag: 'WXG',
productId: '12235413214070356458058',
openId: 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o'
}, function(ret, err) {
if (ret.status) {
alert(ret.result);
} else {
alert(err.code);
}
});
其中這些引數的意義我就貼上在下方給大家理解。params
description:
- 型別:字串
- 描述:商品或支付訂單簡要描述
totalFee:
- 型別:字串
- 描述:訂單總金額,只能為整數,單位:分(¥)
tradeNo:
- 型別:字串
- 描述:商戶系統內部的訂單號,32個字元以內,可包含字母,其他說明見商戶訂單號
spbillCreateIP:
- 型別:字串
- 描述:(可選項)APP 和網頁支付提交使用者端 IP,Native 支付填呼叫微信支付 API 的機器 IP
- 預設值:196.168.1.1
deviceInfo:
- 型別:字串
- 描述:(可選項)終端裝置號(門店號或收銀裝置 ID),注意:PC 網頁或公眾號內支付請傳 "WEB"
detail:
- 型別:字串
- 描述:(可選項)商品名稱明細列表
attach:
- 型別:字串
- 描述:(可選項)附加資料,在查詢 API 和支付通知中原樣返回,該欄位主要用於商戶攜帶訂單的自定義資料
feeType:
- 型別:字串
- 描述:(可選項)符合 ISO 4217標準的三位字母程式碼,其他值列表詳見貨幣型別
- 預設:CNY(人民幣)
timeStart:
- 型別:字串
- 描述:(可選項)訂單生成時間,格式為 yyyyMMddHHmmss,如2009年12月25日9點10分10秒錶示為20091225091010。其他詳見時間規則
timeExpire:
- 型別:字串
- 描述:(可選項)訂單失效時間,格式為 yyyyMMddHHmmss,如2009年12月27日9點10分10秒錶示為20091227091010。其他詳見時間規則。注意:最短失效時間間隔必須大於5分鐘
goodsTag:
- 型別:字串
- 描述:(可選項)商品標記,代金券或立減優惠功能的引數,說明詳見代金券或立減優惠
productId:
- 型別:字串
- 描述:(可選項)trade_type=NATIVE ,此 id 為二維碼中包含的商品 ID,商戶自行定義,詳見商戶平臺開發者文件
openId:
- 型別:字串
- 描述:(可選項)trade_type=JSAPI ,使用者在商戶 appid 下的唯一標識。下單前需要呼叫【網頁授權獲取使用者資訊】介面獲取到使用者的 Openid
err:
- 型別:JSON 物件
- 內部欄位:(錯誤碼詳見統一下單錯誤碼)
{
code: 1 //數字型別;
//錯誤碼:
//-2(使用者取消)
//-1(可能的原因:簽名錯誤、未註冊APPID、專案設定APPID不正確、註冊的APPID與設定的不匹配、其他異常等)
//1(必傳引數缺失)
msg: 'NOAUTH' //字串型別;
//取值範圍:
//NOAUTH (商戶無此介面許可權)
//NOTENOUGH(餘額不足)
//ORDERPAID(商戶訂單已支付)
//ORDERCLOSED(訂單已關閉)
//SYSTEMERROR(系統錯誤)
//APPID_NOT_EXIST (APPID不存在)
//MCHID_NOT_EXIST(MCHID不存在)
//APPID_MCHID_NOT_MATCH(appid和mch_id不匹配)
//LACK_PARAMS(缺少引數)
//OUT_TRADE_NO_USED(商戶訂單號重複)
//SIGNERROR (簽名錯誤)
//XML_FORMAT_ERROR(XML格式錯誤)
//REQUIRE_POST_METHOD(請使用post方法)
//POST_DATA_EMPTY(post資料為空)
//NOT_UTF8(編碼格式錯誤)
}
到此我們的詳細解釋基本完成,接下來我會貼上我的具體實現程式碼,這裡需要注意的是每個訂單號tradeNo只能使用一次:function wxPay() {
var wxPay = api.require('wxPay');
wxPay.config({
}, function(ret, err) {
if (ret.status) {
alert('配置商戶支付引數成功');
wxPay.pay({
description: 'iPad mini 16G 白色',
totalFee: '001',
tradeNo: '1217752501201407033233368012',
},function(ret,err){
//coding...
if(ret.status) {
alert("您已支付成功");
} else {
if(err.code == '-2'){
alert("您已取消支付");
} else {
alert('回撥失敗'+err.code+err.msg);
}
}
});
} else {
console.log(err.code);
}
});
}
如我的程式碼所顯示的一樣,當config回撥成功走了pay方法調起微信客戶端執行支付操作,會彈出有支付資訊的視窗,
點選立即支付,ret支付成功,取消支付則err.code=-2。
到這裡,微信支付的接入基本完成。
自己研究的如果有錯誤煩請讀者指出,謝謝!