关于微信支付

微信支付的官方文档:
https://pay.weixin.qq.com/wiki/doc/api/index.html
php的sdk下载地址:
https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip

这里文档和sdk都比较详细,基本上换掉sdk的证书文件夹和配置文件就可以使用,但是还是有不少坑

首先要在公众平台上设置测试授权目录,还有测试白名单,这个就不细说了

重点说下实际中可能会遇到的问题

第一个是错误码60

是因为https证书校验失败

解决方法
WxPay.Api.php537行

1
2
3
4
5
6
7
8
9
10
11
12
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验

//改为
if (stripos($url, "https://") !== FALSE) {
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
} else {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);//严格校验
}

第二个是错误码28

是因为连接超时

我们可以修在下单的时候延长超时时间,sdk的下单的接口默认是6秒

可以给定30秒的超时时间

1
\WxPayApi::unifiedOrder($input, 30);

第三个是在回调的时候回调失败,报xml数据异常

WxPay.Api.php 411行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
*
* 支付结果通用通知
* @param function $callback
* 直接回调函数使用方法: notify(you_function);
* 回调类成员函数方法:notify(array($this, you_function));
* $callback 原型为:function function_name($data){}
*/

public static function notify($callback, &$msg)
{
//获取通知的数据
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
//如果返回成功则验证签名
try {
$result = WxPayResults::Init($xml);
} catch (WxPayException $e){
$msg = $e->errorMessage();
return false;
}

return call_user_func($callback, $result);
}

如果php.ini 不是always_populate_raw_post_data = On的话

1
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];

会接受不到数据

这时候如果不改配置文件的话

可以改为

1
$xml = file_get_contents('php://input');