前言
我们在做App的时候,可能需要接入支付功能,常见的支付有微信支付
和支付宝支付
。这里只说明下前端的代码逻辑。
微信支付
-
需要申请appId,申请的时候需要填写包名(packagename),签名等信息。
-
在AndroidStudio中加入依赖(as3.1.3版本)
//微信支付
// gradle3.0以下使用compile,以上可以api
api 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
- 初始化支付
private void regToWx() {
IWXAPI api;
WX_APP_ID = "xxxxxxxxxx";//这里写你的appId
api = WXAPIFactory.createWXAPI(this, WX_APP_ID, true);
api.registerApp(WX_APP_ID);
}
- 调起支付
这里需要请求后台服务器返回订单信息,一一赋值就行
IWXAPI api;
PayReq request = new PayReq();
request.appId = "wxd930ea5d5a258f4f";
request.partnerId = "1900000109";
request.prepayId= "1101000000140415649af9fc314aa427",;
request.packageValue = "Sign=WXPay";
request.nonceStr= "1101000000140429eb40476f8896f4c9";
request.timeStamp= "1398746574";
request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";
api.sendReq(request);
- 支付结果回调
在当前包名下新建wxapi
包,创建WXPayEntryActivity
类,记得在清单文件中声明
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, getResources().getString(R.string.wx_appid));
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) {
LogUtil.d("onPayFinish, errCode = " + resp.errCode);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
PayEvent payEvent = new PayEvent();
payEvent.payType = PayEvent.WECHAT;
payEvent.code = resp.errCode;// 0成功 ,-1失败, -2取消
EventBus.getDefault().post(payEvent);//这里使用EventBus去通知支付结果
}
finish();
}
}
错误码说明表
| 名称|描述 |解决方案 |
|--|--|--|
| 0 |成功 |展示成功页面 |
| -1 | 错误 |可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。 |
| -2 | 用户取消 |无需处理。发生场景:用户不支付了,点击取消,返回APP。 |
支付宝支付
-
需要申请appId,申请的时候需要填写包名(packagename),签名等信息。
-
加入依赖jar包
- 调起支付
final String orderInfo = aliEntity.payStr; // 订单信息
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(Activity.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 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(UserAccountRechargeActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
Toast.makeText(UserAccountRechargeActivity.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”则代表授权成功,具体状态码代表含义可参考授权接口文档
if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
// 获取alipay_open_id,调支付时作为参数extern_token 的value
// 传入,则支付账户为该授权账户
Toast.makeText(UserAccountRechargeActivity.this,
"授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT)
.show();
} else {
// 其他状态值则为授权失败
Toast.makeText(UserAccountRechargeActivity.this,
"授权失败" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();
}
break;
}
default:
break;
}
}
};
网友评论