要想在自己的APP中實現(xiàn)APP支付必須申請開通支付功能,這些按著文檔來吧,我還是直接說Android中的問題吧。
一、簽名
一定要在開放平臺為自己的APP配置正確的包名和簽名(簽名:將APP打一個正式環(huán)境的包,然后在微信開放平臺下載簽名工具進行簽名)。
二、打包測試
和微信的第三方登錄一樣,必須要打正式包,不是debug的,來進行測試,這樣就沒有辦法調(diào)試了,感覺很不爽。所以提供一個辦法來拯救一下嘿嘿:
在build.gradle文件中設置debug環(huán)境和relealse環(huán)境的簽名相同就可以解決這個文通了,已經(jīng)試過了,可以的。
signingConfigs {
release {
//.jks文件放在項目目錄
storeFile file("xxx.jks")
storePassword "xxx"
keyAlias "xxx.release"
keyPassword "xxx"
}
debug {
//.jks文件放在項目目錄
storeFile file("xxx.jks")
storePassword "xxx"
keyAlias "xxx.release"
keyPassword "xxx"
}
}
接下來按著官網(wǎng)的文檔和demo來完成:
1、定義一個全局的變量:
private IWXAPI api;
2、注冊APPID
api = WXAPIFactory.createWXAPI(this, "你在微信開放平臺創(chuàng)建的app的APPID");
官網(wǎng)是這樣注冊的,但是,下面要用到msgAPi,所以定義為全局的。
final IWXAPI msgApi = WXAPIFactory.createWXAPI(SelectPaymentMethodActivity.this, null);
msgApi.registerApp("你在微信開放平臺創(chuàng)建的app的APPID");
3、開始支付
當你點擊支付的時候去調(diào)用服務端的接口(服務端調(diào)用統(tǒng)一下單接口,反geini一些信息),所以這里你不能自己獨立完成需要后端的支持。
//我將后端反給我的信息放到了WeiXinPay中,這步是獲取數(shù)據(jù)
WeiXinPay weiXinPay = (WeiXinPay) map.get("weixinpay");
//這個在官網(wǎng)里就會看到,將你獲取的信息賦給payReq,這塊就是調(diào)起微信的關鍵
PayReq payReq = new PayReq();
payReq.appId = weiXinPay.getAppid();
payReq.partnerId = weiXinPay.getPartnerid();
payReq.prepayId = weiXinPay.getPrepayid();
payReq.packageValue = weiXinPay.getPackage_exten();
payReq.nonceStr = weiXinPay.getNoncestr();
payReq.timeStamp = weiXinPay.getTimestamp();
payReq.sign = weiXinPay.getSign();
api.sendReq(payReq);
4、接下來就是在微信里的一些東西了,我們不用管,我們只需要關心回調(diào)頁WXPayEntryActivity,這里需要注意該文件必須在wxapi這個文件夾下,及com.xxx.xxx.wxapi.WXPayEntryActivity
//必須實現(xiàn)接口,重寫方法
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxpayentry);
api = WXAPIFactory.createWXAPI(this, "wx72e0123dd9b54a73");
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp baseResp) {
Log.e("---------->","code:"+baseResp.errCode);
if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
//這里就是支付完成后需要做的事,如跳到哪個頁面啥的
}
}
}
5、還有一點在功能清單中對Activity中進行注冊
<!--微信支付-->
<activity android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
-1 掃坑(可能的原因:簽名錯誤、未注冊APPID、項目設置APPID不正確、注冊的APPID與設置的不匹配、其他異常等)
微信
商戶系統(tǒng)和微信支付系統(tǒng)主要交互說明:
- 步驟1:用戶在商戶APP中選擇商品,提交訂單,選擇微信支付。
- 步驟2:商戶后臺收到用戶支付單,調(diào)用微信支付統(tǒng)一下單接口。參見【統(tǒng)一下單API】。
- 步驟3:統(tǒng)一下單接口返回正常的prepay_id,再按簽名規(guī)范重新生成簽名后,將數(shù)據(jù)傳輸給APP。參與簽名的字段名為appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式為Sign=WXPay
- 步驟4:商戶APP調(diào)起微信支付。api參見本章節(jié)【app端開發(fā)步驟說明】
- 步驟5:商戶后臺接收支付通知。api參見【支付結果通知API】
- 步驟6:商戶后臺查詢支付結果。,api參見【查詢訂單API】
調(diào)起支付接口
請求參數(shù)
字段名 | 變量名 | 類型 | 必填 | 示例值 | 描述 |
---|---|---|---|---|---|
應用ID | appid | String(32) | 是 | wx8888888888888888 | 微信開放平臺審核通過的應用APPID |
商戶號 | partnerid | String(32) | 是 | 1900000109 | 微信支付分配的商戶號 |
預支付交易會話ID | prepayid | String(32) | 是 | WX1217752501201407033233368018 | 微信返回的支付交易會話ID |
擴展字段 | package | String(128) | 是 | Sign=WXPay | 暫填寫固定值Sign=WXPay |
隨機字符串 | noncestr | String(32) | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 隨機字符串,不長于32位。推薦隨機數(shù)生成算法 |
時間戳 | timestamp | String(10) | 是 | 1412000000 | 時間戳,請見接口規(guī)則-參數(shù)規(guī)定 |
簽名 | sign | String(32) | 是 | C380BEC2BFD727A4B6845133519F3AD6 | 簽名,詳見簽名生成算法注意:簽名方式一定要與統(tǒng)一下單接口使用的一致 |
舉例請見:APP端開發(fā)說明
返回結果
名稱 | 描述 | 解決方案 |
---|---|---|
0 | 成功 | 展示成功頁面 |
-1 | 錯誤 | 可能的原因:簽名錯誤、未注冊APPID、項目設置APPID不正確、注冊的APPID與設置的不匹配、其他異常等。 |
-2 | 用戶取消 | 無需處理。發(fā)生場景:用戶不支付了,點擊取消,返回APP。 |
幾大坑原因+解決:
- 1、 微信開放平臺上傳的簽名問題(調(diào)試環(huán)境使用的簽名要和微信后臺保持一致)
- 2、 Manifest文件中WXPayEntryActivity 的配置問題。一定要聲明
- 3、 WXPayEntryActivity 類必須放在 包名.wxapi 下
- 4、 簽名工作一般由后臺完成,在生成簽名時,務必注意key的拼寫問題,比如必須拼appid而不是appId,必須拼prepayid而不是prepayId,這里跟上面
PayReq
對象中字段的命名方式不一樣,用錯了也是照樣返回-1。一定要小寫!!!參與簽名的字段名為appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式為Sign=WXPay
- 6、清空緩存,最后再說一個坑,如果經(jīng)過一系列的配置,發(fā)現(xiàn)完全都配置好了,可是微信支付依然返回-1。而此時我們可能又會回頭排查各個節(jié)點的問題,是配置問題?是自己的數(shù)據(jù)傳遞問題?到底哪里的bug?
其實這時候,清空下自己的應用緩存就可以了,通過 設置-應用管理-your app-清空緩存,進行緩存清理過后,立竿見影拿到成功的回調(diào)!