支付宝
2016/11/23支付宝全面升级,记录一下支付宝支付的开发步骤:
第一步:创建应用并获取APPID(和开发没什么关系,这里不介绍,可以参考:https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1)
第二步:配置密钥
开发者调用接口前需要先生成RSA密钥,RSA密钥包含应用私钥(APP_PRIVATE_KEY)、应用公钥(APP_PUBLIC_KEY)。生成密钥后在开放平台管理中心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY)
注:具体配置可以参考支付宝官方文档,地址:https://doc.open.alipay.com/doc2/detail.htm?treeId=200&articleId=105310&docType=1
第三步:集成并配置SDK
下载支付宝sdk,导入jar包
修改Manifest
<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/alipaySDK-20150602.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 *;}
第四步:调用接口
先附上支付宝的支付流程图:
看似好多的步骤,其实前台只需要三部即可
- 调起支付宝并传入支付参数;
- 输入支付密码;
- 等待支付结果,跳转;
调起支付
public void pay(final String orderInfo) {
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(activity);
Map<String, String> result = alipay.payV2(orderInfo, true);
Logger.i("msg:" + result.toString());
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
}
支付宝在文档中用红色的字体告诉我们:orderStr的获取必须来源于服务端(也就是我们代码中的orderInfo);
只需要这一步我们就可以调用支付宝支付了,接下来我们要做的就是等待用户操作完之后支付宝给我们回调
@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);
/**
对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
ToastUtils.showShortToast("支付成功");
RxBus.getInstance().post(new RxEvent(Constant.ALIPAY_PAY_SUCCESS));
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
ToastUtils.showShortToast("支付失败");
RxBus.getInstance().post(new RxEvent(Constant.ALIPAY_PAY_FAIL));
}
break;
}
default:
break;
}
}
};
PayResult 这个类可以在支付宝demo中找到。
全部代码:
public class AliPayUtils {
private Activity activity;
private static AliPayUtils instance;
private static final int SDK_PAY_FLAG = 1;
private AliPayUtils(Activity activity) {
this.activity = activity;
}
public static AliPayUtils getInstance(Activity activity) {
if (instance == null) {
instance = new AliPayUtils(activity);
}
return instance;
}
/**
* 支付接口
*/
public void pay(final String orderInfo) {
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(activity);
Map<String, String> result = alipay.payV2(orderInfo, true);
Logger.i("msg:" + result.toString());
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
}
@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);
/**
对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
ToastUtils.showShortToast("支付成功");
RxBus.getInstance().post(new RxEvent(Constant.ALIPAY_PAY_SUCCESS));
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
ToastUtils.showShortToast("支付失败");
RxBus.getInstance().post(new RxEvent(Constant.ALIPAY_PAY_FAIL));
}
break;
}
default:
break;
}
}
};
}
在我们调用的时候只需要
AliPayUtils.getInstance(this).pay(orderInfo);
再次强调为了安全,orderInfo必须由服务器生成。
微信支付
微信支付相对于支付宝支付文档内容很少,网上也有好多博客在记录怎么样填坑。这里记录一下微信开发:
1、后台设置(这里不介绍,可以参考官方文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5)
2、注册APPID
先添加微信jar包
注册appid
IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
msgApi.registerApp(Constant.WX_APP_ID);
注册后需要检查是否安装了微信客户端:
if (!msgApi.isWXAppInstalled()) {
ToastUtils.showShortToast("没有安装微信,请安装后再试");
return;
}
if (!msgApi.isWXAppSupportAPI()) {
ToastUtils.showShortToast("当前版本不支持支付功能");
return;
}
3调起微信支付(支付参数由服务器生成)
msgApi.sendReq(req);
4、支付结果回调
微信支付回调必须在 net.sourceforge.simcpux.wxapi包下的WXPayEntryActivity类中。可以直接拷贝微信Demo中的WXPayEntryActivity。
在onRest函数中接收回调参数
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode) {
case 0:
ToastUtils.showShortToast("支付成功");
RxBus.getInstance().post(new RxEvent(Constant.WXPAY_PAY_SUCCESS));
break;
case -1:
ToastUtils.showShortToast("支付失败");
RxBus.getInstance().post(new RxEvent(Constant.WXPAY_PAY_FAIL));
break;
case -2:
ToastUtils.showShortToast("取消支付");
RxBus.getInstance().post(new RxEvent(Constant.WXPAY_PAY_CANCEL));
break;
default:
break;
}
}
完整代码:
public class WXPayUtils {
private static WXPayUtils instance;
private WXPayUtils() {
}
public static WXPayUtils getInstance() {
if (instance == null) {
instance = new WXPayUtils();
}
return instance;
}
public void pay(Context context, PayReq req) {
IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
msgApi.registerApp(Constant.WX_APP_ID);
if (!msgApi.isWXAppInstalled()) {
ToastUtils.showShortToast("没有安装微信,请安装后再试");
return;
}
if (!msgApi.isWXAppSupportAPI()) {
ToastUtils.showShortToast("当前版本不支持支付功能");
return;
}
msgApi.sendReq(req);
}
}