美文网首页
Android第三方支付—微信支付详解与坑

Android第三方支付—微信支付详解与坑

作者: 啊耀 | 来源:发表于2018-07-06 17:45 被阅读95次

    一、前言

    最近刚好有空,把之前微信支付遇到的坑总结了一下。要想在自己的APP中实现APP支付必须申请开通支付功能,这些按着文档来就行啦,我还是直接说android中的问题吧。

    一、注意签名

    一定要在开放平台为自己的APP配置正确的包名和签名(签名:将APP打一个正式环境的包,然后在微信开放平台下载签名工具进行签名即可)。

    一、打包测试

    和微信的第三方登录一样,必须要打正式包,不是debug的,来进行测试,这样就没有办法调试了,很麻烦。这里提供一个方法:
    在build.gradle文件中设置debug环境和relealse环境的签名相同就可以解决这个问题了,已经试过了,可以使用。

      signingConfigs {
            /**
             * 设置你的keystore相关
             */
            debug {
                keyAlias 'xxx'
                keyPassword 'xxx'
                storeFile file('xxx.jks')
                storePassword 'xxx'
            }
           release {
                keyAlias 'xxx'
                keyPassword 'xxx'
                storeFile file('xxx.jks')
                storePassword 'xxx'
            }
        }
    

    接下来按着官网的文档和demo来完成:

    1、定义一个全局的变量:

     private IWXAPI api;
    

    2、注册APPID

    api = WXAPIFactory.createWXAPI(this, "你在微信开放平台创建的app的APPID");
    

    官网是这样注册的,但是,下面要用到msgAPi,我是在Application中初始化。

    /**
         * 初始化微信登录和支付
         */
        public void registerToWX() {
            //AppConst.WEIXIN.APP_ID是指你应用在微信开放平台上的AppID,记得替换。
            mWxApi = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false);
            //将该app注册到微信
            mWxApi.registerApp(Constants.APP_ID);
        }
    

    3、开始支付

    当你点击支付的时候去调用服务端的接口(服务端调用统一下单接口,反馈一些信息),所以这里你不能自己独立完成需要后端的支持。

                              WXPay wxpay = new Gson().fromJson(jsonObj.toString(), WXPay.class);
                                if (wxpay != null) {
                                    if (!TextUtils.isEmpty(wxpay.getPayparam().getPrepayid())) {
                                        PayReq req = new PayReq();
                                        req.appId = wxpay.getPayparam().getAppid();
                                        req.partnerId = wxpay.getPayparam().getPartnerid();// 微信支付分配的商户号
                                        req.prepayId = wxpay.getPayparam().getPrepayid();// 预支付订单号,app服务器调用“统一下单”接口获取
                                        req.nonceStr = wxpay.getPayparam().getNoncestr();// 随机字符串,不长于32位,服务器生成
                                        req.timeStamp = wxpay.getPayparam().getTimestamp();// 时间戳
                                        req.packageValue = "Sign=WXPay";// 固定值Sign=WXPay,可以直接写死,服务器返回的也是这个固定值
                                        req.sign = wxpay.getPayparam().getSign();//签名
                                        //在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
                                        api.sendReq(req);
                                        //isJump 0默认表示微信部分支付;1表示最后结算,需要跳转
                                        isJump = 1;
                                        mActivity.finish();
                                    }
                                }
                            }
    

    4、接下来就是在微信里的一些东西了,我们不用管,我们只需要关心回调页WXPayEntryActivity,这里需要注意该文件必须在wxapi这个文件夹下,及com.xxx.xxx.wxapi.WXPayEntryActivity

    //必须实现接口,重写方法
    public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
    
        private static final String TAG = ".WXPayEntryActivity";
        private IWXAPI api;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    //        setContentView(R.layout.pay_result);
            api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
            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) {
            Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
           //这里就是支付完成后需要做的事,如跳到其他页面等等
            if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
                switch (resp.errCode) {
                     case 0:
                        //isJump 0默认表示微信部分支付;1表示最后结算,需要跳转
                        if (isJump == 1) {
                            MToast.showToast("支付成功~");
                            startActivity(new Intent(this, xxxActivity.class);
                        } else {
                            MToast.showToast("进度款支付成功~");
                        }
                        Log.e("ayao", "微信支付>>>" + resp.errCode);
                        break;
                    case -1:
                        MToast.showToast("支付失败~");
                        break;
                    case -2:
                        MToast.showToast("取消支付~");
                        break;
                    default:
                }
    
                finish();
            }
        }
    }
    

    5、记得要在功能清单中对Activity中进行注册

    <!--微信支付-->
     <activity android:name=".wxapi.WXPayEntryActivity"
               android:exported="true"
               android:launchMode="singleTop"/>
    

    四、总结

    其实不管是微信支付还是登陆,按照文档一步一步来,注意事项做好,基本就没什么问题,还有就是根据项目操作。我的项目就是有一个是分段支付,分段支付不需要跳转页面;有一个是最终的结算支付,结算支付完成需要跳转页面,所以需要做点判断。

    我是阿耀:

    有码走遍天下 无码寸步难行

    1024 - 梦想,永不止步!
    爱编程 不爱Bug
    爱加班 不爱黑眼圈
    固执 但不偏执
    疯狂 但不疯癫
    生活里的菜鸟
    工作中的大神
    身怀宝藏,一心憧憬星辰大海
    追求极致,目标始于高山之巅
    一群怀揣好奇,梦想改变世界的孩子
    一群追日逐浪,正在改变世界的极客
    你们用最美的语言,诠释着科技的力量
    你们用极速的创新,引领着时代的变迁
    ------至所有正在努力奋斗的程序猿们!加油!!

    相关文章

      网友评论

          本文标题:Android第三方支付—微信支付详解与坑

          本文链接:https://www.haomeiwen.com/subject/gqjbuftx.html