Android集成微信支付

    xiaoxiao2021-12-02  19

    总要说两句 微信支付、支付宝支付用的越来越多,刚在项目中实践,记录一下Android集成方法,以及集成过程中的一些需要注意的细节。(有一些小细节耽误我不少时间)

    1、首先要在微信开放平台注册,添加自己的APP并成功申请支付功能

    2、下载微信SDK集成到项目中

    导入jar包添加WXPayEntryActivity.java到.wxapi包下,这个wxapi包必须是放在当前应用包之下,如果要集成微信登陆或者微信分享,也是在同样的包下添加WXEntryActivity.java。WXPayEntryActivity中要实现绑定回调 public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { private IWXAPI api; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); api = WXAPIFactory.createWXAPI(this, "微信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) { } } manifest中注册WXPayEntryActivity <activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop"/> 在wxapi包下新建AppRegister.java,这个是广播接收者 public class AppRegister extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, appId); // 将该app注册到微信 msgApi.registerApp("微信appId"); } } 并在manifest中注册这个广播接收者,这个是固定的写法 <receiver android:name=".wxapi.AppRegister"> <intent-filter> <action android:name="com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" /> </intent-filter> </receiver>

    3、在适当的地方把app注册到微信

    public boolean registerWXAPP() { mAppId = "微信appId"; if (mWXApi == null) { mWXApi = WXAPIFactory.createWXAPI(context, mAppId); } if (!mWXApi.isWXAppInstalled() || mWXApi.getWXAppSupportAPI() < 0x21020001) { showToast("您未安装微信/微信版本过低"); return false; } return mWXApi.registerApp(mAppId); }

    4、调用统一下单接口(https://api.mch.weixin.qq.com/pay/unifiedorder)生成订单,返回一系列参数给app,最重要的是prePayId,最终发起支付就是用它的。 (因为我的项目是在后台服务端生成,所以这步暂时不写,后面再补上。)

    5、发起支付

    PayReq request = new PayReq(); request.appId = "微信appId"; request.partnerId = "收款方商户id"; request.prepayId= "预支付订单id"; request.packageValue = "Sign=WXPay";//死值 request.nonceStr= "随机字符串"; request.timeStamp= "当前时间戳"; request.sign= "签名"; boolean checkArgs = request.checkArgs(); if(checkArgs ) { mWXApi.sendReq(request); }

    重点解释一下几个参数: prepayId:统一下单接口返回的预支付订单id,最重要的参数 nonceStr:随机字符串,我就用UUID生成的,截取32位,微信要求不能超过32位 sign:这个参数最复杂,要用前6个参数,按照ASCII码顺序,依次key=value&key=value的形式拼接起来,最后再拼接key=”API_KEY”,然后MD5生成32位字符串。 (这个API_KEY是商户平台配置的,微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置)

    SortedMap<String, String> map = new TreeMap<String, String>(); map.put("appid", "xxx"); map.put("partnerid", "xxx"); map.put("prepayid", "xxx"); map.put("package", "xxx"); map.put("noncestr", "xxx"); map.put("timestamp", "xxx"); StringBuilder sb = new StringBuilder(); Set ese = map.entrySet(); Iterator it = es.iterator(); while(it.hasNext()) { Entry entry = it.next(); String k = entry.getKey(); String v = entry.getValue(); sb.append(k + "=" + v + "&"); } sb.append("key=" + "API_KEY"); return MD5Util.encode(sb.toString());//最终的sign

    6、添加混淆配置

    -keep class com.tencent.mm.sdk.** { *; }

    7、接下来就是微信支付界面,支付结束后,需要获取返回结果,在WXPayEntryActivity中回调处理

    @Override public void onResp(BaseResp resp) { if(resp.getType()== ConstantsAPI.COMMAND_PAY_BY_WX){ LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this); Intent intent = new Intent(ACTION_WX_PAY_RESULT); intent.putExtra(KEY_WX_PAY_RESULT_CODE, resp.errCode); lbm.sendBroadcast(intent); } }

    因为我们最终要把支付结果传到我们自己的activity中,所以我用户了LocalBroadcastManager 。

    resp.errCode就是支付结果,0成功,-1失败,-2取消。

    8、接受broadcast

    private LocalBroadcastManager mLocalBroadcastManager; private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int code= intent.getIntExtra("payResult", -1); ... } }; mLocalBroadcastManager = LocalBroadcastManager.getInstance(this); mLocalBroadcastManager.registerReceiver(receiver, new IntentFilter("wxPayResult")); @Override protected void onDestroy() { super.onDestroy(); mLocalBroadcastManager.unregisterReceiver(receiver); }

    这样,微信支付就基本集成完毕了,当然真正项目中肯定不可能这么简单,我记录的只是纯碎的微信支付的代码,真正项目中肯定还有很多的业务逻辑需要处理。

    今天先记录这么多,过两天我再优化一下细节的地方。

    Thank you~

    转载请注明原文地址: https://ju.6miu.com/read-679794.html

    最新回复(0)