微信App支付总结(返回-1什么的最e心)

来源:互联网 发布:小口拴在淘宝怎么买 编辑:程序博客网 时间:2024/04/29 20:25

微信支付总结

简介

微信支付商户平台官网:https://pay.weixin.qq.com
版权声明:本文为原创文章,未经允许不得转载
更新时间:2016/6/27

本文说明

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

开发流程

  1. 让产品经理去微信开放平台注册应用,获取AppID、AppSecret,并申请开通微信支付功能。如果开通成功,微信会分配给你的公司一个商户号, 作为支付的账户。
    注意:微信开放平台注册app的时候,需要提供应用的包名和签名,其中应用的签名可以根据微信的开发文档中的方法(https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5)来获取;整个申请过程需要资质认证等,十分麻烦,大概需要3-5天左右,所以需要提醒产品经理提前申请,当然,如果人家是个资深产品,就不要废话了。
  2. 根据微信支付的文档进行开发,首先引入微信的jar包libammsdk.jar
  3. 开始写代码,首先注册APPID,调起自己家的服务器,让服务器去调用统一下单的API生成预支付订单,获取到prepay_id.

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

    该方法就是向自己的服务器发送请求,让它去获取prepay_id,然后返回给app端。
  4. 调起微信客户端:实现PayReq类,封装参数,然后调起微信客户端。此段代码,直接复制自微信的demo,稍加改动。

    注意:服务端调用微信的统一下单的api之后,统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay。
  5. 支付结果回调
    参照微信SDK Sample,在包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。


    • 0 成功 展示成功页面
    • -1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
    • -2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。
  6. 微信明确提出,不能以客户端返回的数据为准,必须主动向自己的服务器查询支付结果,然后服务器去向微信的服务器查询订单的支付结果,然后展示在自己的界面上。所以,微信需要自己的应用中有一个展示支付结果的界面,这一点和支付宝不一样,因为支付宝返回的结果直接就可以作为最终的订单结果。
    查询的代码就不贴出来了,有可能是自己将prepay_id传递给服务器,然后服务器去查询,返回过来一堆订单的数据,选择一部分展示到界面上即可。展示样例:

    (自己家的不能给,贴个别人家的,这个是产品和UI做)

Hole坑

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


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

In the end

如果发现问题,欢迎留言或者发邮件到815852777@qq.com,感激不尽。

0 0
原创粉丝点击