找回密码
 立即注册

QQ登录

只需一步,快速开始

微信公众号开发资源

关注:783

所属分类: 微信开发 微信公众号开发资源

本版块为微信公众号开发教程与公众号开发相关技术分享板块,技术提问请到其他对应的问答板块发帖:)

[公众号开发博客] 微信支付开发的一些坑

[复制链接]
查看: 1330|回复: 4
最佳答案
0 

3

主题

3

帖子

60

积分

新人求带

积分
60
 楼主| 发表于 2017-2-17 18:01:46 | 显示全部楼层 |阅读模式
本文说明

现在很多项目都会集成微信登陆授权、微信公众号授权或者微信支付,然而当我们根据微信的开发文档进行开发的时候会发现,一个又一个的坑,  
尤其是微信支付,demo还是eclipse的,令人捉急。本文仅仅简单介绍一下在公司开发时集成微信APP支付的流程,以及开发中的几个坑。

开发流程

让产品经理去微信开放平台注册应用,获取AppID、AppSecret,并申请开通微信支付功能。如果开通成功,微信会分配给你的公司一个商户号, 作为支付的账户。

注意:微信开放平台注册app的时候,需要提供应用的包名和签名,其中应用的签名可以根据微信的开发文档中的方法(https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5)来获取;整个申请过程需要资质认证等,十分麻烦,大概需要3-5天左右,所以需要提醒产品经理提前申请,当然,如果人家是个资深产品,就不要废话了。

根据微信支付的文档进行开发,首先引入微信的jar包libammsdk.jar

开始写代码,首先注册APPID,调起自己家的服务器,让服务器去调用统一下单的API生成预支付订单,获取到prepay_id.
38fy.jpg

该方法用于判断手机端是否安装微信,以及微信版本是否支持支付功能。
11.jpg

该方法就是向自己的服务器发送请求,让它去获取prepay_id,然后返回给app端。
22.jpg

调起微信客户端:实现PayReq类,封装参数,然后调起微信客户端。此段代码,直接复制自微信的demo,稍加改动。
333.jpg

注意:服务端调用微信的统一下单的api之后,统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay。

支付结果回调

参照微信SDK Sample,在包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。
555.jpg
66.jpg
0 成功 展示成功页面
-1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。

微信明确提出,不能以客户端返回的数据为准,必须主动向自己的服务器查询支付结果,然后服务器去向微信的服务器查询订单的支付结果,然后展示在自己的界面上。所以,微信需要自己的应用中有一个展示支付结果的界面,这一点和支付宝不一样,因为支付宝返回的结果直接就可以作为最终的订单结果。

查询的代码就不贴出来了,有可能是自己将prepay_id传递给服务器,然后服务器去查询,返回过来一堆订单的数据,选择一部分展示到界面上即可。展示样例:
77.jpg
(自己家的不能给,贴个别人家的,这个是产品和UI做)

Hole坑

在保证流程正确的前提下,给大家介绍几种常见问题
1. 在成功注册了正确的APPID的前提下,如果回调结果返回-1,你的第一反应应该是什么,是签名错误!!!请让服务端核对签名,当然对调其  
微信客户端的参数签名应该放在服务端去做,即安全又合理,我们app端仅仅是做了传递参数。但是希望大家都了解这个签名过程,我所接触过的  
很多收银的签名算法都是这个过程:排序->拼接key->MD5加密。
2. 由于调其微信支付的时候需要将APPID注册到微信客户端中,并且将订单数据传给微信,所以在未调试成功之前如果返回结果-1,那么下次调试  
的时候需要清空微信客户端的数据,这个也很重要。(设置-应用-微信-清空数据)  
3. 在调试微信的时候,要求必须使用正式的签名文件keystore,但是我们studio直接运行,使用的是默认的签名文件,所以有两种选择:   
每次调试都要生成apk安装;或者在gradle里写下这句话,并将keystore放在app目录下:   
88.jpg

比如,如果签名名称为wall.keystore,那么就会到app目录下找这个文件。
一定注意,在上线的时候要删除掉这个签名文件,并且注释掉这段话!
回复

使用道具 举报

最佳答案
0 

1

主题

25

帖子

105

积分

新人求带

积分
105
发表于 2017-2-22 17:12:35 | 显示全部楼层
dsgfdsag 强烈支持楼主ing……
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

92

帖子

2191

积分

专家路上

积分
2191
发表于 2017-2-26 19:58:16 | 显示全部楼层
哈哈,楼主不错
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

8

帖子

44

积分

新人求带

积分
44
发表于 2017-2-26 23:30:29 来自手机 | 显示全部楼层
楼主辛苦啦
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

61

帖子

373

积分

略知一二

积分
373
发表于 2017-3-10 10:13:21 | 显示全部楼层

楼主辛苦了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


易域网-您身边的域名管家

henkuai.com是专业的第三方微信开发者平台,为生态而生。


本站为第三方微信开发者平台,非腾讯官方网站。

天津市滨海新区
中新生态城中成大道生态建设公寓9号楼3层301

欢迎来这里一起喝喝茶,
聊聊你的产品。

微信公众号gongzhongkaifa

工作日12小时内回复。

网站业务
zhongcong@henkuai.com

工作日12小时内回复。

市场合作
songchang@henkuai.com