微信支付的接入热凹,需要商戶或者公司提前做好一系列的準(zhǔn)備工作泵喘,比如先進(jìn)性開發(fā)者資質(zhì)認(rèn)證(300元/年)、申請APP_ID/APP_KEY般妙、申請支付能力纪铺,最后才能進(jìn)入開發(fā)階段。支付寶支付相比與微信支付碟渺,流程上是相對簡單鲜锚,下面進(jìn)入支付開發(fā)環(huán)節(jié)。
官方開發(fā)文檔入口:
1.支付寶開放平臺 Android集成流程
2.【微信支付】APP支付開發(fā)者文檔
支付寶
1.下載官方的Demo苫拍,把jar包拷貝進(jìn)項目的libs - Add as Library芜繁;
2.從官方Demo中拷貝 PayResult.java 到項目中,支付成功回調(diào)時會用到绒极。在 AndroidManifest.xml 中加入相應(yīng)權(quán)限及如下代碼:
<!--支付寶-->
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden">
</activity>
<activity
android:name="com.alipay.sdk.app.H5AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden">
</activity>
3.從服務(wù)端獲取訂單信息骏令,拉起并傳輸?shù)街Ц秾殘?zhí)行支付,即輸入密碼完成支付的可視化界面垄提;
final String orderInfo = results.getAli_pay_app().getOrderInfo(); // 訂單信息
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(BTDZPayActivity.this);
Map<String, String> result = alipay.payV2(orderInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必須異步調(diào)用
Thread payThread = new Thread(payRunnable);
payThread.start();
4.支付寶支付成功回調(diào)榔袋,此時付款成功,需要同步訂單信息铡俐,調(diào)用服務(wù)更新訂單狀態(tài)凰兑;
private static final int SDK_PAY_FLAG = 1;
private static final int SDK_AUTH_FLAG = 2;
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
@SuppressWarnings("unchecked")
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
/**
對于支付結(jié)果,請商戶依賴服務(wù)端的異步通知結(jié)果审丘。同步通知結(jié)果吏够,僅作為支付結(jié)束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要驗證的信息
String resultStatus = payResult.getResultStatus();
// 判斷resultStatus 為9000則代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 該筆訂單是否真實支付成功滩报,需要依賴服務(wù)端的異步通知锅知。
//Toast.makeText(BuyEquipActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
updateOrder(); //調(diào)用自己的服務(wù),通知服務(wù)器
} else {
// 該筆訂單真實的支付結(jié)果露泊,需要依賴服務(wù)端的異步通知喉镰。
Toast.makeText(BTDZPayActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();
}
break;
}
case SDK_AUTH_FLAG: {
@SuppressWarnings("unchecked")
AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
String resultStatus = authResult.getResultStatus();
// 判斷resultStatus 為“9000”且result_code
// 為“200”則代表授權(quán)成功旅择,具體狀態(tài)碼代表含義可參考授權(quán)接口文檔
if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
// 獲取alipay_open_id惭笑,調(diào)支付時作為參數(shù)extern_token 的value
// 傳入,則支付賬戶為該授權(quán)賬戶
Toast.makeText(BTDZPayActivity.this,
"授權(quán)成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT)
.show();
} else {
// 其他狀態(tài)值則為授權(quán)失敗
Toast.makeText(BTDZPayActivity.this,
"授權(quán)失敗" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();
}
break;
}
default:
break;
}
}
;
};
private void updateOrder(){
//...
Toast.makeText(TheApplication.getContext(), "購買成功~", Toast.LENGTH_SHORT).show();
finish();
}
微信
1.下載官方的Demo,把jar包拷貝進(jìn)項目的libs - Add as Library沉噩;
微信開放平臺上提供的demo是有兩個jar包捺宗,一個是 libammsdk.jar,另一個是 wechat-sdk-android-with-mta-1.0.2.jar川蒙,這兩個其實只需要一個就夠了蚜厉!可以正常編譯和運(yùn)行,但我在打release包時出現(xiàn)這樣一個錯誤:
Error:Execution failed for task ':app:transformClassesWithJarMergingForRelease'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/tencent/mm/opensdk/a/a/a$a.class
發(fā)郵件咨詢了微信的開發(fā)人員【wepayTS(微信支付技術(shù)支持) wepayTS@tencent.com】畜眨,他是這樣回答的:
然后我刪掉了 libammsdk.jar昼牛,便可以正常打包了。
2.在拉起支付頁面的onCreate()方法里創(chuàng)建Api;
//private IWXAPI api;
api = WXAPIFactory.createWXAPI(this, GlobalConstant.wxAppId);
3.從服務(wù)端獲取訂單信息康聂,拉起并傳輸?shù)轿⑿艌?zhí)行支付贰健,即輸入密碼完成支付的可視化界面;
WXPayAppInfo wxPayApp = results.getWx_pay_app();
PayReq payReq = new PayReq();
payReq.appId=GlobalConstant.wxAppId;
payReq.partnerId=wxPayApp.getPartnerid();
payReq.prepayId=wxPayApp.getPrepayid();
payReq.packageValue=wxPayApp.getPackage_();
payReq.nonceStr=wxPayApp.getNoncestr();
payReq.timeStamp=wxPayApp.getTimestamp();
payReq.sign=wxPayApp.getSign();
api.sendReq(payReq);
4.微信支付成功回調(diào)恬汁,和支付寶不同的是伶椿,微信支付成功會跳轉(zhuǎn)到一個可以自定義的可視化界面(Activity),這個頁面是從微信客戶端支付完成回到app時的頁面;
這個頁面需要在項目的package路徑下氓侧,新建wxapi目錄脊另,然后把官方demo里面的 WXPayEntryActivity.java 放進(jìn)去即可。
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//如果不想做支付成功的頁面注釋掉setContentView即可
//setContentView(R.layout.pay_result);
api = WXAPIFactory.createWXAPI(this, GlobalConstant.wxAppId);
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) {
}
@Override
public void onResp(BaseResp resp) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
switch (resp.errCode) {
case 0://支付成功0
//發(fā)送通知支付成功约巷,在其他接收通知頁面執(zhí)行后續(xù)操作
WXPayEntryActivity.this.sendBroadcast(new Intent("pay_action"));
finish();
break;
case -2://用戶取消
Toast.makeText(WXPayEntryActivity.this, "取消支付", Toast.LENGTH_SHORT).show();
finish();
break;
case -1:
break;
default:
break;
}
}
}
}
BroadcastReceiver mPayReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
updateOrder();
}
};
官方demo里面的 WXPayEntryActivity.java 也有個坑偎痛,直接復(fù)制進(jìn)項目的要注意了!
以前測試的時候明明支付了独郎,還是一直提示取消支付看彼,看的我是一臉懵逼,我還天真的去問微信開發(fā)人員囚聚,開發(fā)人員也沒解釋出來啥靖榕,最后不知怎么撇的一眼發(fā)現(xiàn)的。
別忘了在 AndroidManifest.xml 中加入相應(yīng)權(quán)限及如下代碼:
<!--微信-->
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>