一、Android微信支付集成,準(zhǔn)備工作
1,微信開放平臺(tái) 注冊(cè),獲取App id等信息

注冊(cè)過程中填寫相應(yīng)的信息即可,需要注意應(yīng)用簽名的獲取。

應(yīng)用簽名獲取步驟:
-
找到自己項(xiàng)目的簽名文件,比如我的存放在項(xiàng)目中,如下圖:
簽名文件.png - 打開命令提示框,輸入
keytool -v -list -keystore 路徑,輸入密碼后會(huì)顯示出jks信息,例如:
獲取簽名信息.png
注意:這里的MD5就是需要的,將中間的 : 刪除,就是應(yīng)用簽名,也可以通過微信的一個(gè)工具apk,來獲取微信應(yīng)用簽名獲取apk下載 ,可以通過該工具對(duì)比 上面的MD5,是否一致!應(yīng)用信息填寫完畢,然后提交申請(qǐng)即可。

2,Android端集成
- 在app model下添加以下依賴:
//wx 支付依賴(包含統(tǒng)計(jì)功能)
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
//不包含統(tǒng)計(jì)功能
//implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
- 接收微信回調(diào)需要一個(gè)
WXPayEntryActivity,目錄如下圖,推薦直接拷貝微信demo中的類,這里需要注意WXPayEntryActivity 路徑必須為:綁定的商戶應(yīng)用包名 + wxapi + WXPayEntryActivity,比如:我在微信開發(fā)平臺(tái)注冊(cè)包名為:com.example.wx,WXPayEntryActivity的路徑就需要為:com.example.wx.wxapi.WXPayEntryActivity。
微信回調(diào)的類.png
注:微信demo
附上自己的類:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String TAG = "WXPayEntryActivity";
private IWXAPI api;
private String app_id = "";//微信開發(fā)后臺(tái)申請(qǐng)的app_id
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//這里可以不填寫
// setContentView(R.layout.pay_result);
api = WXAPIFactory.createWXAPI(this, app_id);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
/**
* 處理結(jié)果回調(diào)
*
* @param resp
*/
@Override
public void onResp(BaseResp resp) {
Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
switch (resp.errCode) {
case 0://支付成功
Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onResp: resp.errCode = 0 支付成功");
break;
case -1://錯(cuò)誤,可能的原因:簽名錯(cuò)誤、未注冊(cè)APPID、項(xiàng)目設(shè)置APPID不正確、注冊(cè)的APPID與設(shè)置的不匹配、其他異常等
Toast.makeText(this, "支付錯(cuò)誤" + resp.errCode, Toast.LENGTH_SHORT).show();
Log.d(TAG, "onResp: resp.errCode = -1 支付錯(cuò)誤");
break;
case -2://用戶取消,無需處理。發(fā)生場(chǎng)景:用戶不支付了,點(diǎn)擊取消,返回APP。
Log.d(TAG, "onResp: resp.errCode = -2 用戶取消");
Toast.makeText(this, "用戶取消" + resp.errCode, Toast.LENGTH_SHORT).show();
break;
}
finish();//這里需要關(guān)閉該頁面
}
}
}
需要在注冊(cè)清單AndroidManifest.xml中添加權(quán)限與WXPayEntryActivity
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
- 調(diào)用API前,需要先向微信注冊(cè)您的APPID,注冊(cè)微信支付App Id,有兩種方式
//*********1,清單文件中直接注冊(cè)********
<activity android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<!--這里填寫你申請(qǐng)的app id-->
<data android:scheme="app id" />
</intent-filter>
</activity>
//**************2,在應(yīng)用入口Application,app id注冊(cè)到微信************************
IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 將該app id 注冊(cè)到微信 AppID: 申請(qǐng)到的AppID
msgApi.registerApp(AppID);
二、Android 支付過程
1,Android端與后臺(tái)交互的大致流程如下:

2,發(fā)起微信支付
Android App 調(diào)起微信支付所需的參數(shù)如下,這里的參數(shù)絕大多數(shù)是上圖流程中調(diào)用后臺(tái)訂單接口返回:

