对,这边我要开喷了。
首当其冲的是支付宝服务窗的接口开发文档
https://fuwu.alipay.com/platform/doc.htm
特么的PHP开发文档里面一堆堆的文件,有用的就一个AlipaySign.php
真不知道为什么本来这么简单的一个接口被他们接近200个文件来实现。

还引入了一个lotusphp框架,这还真的有人上钩了,用的他们的SDK直接部署业务见这里,花了特么半个晚上梳理了一下他们的接口逻辑,总算把真正需要的部分给剥离出来了。

开头先引用一个AlipaySign.php

接口验证的话只要下面的部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function checkfuwuSignature(){
global $fvar;
$msgs = $_POST;
unset($msgs['sign']);
ksort($msgs, SORT_STRING);
if(AlipaySign::rsa_verify(urldecode(http_build_query($msgs)), $_POST['sign'], 支付宝公钥文件)){
if($msgs['service'] == 'alipay.service.check'){
exit(AlipaySign::sign_response('<biz_content>开发者公钥串</biz_content><success>true</success>', 'GBK', 开发者私钥文件));
}
return TRUE;
}else{
return FALSE;
}
}

用户发消息的时候,只要调用下面的方法直接输出就好

1
echo AlipaySign::sign_response('<XML><ToUserId><![CDATA[发消息的用户ID]]></ToUserId><AppId><![CDATA[应用ID]]></AppId><CreateTime><![CDATA[消息创建时间]]></CreateTime><MsgType><![CDATA[ack]]></MsgType></XML>', 'GBK', 开发者私钥文件);

然后给用户回消息的时候,更是只要下面的部分即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$paramsArray = array (
'method' => "alipay.mobile.public.message.custom.send",
'biz_content' => urldecode (json_encode ( 根据官方文档构造的回复内容数组 )),
'charset' => 'GBK',
'sign_type' => 'RSA',
'app_id' => 应用ID,
'timestamp' => date ( 'Y-m-d H:i:s', time () )
);
$paramsArray['sign'] = AlipaySign::sign_request($paramsArray, 开发者私钥文件);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://openapi.alipay.com/gateway.do');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($paramsArray));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
curl_exec($ch);
curl_close($ch);
exit();

完工