Android 微信支付和支付寶支付 快速接入
阿新 • • 發佈:2019-01-25
先放上接入兩個支付平臺的官方文件地址
一、支付寶支付
匯入開發資源
在商戶應用工程的AndroidManifest.xml檔案裡面新增宣告:
<activity android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind" > </activity> <activity android:name="com.alipay.sdk.auth.AuthActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind" > </activity>
和許可權宣告:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
新增混淆規則
-libraryjars libs/alipaySingle-20161222.jar -keep class com.alipay.android.app.IAlixPay{*;} -keep class com.alipay.android.app.IAlixPay$Stub{*;} -keep class com.alipay.android.app.IRemoteServiceCallback{*;} -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;} -keep class com.alipay.sdk.app.PayTask{ public *;} -keep class com.alipay.sdk.app.AuthTask{ public *;}
二、微信支付
匯入開發資源
商戶在微信開放平臺申請開發應用後,微信開放平臺會生成APP的唯一標識APPID。由於需要保證支付安全,需要在開放平臺繫結商戶應用包名和應用簽名,設定好後才能正常發起支付。設定介面在【開放平臺】中的欄目【管理中心 / 修改應用 / 修改開發資訊】裡面,如圖所示:
應用包名:是在APP專案配置檔案AndroidManifest.xml中宣告的package值,例如DEMO中的package=”net.sourceforge.simcpux”。
商戶APP工程中引入微信JAR包,呼叫API前,需要先向微信註冊您的APPID,程式碼如下:
public class MyApplication extends Application {
IWXAPI msgApi = null;
@Override
public void onCreate()
{
msgApi = WXAPIFactory.createWXAPI(this, null);
// 將該app註冊到微信
msgApi.registerApp(Constant.WX_APP_ID);
}
}
Constant.java程式碼
public class Constant {
//appid 微信分配的公眾賬號ID
public static final String WX_APP_ID = "wxc2d0381e95948db6";
//商戶號 微信分配的公眾賬號ID
public static final String WX_MCH_ID = "1432223602";
//API金鑰,在商戶平臺設定
public static final String WX_API_KEY = "";
}
下面是集合呼叫兩種支付方法的統一方法(僅適用於伺服器返回支付引數orderInfo):
//伺服器返回加密引數
private String orderInfo;
/**
* 支付寶
*/
private void alipay(final String orderInfo) {
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(PayActivity.this);
Map<String, String> result = alipay.payV2(orderInfo, true);
Log.i("msp", result.toString());
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
}
/**
* 微信支付
*
* @param data
*/
private void weixinPay(String data) {
// 通過WXAPIFactory工廠,獲取IWXAPI的例項
IWXAPI api = WXAPIFactory.createWXAPI(this, null);
// 將該app註冊到微信
api.registerApp(ConstantValue.WX_ID);
LogUtil.d("data=" + data);
try {
JSONObject json = new JSONObject(data);
PayReq req = new PayReq();
req.appId = json.getString("appid");
req.partnerId = json.getString("partnerid");
req.prepayId = json.getString("prepayid");
req.nonceStr = json.getString("noncestr");
req.timeStamp = json.getString("timestamp");
req.packageValue = json.getString("package");
req.sign = json.getString("sign");
req.extData = "app data"; // optional
// 在支付之前,如果應用沒有註冊到微信,應該先呼叫IWXMsg.registerApp將應用註冊到微信
api.sendReq(req);
finish();
} catch (JSONException e) {
e.printStackTrace();
}
}
返回呼叫的執行緒
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);
/**
對於支付結果,請商戶依賴服務端的非同步通知結果。同步通知結果,僅作為支付結束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要驗證的資訊
String resultStatus = payResult.getResultStatus();
// 判斷resultStatus 為9000則代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 該筆訂單是否真實支付成功,需要依賴服務端的非同步通知。
Toast.makeText(PayActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
startActivity(new Intent(PayActivity.this, PayEndActivity.class));
finish();
} else {
// 該筆訂單真實的支付結果,需要依賴服務端的非同步通知。
Toast.makeText(PayActivity.this, payResult.getMemo(), Toast.LENGTH_SHORT).show();
}
break;
case 0:
orderList = orderdetails.getOrders();
for (OrderDetailsBean.OrdersBean ordersBean : orderList) {
if (ordersBean.getProducts().size() != 0) {
productsBeanList = ordersBean.getProducts();
for (OrderDetailsBean.OrdersBean.ProductsBean productsBean : productsBeanList) {
if (productsBean.getSkus().size() != 0) {
datas = productsBean.getSkus();
allSkudatas.addAll(datas);
}
}
}
}
ordersbean = orderList.get(0);
order_priceTv.setText("¥" + orderdetails.getTotalPay() + "");
orderAdapter = new OrderAdapter(context, allSkudatas);
goods_Lv.setAdapter(orderAdapter);
dialogUtils1.dismiss();
break;
default:
break;
}
}
};
所有程式碼都貼在上面了,大家不懂的可以多看下官網。