后臺(tái)返回?cái)?shù)據(jù)后,調(diào)起微信支付的代碼如下:
/**
* 調(diào)支付的方法
* <p>
* 注意: 每次調(diào)用微信支付的時(shí)候都會(huì)校驗(yàn) appid 、包名 和 應(yīng)用簽名的。 這三個(gè)必須保持一致才能夠成功調(diào)起微信
*
* @param wxPayBean
*/
private void startWechatPay(WxPayBean wxPayBean) {
tv_paylist.setText(tv_paylist.getText() + "\n\n調(diào)起微信支付....");
//這里的appid,替換成自己的即可
IWXAPI api = WXAPIFactory.createWXAPI(this, Constant.WxPayAppId);
api.registerApp(Constant.WxPayAppId);
//這里的bean,是服務(wù)器返回的json生成的bean
PayReq payRequest = new PayReq();
payRequest.appId = Constant.WxPayAppId;
payRequest.partnerId = wxPayBean.getPartnerid();
payRequest.prepayId = wxPayBean.getPrepayid();
payRequest.packageValue = "Sign=WXPay";//固定值
payRequest.nonceStr = wxPayBean.getNoncestr();
payRequest.timeStamp = wxPayBean.getTimestamp();
payRequest.sign = wxPayBean.getSign();
//發(fā)起請(qǐng)求,調(diào)起微信前去支付
api.sendReq(payRequest);
}
這里的WxPayBean 是自己寫的一個(gè)請(qǐng)求參數(shù)的實(shí)體類:
public class WxPayBean {
private String appid;//微信開放平臺(tái)審核通過的應(yīng)用APPID
private String partnerid;//微信支付分配的商戶號(hào)
private String prepayid;//微信返回的支付交易會(huì)話ID
// private String package;// 擴(kuò)展字段 暫填寫固定值Sign=WXPay
private String noncestr;//隨機(jī)字符串,隨機(jī)字符串,不長于32位。推薦隨機(jī)數(shù)生成算法
private String sign;//簽名,詳見簽名生成算法注意:簽名方式一定要與統(tǒng)一下單接口使用的一致
private String timestamp;//時(shí)間戳,請(qǐng)見接口規(guī)則-參數(shù)規(guī)定
.......
}
3,微信支付結(jié)果回調(diào)在 {@link WXPayEntryActivity#onResp(BaseResp)} 中
只貼出該方法,具體類上面已經(jīng)貼出:
/**
* 處理結(jié)果回調(diào)
*
* @param resp
*/
@Override
public void onResp(BaseResp resp) {
Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
switch (resp.errCode) {
case 0://支付成功
Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onResp: resp.errCode = 0 支付成功");
break;
case -1://錯(cuò)誤,可能的原因:簽名錯(cuò)誤、未注冊(cè)APPID、項(xiàng)目設(shè)置APPID不正確、注冊(cè)的APPID與設(shè)置的不匹配、其他異常等
Toast.makeText(this, "支付錯(cuò)誤" + resp.errCode, Toast.LENGTH_SHORT).show();
Log.d(TAG, "onResp: resp.errCode = -1 支付錯(cuò)誤");
break;
case -2://用戶取消,無需處理。發(fā)生場(chǎng)景:用戶不支付了,點(diǎn)擊取消,返回APP。
Log.d(TAG, "onResp: resp.errCode = -2 用戶取消");
Toast.makeText(this, "用戶取消" + resp.errCode, Toast.LENGTH_SHORT).show();
break;
}
finish();//這里需要關(guān)閉該頁面
}
}
附:微信支付Api
三、微信支付接入過程遇到的坑
1,支付不回調(diào)問題
如果獲取不到支付回調(diào),請(qǐng)檢查一下WXPayEntryActivity放置的路徑;微信支付必須要求該類的路徑為:包名.wxapi.WXPayEntryActivity,不然不能回調(diào)。
2,申請(qǐng)App Id,應(yīng)用簽名的獲取
如果接入有問題,請(qǐng)使用排查一下是否申請(qǐng)app id的時(shí)候,應(yīng)用簽名是否有誤,推薦使用微信應(yīng)用簽名獲取apk 來校驗(yàn),填入自己應(yīng)用包名即可查看應(yīng)用簽名。
3,在微信后臺(tái)申請(qǐng)完app以后,注意監(jiān)測(cè)是否獲得微信支付的能力,需要單獨(dú)申請(qǐng)
微信支付中,如果報(bào)appid和mech_id(微信支付分配的商戶號(hào))的錯(cuò),應(yīng)該就是要支持支付功能的App的appid與商戶平臺(tái)的商戶id不對(duì)應(yīng)造成的。

附:檢測(cè)是否安裝微信app
/**
* 判斷微信是否安裝
* @param context
* @return true 已安裝 false 未安裝
*/
public static boolean isWxAppInstalled(Context context) {
IWXAPI wxApi = WXAPIFactory.createWXAPI(context, null);
wxApi.registerApp(Wx.APP_ID);
boolean bIsWXAppInstalled = false;
bIsWXAppInstalled = wxApi.isWXAppInstalled();
return bIsWXAppInstalled;
}


