前言
上一篇寫了支付寶支付,這一篇說下微信支付岗照,廢話不多說直接開門見山
接入流程
1.申請開發(fā)者資質(zhì)
地址:https://open.weixin.qq.com/
使用公司管理者/高層帳號登錄微信開放平臺,進(jìn)入“賬號中心”,進(jìn)行開發(fā)者資質(zhì)認(rèn)證,需要填寫公司資料秕铛,包括但不限于,公司注冊號缩挑,公司營業(yè)執(zhí)照但两,公司對外辦公電話,公司對公銀行卡信息(卡號供置,發(fā)卡行)谨湘。審核時間為一周左右。
2.申請APP_ID/APP_KEY
每個應(yīng)用/游戲要調(diào)用微信的接口都需要有一個微信標(biāo)志芥丧,這個唯一標(biāo)志通常成為APP_ID或者APP_KEY紧阔,各開放平臺差異不大
進(jìn)入管理中心,創(chuàng)建移動應(yīng)用续担,每個開發(fā)者具有10個應(yīng)用的創(chuàng)建機(jī)會擅耽。
備注:測試支付時,務(wù)必使用申請時填寫的keystore文件簽名物遇,包名也需要核對清楚乖仇,必然無法調(diào)起支付憾儒,返回-1錯誤碼。
3.申請支付能力
在管理中心乃沙,查看需要集成支付能力的app起趾,找到“微信支付”一欄,點(diǎn)擊右側(cè)“申請開通”警儒,填寫一些企業(yè)信息后等待審核训裆,審核時間為一周左右,審核通過后蜀铲,會得到一個企業(yè)商戶號及密碼边琉,對公銀行卡中將收到幾分錢,進(jìn)入商戶平臺记劝,輸入收到的金錢金額以驗(yàn)證艺骂。驗(yàn)證通過后即可開始集成支付調(diào)用。在這之前隆夯,調(diào)用支付接口是無法完成支付的。
4.代碼集成微信支付
這一個是微信官網(wǎng)提供的App支付時序圖别伏,商戶系統(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參見【支付結(jié)果通知API】
步驟6:商戶后臺查詢支付結(jié)果。矩父,api參見【查詢訂單API】
說這么復(fù)雜锉桑,其實(shí)整個流程,App做的就是從后臺取到的微信支付需要的參數(shù)窍株,然后調(diào)起微信民轴,微信返回支付結(jié)果攻柠,然后微信服務(wù)器異步回調(diào)給我們自己后臺服務(wù)器。
1:Eclipse添加jar包,Android studio添加依賴庫
2:修改清單文件(添加權(quán)限杉武、注冊activity)辙诞,其中微信的回調(diào)結(jié)果是通過他們定義好的在wxapi包下的一個叫WXPayEntryActivity返回的,不能改整個名字不然看不到回調(diào)結(jié)果轻抱。
<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"/>
3:首先根據(jù)后臺返回參數(shù)飞涂,調(diào)起微信
IWXAPI mWxApi = WXAPIFactory.createWXAPI(mContext, WX_APPID, true);
PayReq req = new PayReq();
mWxApi.registerApp(WX_APPID);
/**
* 請求app服務(wù)器得到的回調(diào)結(jié)果
*/
@Override
public void onSuccess(JSONObject jsonObject) {
if (mWxApi != null) {
PayReq req = new PayReq();
req.appId = WX_APPID;// 微信開放平臺審核通過的應(yīng)用APPID
try {
req.partnerId = jsonObject.getString("partnerid");// 微信支付分配的商戶號
req.prepayId = jsonObject.getString("prepayid");// 預(yù)支付訂單號,app服務(wù)器調(diào)用“統(tǒng)一下單”接口獲取
req.nonceStr = jsonObject.getString("noncestr");// 隨機(jī)字符串祈搜,不長于32位较店,服務(wù)器小哥會給咱生成
req.timeStamp = jsonObject.getString("timestamp");// 時間戳
req.packageValue = jsonObject.getString("package");// 固定值Sign=WXPay,可以直接寫死容燕,服務(wù)器返回的也是這個固定值
req.sign = jsonObject.getString("sign");// 簽名梁呈,后臺根據(jù)據(jù):https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3指導(dǎo)得到這個
} catch (JSONException e) {
e.printStackTrace();
}
mWxApi.sendReq(req);
Log.d("發(fā)起微信支付申請");
}
}
4:查看支付結(jié)果
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
private IWXAPI api;
private static final String APP_ID = "your 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)
*/
@Override
public void onResp(BaseResp resp) {
Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);// 支付結(jié)果碼
}
}
最后提醒大家注意坑點(diǎn):
1:測試微信支付需要給微信開放平臺的簽名改成你的未簽名,因?yàn)楹灻蟮腶pk你看不到debug日志蘸秘,但是上線時要改成正式打包的apk簽名官卡。
2:當(dāng)支付時,微信尚未登錄醋虏,得不到任何回調(diào)寻咒,如果調(diào)起支付時有彈窗進(jìn)度框,并且你想在得到響應(yīng)碼后讓它消失是行不通的,需要在跳出的onStop中處理進(jìn)度條颈嚼,不然未登錄并且用戶取消了支付時進(jìn)度條無法消失毛秘。
3:當(dāng)支付時,WXPayEntryActivity會以透明的形式啟動,所以你可能需要在支付完成得到支付響應(yīng)碼后手動finish該activity,不然你自己寫的支付頁面的activity需要返回兩次才能退出,因?yàn)榈谝淮伟聪耣ack鍵實(shí)際是finish掉WXPayEntryActivity.第二次才是你自己的activity.
這就是微信支付集成的所有流程,最后附一個官方demo
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1