android微信支付详解与坑

作者: 流水潺湲 | 来源:发表于2017-05-09 16:58 被阅读683次

要想在自己的APP中实现APP支付必须申请开通支付功能,这些按着文档来吧,我还是直接说Android中的问题吧。

一、签名

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

二、打包测试

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

 signingConfigs {

        release {
            //.jks文件放在项目目录
            storeFile file("xxx.jks")
            storePassword "xxx"
            keyAlias "xxx.release"
            keyPassword "xxx"
        }
        debug {
            //.jks文件放在项目目录
            storeFile file("xxx.jks")
            storePassword "xxx"
            keyAlias "xxx.release"
            keyPassword "xxx"
        }
    }

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

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

private IWXAPI api;

2、注册APPID

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

官网是这样注册的,但是,下面要用到msgAPi,所以定义为全局的。

final IWXAPI msgApi = WXAPIFactory.createWXAPI(SelectPaymentMethodActivity.this, null);
msgApi.registerApp("你在微信开放平台创建的app的APPID");


3、开始支付

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

//我将后端反给我的信息放到了WeiXinPay中,这步是获取数据

WeiXinPay weiXinPay = (WeiXinPay) map.get("weixinpay");

//这个在官网里就会看到,将你获取的信息赋给payReq,这块就是调起微信的关键

PayReq payReq = new PayReq();
payReq.appId = weiXinPay.getAppid();
payReq.partnerId = weiXinPay.getPartnerid();
payReq.prepayId = weiXinPay.getPrepayid();
payReq.packageValue = weiXinPay.getPackage_exten();
payReq.nonceStr = weiXinPay.getNoncestr();
payReq.timeStamp = weiXinPay.getTimestamp();
payReq.sign = weiXinPay.getSign();
api.sendReq(payReq);

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

//必须实现接口,重写方法
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {

    private IWXAPI api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wxpayentry);
        api = WXAPIFactory.createWXAPI(this, "wx72e0123dd9b54a73");
        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp baseResp) {
        Log.e("---------->","code:"+baseResp.errCode);

        if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            //这里就是支付完成后需要做的事,如跳到哪个页面啥的
        }
    }
}

5、还有一点在功能清单中对Activity中进行注册

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




-1 扫坑(可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等)


微信

商户系统和微信支付系统主要交互说明:

  • 步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
  • 步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。
  • 步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式为Sign=WXPay
  • 步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明
  • 步骤5:商户后台接收支付通知。api参见【支付结果通知API
  • 步骤6:商户后台查询支付结果。,api参见【查询订单API

调起支付接口

请求参数

字段名 变量名 类型 必填 示例值 描述
应用ID appid String(32) wx8888888888888888 微信开放平台审核通过的应用APPID
商户号 partnerid String(32) 1900000109 微信支付分配的商户号
预支付交易会话ID prepayid String(32) WX1217752501201407033233368018 微信返回的支付交易会话ID
扩展字段 package String(128) Sign=WXPay 暂填写固定值Sign=WXPay
随机字符串 noncestr String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串,不长于32位。推荐随机数生成算法
时间戳 timestamp String(10) 1412000000 时间戳,请见接口规则-参数规定
签名 sign String(32) C380BEC2BFD727A4B6845133519F3AD6 签名,详见签名生成算法注意:签名方式一定要与统一下单接口使用的一致

举例请见:APP端开发说明

返回结果

名称 描述 解决方案
0 成功 展示成功页面
-1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。

几大坑原因+解决:

  • 1、 微信开放平台上传的签名问题(调试环境使用的签名要和微信后台保持一致)
  • 2、 Manifest文件中WXPayEntryActivity 的配置问题。一定要声明
  • 3、 WXPayEntryActivity 类必须放在 包名.wxapi 下
  • 4、 签名工作一般由后台完成,在生成签名时,务必注意key的拼写问题,比如必须拼appid而不是appId,必须拼prepayid而不是prepayId,这里跟上面PayReq 对象中字段的命名方式不一样,用错了也是照样返回-1。一定要小写!!!参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式为Sign=WXPay
  • 5、签名所使用的是 微信商户平台API密钥,而不是微信开放平台AppSecret。 API密钥在商户平台后台-->API安全-->先安装操作证书,后设置密钥
  • 6、清空缓存,最后再说一个坑,如果经过一系列的配置,发现完全都配置好了,可是微信支付依然返回-1。而此时我们可能又会回头排查各个节点的问题,是配置问题?是自己的数据传递问题?到底哪里的bug?
    其实这时候,清空下自己的应用缓存就可以了,通过 设置-应用管理-your app-清空缓存,进行缓存清理过后,立竿见影拿到成功的回调!

参考文档:

微信支付申请流程
微信支付签名的配置
微信支付步骤
微信支付与坑
微信支付失败-1彻底扫坑

相关文章

网友评论

    本文标题:android微信支付详解与坑

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