现在付费应用都会集成支付宝和微信,本篇主要介绍Android 应用怎么集成支付宝,结合我做的《紫禁城》项目,现将客户端代码分享如下。
思路: 1.到支付宝开放平台下载jar包,申请私钥和公钥。
2.把订单发给自己服务器加密
3.把服务器返回的加密后的orderInfo订单信息,调支付宝jar包发给支付宝服务器
正常情况下:1.如果手机已经安装过支付宝客户端,就回直接调起支付宝支付界面,如果未安装支付宝客户端就回调起网页收银台,进行支付。
警告!!!如果你项目用过AES加密,就回出现,网页收银台调出来的情况,具体Bug变现为,网页收银台一闪而过,支付失败,而安装客户端的就没事。
第一种 未安装支付宝客户端,且网页收银台调不起来:
处理方法:如果未安装支付宝客户端就给一个重提示就好。
先判断是否安装支付宝客户端
/**
* 获取是否安装支付宝客户端
*/
public static boolean checkAliPayInstalled(Context context) {
Uri uri = Uri.parse("alipays://platformapi/startApp");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
ComponentName componentName = intent.resolveActivity(context.getPackageManager());
return componentName != null;
}
第二 安装支付宝客户端
1.0 条件jar包
2.0 拷贝支付结果bean
public class PayResult {
private String resultStatus;
private String result;
private String memo;
public PayResult(Map<String, String> rawResult) {
if (rawResult == null) {
return;
}
for (String key : rawResult.keySet()) {
if (TextUtils.equals(key, "resultStatus")) {
resultStatus = rawResult.get(key);
} else if (TextUtils.equals(key, "result")) {
result = rawResult.get(key);
} else if (TextUtils.equals(key, "memo")) {
memo = rawResult.get(key);
}
}
}
@Override
public String toString() {
return "resultStatus={" + resultStatus + "};memo={" + memo
+ "};result={" + result + "}";
}
/**
* @return the resultStatus
*/
public String getResultStatus() {
return resultStatus;
}
/**
* @return the memo
*/
public String getMemo() {
return memo;
}
/**
* @return the result
*/
public String getResult() {
return result;
}
}
3.0支付宝具体业务代码
传入后台加密后的订单字符串 orderInfo
如果有什么疑问加我QQ(1915404346),我们共同探讨。
/** 把支付信息传给支付宝的jar完成支付 */
private void alipay(final String orderInfo) {
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(SubscribeActivity.this);
Map<String, String> result = alipay.payV2(orderInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
}
private static final int SDK_PAY_FLAG = 1;
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
// TODO 真实开发这里应该是发请求问服务器支付结果,以服务器的结果为准
@SuppressWarnings("unchecked")
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
/**
对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
// Log.i("resultInfo",payResult.toString());
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
// Log.i("paysult:",resultStatus);
Toast.makeText(SystemUtil.getApplication(), "支付成功", Toast.LENGTH_SHORT).show();
//购买成功提示;
showSuccess();
//友盟统计,完成购买;
UMengManager.getInstance().postEvent("完成购买");
//送通知给书架界面,订阅界面购买了期刊完成;
EventBus.getDefault().post(new FormatPreviewActivity.PaySuccess());
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
Toast.makeText(SystemUtil.getApplication(), "支付失败", Toast.LENGTH_SHORT).show();
// Log.i("paysult:",resultStatus);
}
break;
}
}
}
};
自己服务器 返回的 orderInfo 实例
payInfo :: app_id=2016122802456724&biz_content={"out_trade_no":"729","total_amount":"40.00","subject":"《紫禁城》二〇一五年二月号",
"timeout_express":"90m","product_code":"QUICK_MSECURITY_PAY",
"seller_id":"2088521512710242"}&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http://news.ccollector.com:8080/
NesSubscription/zfb/notify_url.jsp&sign_type=RSA×
tamp=2017-04-0512:17:39&version=1.0&sign=ZCIhbT%2BG3wkp8b4BeqHG987Vq1jub2D8Ua1q1QZPWmno9Omk5%2BjLCXn6aC5ZHoH8Ql
如果有什么疑问加我QQ(1915404346),我们共同探讨。