1. 程式人生 > >APICloud整合微信支付(wxPay第二種方案)

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

secret(用於獲取 access_token)、partnerkey(微信公眾平臺商戶模組生成的商戶金鑰)。

我們使用wxPay的第二種支付方案,在模組內部處理簽名過程。

在接入開始之前我們需要注意的是:檢查APP是否使用模組pingppipayNow,因為會產生衝突,這兩個模組是不能與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 申請方法參考微信開放平臺接入文件

3.配置key.xml檔案

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,不能攜帶引數

4.開始編寫程式碼,wxPay方案二中主要使用的方法是config(配置模組內部處理簽名時需要的引數)和pay(支付訂單)方法。

但萬年不變的是,首先我們需要調取我們的模組。然後走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的code和msg的詳細解釋:

err:

{
    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。

到這裡,微信支付的接入基本完成。

自己研究的如果有錯誤煩請讀者指出,謝謝!