这段时间在做微信支付开发,在公司的公众号审批下来后,我这边的测试用例也已经开发完毕,于是拿着具体的数据来调试了,大段大段的代码就不贴了,demo里有,这里就说说调试过程中遇到的坑。
第一坑:redirect_url参数错误。因为我选择的的“JS API”支付,这种支付需要网页授权,先获取code,再拿code去获取openid和prepay_id。这个网页授权需要登录微信公众平台,点击左侧菜单“开发者中心”,在右侧“权限列表”中找到“网页账号”,点击最右侧的修改,把测试的网址写进去,注意不要加http。填好后,这个坑就趟过去了。
第二坑:invalide code。趟过第一坑后,会返回code,再拿此code去获取openid,但是每次到这步时微信那边都返回这个{"errcode":40029,"errmsg":"invalid code"},此坑卡了我整整半个下午。在周天的时候,我又仔细看了开发文档,没得要领,最后又仔细检查了下程序中每次回调的参数。这一检查,就发现要领了,先把回调地址写的最简单,啥参数都不带,成功;接着,一个一个参数带上去,直到带上token这个参数时,返回了invalid code。哈,我猜应该是此参数和微信那边有冲突吧,于是把此参数改成了其他的,此坑立马就过了,接下来支付就一下子调试成功。
第三坑:系统繁忙,正在升级,请稍后再试。周末调试成功后,便把测试代码整合到项目中,开始支付。但是到了支付界面时,便出现了此问题,怎么找到都发现不了问题,点击周末的测试链接又是好的。下午时又仔细看了下上下游的的传递的参数,发现了问题所在。每次上游传递过来的支付金额total_fee都是“1.00”这种类型,因为微信支付的基本单位是分,于是把手动把1.00该为1,成功了。看来是微信支付那边total_fee不能接收小数点,于是我和上游的同事协调了下,传递过来的金额没有小数点,此坑也就过了。
【更新 2015-01-26】
今天测试发现在iphone4上,支付不成功,于是进入测试机调试,发现问题出在第一坑中,把body参数去掉,就ok了,看来在微信支付时,最好少带参数。
【更新 2015-01-30】
下午,QA说微信支付又不成功了,提示“统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!”。我进入测试机中调试,发现服务器中curl请求微信平台返回的都是NULL,提示不管用,接着又打印curl的报错信息,输出为77,去curl错误码查询了下,提示是SSL证书的问题,于是我在服务器重新安装了证书,并重启了php-fpm,之后便能支付了。
sudo yum install ca-certificates
service php-fpm restart
【更新 2015-02-27】
今天支付接入了商城相关逻辑,写完后,我又测试了以前的会员卡支付的,发现在支付阶段提示失败,于是加上测试语句,提示“getBrandWCPayRequest:fail_no permission to execute”(注:iphone5s手机),后来找到了部小米的,进入支付提示“system:access_denied”,进入文档一查,原来是授权目录错误,改回来后就好了,应该是QA在年前改的,折腾。
【更新 2015-03-30】
上午看到QA在禅道又提了个关于微信支付的bug,说是报“package中的参数partner或者prepay_id为空”的错误。于是我轻车熟路的进入到调试模式,经过几次测试,发现微信支付一旦超过十万便会出现上述提示,若是打上断点调试语句的话,会发现微信返回{"errcode":"FAIL","errmsg":"invalid total_fee"}。知道微信支付额度上限,那么只需在后台设置最大不超过十万即可。