10步搞定微信支付的扫码支付

  1. 先要有微信公众号,从公众号左侧菜单进入微信支付,要先申请微信支付,申请经过以后,便可使用,涉及到2个后台:公众号后台支付平台后台php

  2. 首先要获得AppID(应用ID)和AppSecret(应用密钥),获取方法:公众号后台左侧菜单:开发-基本配置,显示密钥须要管理者的微信号扫描验证,另外要获取MCHID商户号(经过支付平台左侧菜单-帐户信息能够看到)和KEY支付密钥https://pay.weixin.qq.com/index.php/account/api_cert,须要绑定手机号的短信验证html

  3. 配置好支付受权目录、测试受权目录、测试白名单(就是测试者的我的微信号),设置方式:公众号后台左侧菜单-微信支付-开发配置,注意:通常在网页上使用扫描支付的模式二(模式二先生成订单再生成二维码且只有2小时的时效性,模式一是先生成二维码,当用户扫描的时候才生成订单,适用户外广告投放等一次性显示没法改变的支付二维码,由于只须要一个产品id便可生成二维码,需在后台设置回调URL,以供当用户扫描二维码时用来生成订单,参考https://www.v2ex.com/t/239674),因此下方的扫码支付回调url能够忽略;受权目录必须到最底层目录ajax

  4. 支付商户平台登陆,能够查看到对应交易记录,并设置退款等操做,集成扫码付的时候无需用到数据库

  5. 获取官方的sdk示例:公众号后台左侧菜单-微信支付-使用教程,选择对应的支付方式获取便可,对应扫码支付,后面选择模式二来集成开发api

  6. 下载sdk后,里面有好几种模式,index.php中已经有连接,选择对应的支付方式便可看到效果,示例中的绑定的帐户是微信官方测试帐户,生成二维码的地址使用了在线地址,而非在本地服务器

  7. 先修改对应的appid、secret、回调地址(就是支付成功后,微信服务器来访问该地址,并带着是否支付成功的参数,这个地址须要判断支付状态,而后修改订单),MCHID商户号(经过支付平台左侧菜单-帐户信息能够看到)和KEY支付密钥,在lib/WxPay.Config.php中,里面有对应注释微信

  8. 在订单支付界面加入微信支付的二维码供用户手机微信扫描支付,sdk中的二维码代码能够直接使用的,显示二维码代码以后,该页面需设定一个ajax去查询订单状态(好比5秒/次,另外直接查询数据库订单状态也可,由于支付成功后,微信支付服务器会访问回调地址,而回调地址会改变订单状态的),查询到支付成功后,弹出对应提示或者作其余操做便可,若是不写ajax查询,用户没法得知支付是否成功app

  9. 回调地址作对应判断写业务逻辑便可curl

  10. 到微信支付后台查看交易是否成功,到此微信支付开发完成函数


注意服务器端须要curl支持,以供程序向微信支付服务器post数据

吐槽一下:官方php的sdk示例里面各类class封装,明显过于封装,绕的太厉害了

开发文档地址:https://pay.weixin.qq.com/wiki/doc/api/index.html

其余的坑:

  1. 调试的时候,大部分问题是出在php的curl访问微信支付服务器这个环节,常常出现500错误,因此要设置错误信息调试,开启log日志,查看开启方式,一些出错解决方案:http://my.oschina.net/kaykay012/blog/501602,着重讲一下WxPay.Api.php:修改文件WxPay.Api.php,具体以下:第537行左右:

    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
    修改为:
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);//严格校验2
  2. php的sdk中使用了一些函数,须要对应php版本,好比libxml_disable_entity_loader函数须要5.2.11及以上版本支持,若是要保持在php5.2系列,请使用最新的php5.2.17

  3. sdk中的native提示“time_expire时间太短,刷卡至少1分钟,其余5分钟”,将sdk中的SetTime_expire注释,由于这个不是必需参数,模式二默认是2小时

  4. 能够直接使用sdk中提供的微信二维码地址来展现二维码,无需本身在服务器上生成二维码,方便了很多

  5. 我的遇到最大的一个坑,sdk中将libxml_disable_entity_loader设置成了true,禁止引用外部xml实体,而我恰好在回调url地址用了外部的soap,致使soap老是失败,解决方案是在soap前设置libxml_disable_entity_loader(false);这个问题浪费了我5个小时


总结:千万别用官方sdk,用来参考,最好本身写,否则命都填进去了

相关文章
相关标签/搜索