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

一、前言

最近刚好有空,把之前微信支付遇到的坑总结了一下。要想在自己的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中进行注册


 

四、总结

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

我是阿耀:

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

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

你可能感兴趣的:(Android第三方支付—微信支付详解与坑)