微信公众号支付的坑几乎都集中在微信商户平台和微信公众号后台的配置上。首先对接前要确认的几项配置如下:
1.微信公众号APPID
2.商户号MCHID
3.KEY商户支付密钥(商户平台设置,设置地址https://pay.weixin.qq.com/index.php/account/api_cert)
4.APPSECRET(登录公众平台,进入开发者中心可设置,如需要重置,请确保当前没有项目使用此APPSECRET,获取地址https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN)
5.回调授权域名(把微信支付回调的地址对应域名配上,在微信公众号后台配置)
6.JS接口安全域名(发起微信支付请求的域名,在微信公众号后台配置)
7.支付授权目录(此项配置与其说是域名,不如说是安全目录更准确,因为配置地址要精确到发起公众号支付的页面目录,例如发起微信支付的页面地址是http://blog.dongguagua.com/pay/abc.html,对应要配置的内容则是http://blog.dongguagua.com/pay/,这里一定要以“/”结尾,这里如果域名首字母是大写的,配置时要用小写,在微信商户平台配置)
至于对接的代码只要遵循官方demo就没啥问题,这里再记录一下支付成功后的异步通知处理代码(demo里也有对应的模块):
public function wxNotice() { $xml = file_get_contents('php://input'); //@todo:记录日志 $arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); ksort($arr); $buff = $this->ToUrlParams($arr); $signData = $buff . '&key=' . \Conf\Conf::$wxmerchant_key; //md5处理,转大写 $sign = strtoupper(md5($signData)); //验签名。默认支持MD5 if ($sign === $arr['sign']) { //@todo:校验返回的订单金额是否与商户的订单金额一致(金额字段要取total_fee,返回字段中的cash_fee为用户实际支付的金额,当微信有一些支付减免活动的时候,total_fee和cash_fee是不相等的)。修改订单表中的支付状态。 //@todo:记录处理成功日志 } else { //@todo:记录处理失败日志 die; } //返回调用成功信息给微信 $return = ['return_code' => 'SUCCESS', 'return_msg' => 'OK']; $returnXml = '<xml>'; foreach ($return as $k => $v) { $returnXml.='<' . $k . '><![CDATA[' . $v . ']]></' . $k . '>'; } $returnXml.='</xml>'; echo $returnXml; die; }还有一处容易踩坑的地方,在转换以分为单位的支付金额问题上,容易发生精度丢失的问题。比如一个订单需要支付71.1元,在请求统一下单接口时,需要传一个单位为分的金额值,即7110,如果这里用简单的乘法计算71.1*100,然后再进行转整,实际结果就会得到7109 。大致情况如下:
$amount = 71.1*100; $res = sprintf('%d',$amount); echo $res; //结果为7109得出这个结果跟php处理浮点数精度有关,要避免精度丢失可以采用php专有的高精度运算函数应对:
$amount = bcmul(71.1,100); $res = sprintf('%d',$amount); echo $res; //结果为7110
友情提示:垃圾评论一律封号...