简介:本文详细讲解Android应用中调用支付接口的完整流程,涵盖主流支付渠道(支付宝、微信支付)的集成步骤、关键代码实现、安全注意事项及常见问题解决方案,帮助开发者快速实现安全可靠的支付功能。
在Android应用中集成支付功能前,开发者需根据业务需求选择支付渠道。国内市场主流选择包括支付宝支付、微信支付和银联支付,三者合计占据超过95%的市场份额。以微信支付为例,开发者需完成以下步骤:
关键参数说明:
APPID:微信开放平台审核通过的应用IDMCHID:10位数字的商户号APIKEY:32位随机字符串,用于签名验证在Android Studio中,需在build.gradle文件中添加支付SDK依赖:
// 微信支付SDKimplementation 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0'// 支付宝SDKimplementation 'com.alipay.sdk:alipay-sdk-java:4.35.0.ALL'
同时需在AndroidManifest.xml中配置网络权限和支付回调Activity:
<uses-permission android:name="android.permission.INTERNET" /><activityandroid:name=".wxapi.WXPayEntryActivity"android:exported="true"android:launchMode="singleTop"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="wxd930ea5d5a258f4f" /> <!-- 替换为实际APPID --></intent-filter></activity>
微信支付采用”统一下单+回调验证”模式,关键步骤如下:
public void requestWxPay(String orderInfo) {IWXAPI api = WXAPIFactory.createWXAPI(this, APPID);api.registerApp(APPID);// 调用后端接口获取预支付订单RetrofitClient.getInstance().getWxPrepayOrder(orderInfo).enqueue(new Callback<WxPrepayResponse>() {@Overridepublic void onResponse(Call<WxPrepayResponse> call,Response<WxPrepayResponse> response) {WxPrepayResponse data = response.body();if (data != null && "SUCCESS".equals(data.getReturnCode())) {PayReq req = new PayReq();req.appId = data.getAppid();req.partnerId = data.getMchId();req.prepayId = data.getPrepayId();req.packageValue = "Sign=WXPay";req.nonceStr = data.getNonceStr();req.timeStamp = String.valueOf(data.getTimeStamp());req.sign = data.getSign();api.sendReq(req);}}});}
在WXPayEntryActivity中实现支付结果回调:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {private IWXAPI api;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);api = WXAPIFactory.createWXAPI(this, APPID);api.handleIntent(getIntent(), this);}@Overridepublic void onReq(BaseReq req) {}@Overridepublic void onResp(BaseResp resp) {if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {switch (resp.errCode) {case 0: // 支付成功verifyPaymentResult(resp.transaction);break;case -2: // 用户取消Toast.makeText(this, "支付已取消", Toast.LENGTH_SHORT).show();break;default: // 支付失败Toast.makeText(this, "支付失败: " + resp.errStr, Toast.LENGTH_SHORT).show();}finish();}}}
支付宝支付采用”服务端签名+客户端调起”模式,关键实现如下:
public void requestAlipay(String orderInfo) {RetrofitClient.getInstance().getAlipaySign(orderInfo).enqueue(new Callback<AlipaySignResponse>() {@Overridepublic void onResponse(Call<AlipaySignResponse> call,Response<AlipaySignResponse> response) {String signData = response.body().getSignData();Runnable payRunnable = () -> {PayTask alipay = new PayTask(MainActivity.this);Map<String, String> result = alipay.payV2(signData, 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(Looper.getMainLooper()) {@SuppressWarnings("HandlerLeak")public void handleMessage(Message msg) {switch (msg.what) {case SDK_PAY_FLAG: {@SuppressWarnings("unchecked")PayResult payResult = new PayResult((Map<String, String>) msg.obj);String resultStatus = payResult.getResultStatus();if ("9000".equals(resultStatus)) { // 支付成功verifyAlipayResult(payResult.getResult());} else {Toast.makeText(MainActivity.this,"支付失败: " + payResult.getMemo(),Toast.LENGTH_SHORT).show();}break;}}}};
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 微信支付调起失败 | 未正确配置支付授权目录 | 检查微信开放平台配置 |
| 支付宝支付无响应 | 签名算法不匹配 | 确认服务端使用RSA2签名 |
| 支付成功但回调未触发 | 网络问题导致回调丢失 | 实现轮询查询订单状态机制 |
| 重复支付 | 并发请求处理不当 | 添加订单状态锁机制 |
通过系统化的支付接口集成方案,开发者可构建安全、稳定、用户友好的支付功能。建议在实际开发中采用模块化设计,将支付核心逻辑封装为独立模块,便于后续维护和渠道扩展。同时建立完善的支付监控体系,实时跟踪支付成功率、失败率等关键指标,为业务决策提供数据支持。