微信支付问题总结

来源:互联网 发布:外汇 交易系统测试软件 编辑:程序博客网 时间:2024/05/01 18:48

开发步骤:

1、到微信开放平台https://open.weixin.qq.com,登记开发应用提交相应的材料(1、提交的图片有28*28px png 大小不超过300kb的应用图标 2、高清应用图标108*108px png格式 大小不超过300kb的应用图标),将该应用提交审核,审核大约是一天左右。还要给你的应用做签名,签名生成工具 运行到手机上对你的qpp进行应用签名,也就是让微信认识这个app。微信支付还要另外在审核提交的材料其中有图片(商品详情图片,版权图片,支付图片相应的规格参考微信平台)这个审核估计得两三天。

2、下载微信开发工具包集成到开发环境:Android开发工具包 这个包最好是最新版的,因为之后的签名版本之间存在差别,(注意如果有做混淆代码在混淆文件中加入下面配置)

-keep class com.tencent.mm.sdk.** { *;}
3、使用开发工具进行调起微信登陆或微信支付首先要注册IWXAPI 

// IWXAPI 是第三方app和微信通信的openapi接口private IWXAPI api;
// 通过WXAPIFactory工厂,获取IWXAPI的实例api= WXAPIFactory.createWXAPI(this, Constants.APP_ID);api.registerApp(Constants.APP_ID);

 微信登陆时直接

api.handleIntent(getIntent(), this);实现IWXAPIEventHandler回调微信支付是:
PayReq request = new PayReq();WXCreateOrder.BodyEntity body = result.getBody();request.appId = body.getAppid();request.partnerId=body.getPartnerid();request.prepayId= body.getPrepayid();request.packageValue = body.getPackageX();request.nonceStr=body.getNoncestr();request.timeStamp=body.getTimestamp();request.sign=body.getPaySign();
 直接调起支付连链接地址都不用你管这里面7个参数分别是应用id,合作商户id,预支付id,扩展字段,随机字符串,时间戳,签名。
前6个参数通常不会有问题,第七个参数是最容易出现问题,它签名规则是1.参数名按ASCII码顺序排列拼接商户key值 2.区分大小写。
app调起微信支付的时候是只要返回错误信息,也没有打log,所以是很难判断你是哪里出错,而且测试时用的debug.keystore 和打包后的keystore不一样。
所以相当于你每测试一次就打包一次及其麻烦。印象中是可以配置,所以抱着试试看到想法到网上查了相关资料发现是可以在build.gradle里进行配置配置如下:

android{

signingConfigs{    releaseConfigs{        storeFile file("/awork/workpace/user/kestory.jks")        storePassword "hlj66" keyAlias "hlj" keyPassword "hlj666666" }    debugConfigs{        storeFile file("/awork/workpace/user/kestory.jks")        storePassword "hlj66" keyAlias "hlj" keyPassword "hlj666666" }}
buildTypes {    debug {        signingConfig signingConfigs.debugConfigs        buildConfigField "boolean", "ISDEBUG", "true" }

}这样你的测试环境和正式打包的应用签名是一致的,也就是前面所说的微信才会认识这个app,这是一个坑
 

遇到的一些问题:

1、当初应用签名,后来忘记签名的密码,所以我重新修改了开放平台上的应用签名,重新测试发现连微信登陆都调不起,我后来查找了相关资料发现,当你使用微信登陆或分享的时候,微信的客户端会存储你的app在微信开放平台上配置的包名跟应用签名,如果你在自己的应用里面第一次使用微信登陆或分享后,你的应用相关的信息就会被微信客户端记录了,这时候你再换一个签名文件更改你的应用签名,点微信登陆就会出现没反应,并且友盟的那些回调都没有调用的情况,在更改签名后如果发现自己所有的配置和代码都没有问题的话可以删除手机上的微信。然后重新安装应用即可(网摘)
2、之前所说的应用的keystore一定是要微信认识的,一定要确认好

3、配置工程问题:必须要有wxapi这个包名(而且必须在你注册的微信应用包名下,比如你注册的包名是com.rs.user,那么wxapi,必须是com.rs.user.wxapi),同时必须有WXPayEntryActivity这个类名,否则无法调起微信支付,(开发文档没有标注,废了好大周章).不只是这个还有微信登陆也是名称是WXEntryActivity,也是在wxapi下。此外一定要记得在AndroidManifest.xml下配置该Activity

<activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop" />

 4、WXPayEntryActivity监听微信支付的结果你在这里注册api,轮询监听支付结果:

 

@Overridepublic void onResp(BaseResp resp) {      if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {      AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.app_tip); builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode))); builder.show(); }}

5、当一直返回-1(可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等),当你确定你的应用签名无误,应用id存在,并且可用。这个时候你可能就会怀疑后端给你返回的是否有误。我之前一直尝试自己去做签名验证,后来真的可以了。其实这样是没有必要的,如果你怀疑后端给你的数据有误微信开放平台上是有在线签名验证的 点击进入 

另外说一下它的大体流程:

用户在app端选择商品下单点击去支付---->app把商品信息传给后端------->后端对信息进行加密(规则微信开放平台上)发给微信,获取预支付id------->因为客户端调起微信支付需要7个参数,服务端做好再一次签名传给app(这个签名放在服务端是比较安全的,它的签名包括了app端看不到商户key)--------》app获取参数调起微信支付------》微信平台上的事,app这里负责监听支付结果结束后自动返回该app页面

 

注:下划线表示可以让设计先去把需要的图片做好,到申请时可以直接用

        申请涉及商户账目所以最好是给相关人员去申请,涉及到类似应用签名的技术配合即可
        审核也需要时间,所以最好提前申请 

0 0
原创粉丝点击