最近公司要用php做一个网站支付宝自动充值的功能,具体就是客户把钱直接转到公司的支付宝账号里,然后在我们网站上填写上交易号,我们网站程序自动获取交易信息,自动给网站的账户充值。
我的具体想法就是利用支付宝的api根据交易号查找跟公司账号交易的信息,获取信息以后把金额、交易人、交易时间等信息存入网站数据库。
然后这两天就研究了一下支付宝的api,以前没用过支付宝的api,走了一些弯路,把经验记下,给后来者参考。
一、找接口
在找接口的过程中我发现阿里巴巴有两套接口。一套是支付宝api,简称Aop,只有企业实名认证的账户才可以申请。另一套是淘宝开放平台的api,简称Top,个人可以申请,有的接口也需要企业认证。这两套接口应该使用哪一个想必很好分辨了,跟支付宝有关就申请支付宝的Aop,跟淘宝相关的就申请Top。
我需要的是支付宝接口,就在支付宝文档里找想要的接口。alipay.user.trade.search
二、使用接口
怎么使用接口呢?在这两个平台上都是要创建应用,通过应用的id和一些token来获取权限,再进行相应的操作。这里我只用过支付宝的api,所以只说一下Aop的了。
打开控制面板创建应用。
创建完成以后,会分配一个App ID给你。当你修改应用的时候还提示你需要填写一个回调地址,回调地址是什么呢?暂且一等,一步一步的来。
当应用创建完了以后是需要根据App ID来进行用户授权的,要不然你没有权限获取用户账号的交易信息。
授权的地址是:
现在你就可以通过这个code来进行操作获取用户的authtoken。
authtoken是什么?authtoken是你在调用支付宝函数的时候需要传入的参数。
找到函数以后可以用测试工具获取测试代码示例:
https://sandbox.alipaydev.com/home/apiTestTools.htm?method=alipay.user.trade.search
代码说明:
$c = new AopClient;//AopClient是Aop的sdk里给出的工具类,首先实例化一个工具类对象
$c->appId = appId;//给对象appid赋值
$c->privateKey = rsaPrivateKeyFilePath;//给privatekey赋值,这里有个bug,就是AopClient里面根本没定义 privateKey这个属性,我擦。。坑爹的api,实际上是名为 rsaPrivateKeyFilePath的属性。。。这个属性是什么意思呢?这个就是openssl加密方式的私钥路径,私钥是需要放到你服务器上的。openssl在你配置应用的时候就让你配置了公钥,这里需要把私钥路径放到这里,openssl不知道啥意思看这个地址:https://openhome.alipay.com/doc/docIndex.htm?url=https://openhome.alipay.com/doc/viewKbDoc.htm?key=236615_428849&type=info
$c->format = format;//这个format是格式,具体是分为"xml"和"json"
//总的来说上面这个AopClient就是相当于权限认证,系统根据appid和密钥文件验证你的权限
$req = new AlipayUserTradeSearchRequest();//这个地方是实例化了一个api具体请求方法类
$req->setEndTime("2015-2-7 00:07:37");//设置结束时间,具体就不说了
$req->setAlipayOrderNo("111");//交易号
$req->setStartTime("2015-2-7 00:07:35");//开始时间 $resp = $c->execute($req, authToken);//执行,这里要说一下,这个authtoken从哪里取啊。。这个就是比较坑爹的地方了,我找了半天才知道
//这个地方就是要调用一下alipay.system.oauth.token这个api来获取token,具体代码我放到下一个片段里
$c = new AopClient();
$c->appId = "102014123000022415";//应用id
$c->rsaPrivateKeyFilePath = APPLICATION_PATH . '/../public/res/rsa_private_keyShaxiang.pem';//设置密钥的路径
$c->format = "json";//指定格式 $req = new AlipaySystemOauthTokenRequest();//获取token的request
$req->setGrantType("authorization_code");//设置要操作的类型
$req->setCode("");//回调地址给你传回的code参数,code原来是用来生成authtoken的。。。好吧。。
$resp = $c->execute($req);//执行,很重要的一点,这个地方官方给的地代码实例传了一个AuthToken,其实这个方法不需要传AuthToken的,本来就是获取AuthToken的方法。。。这个函数是重载方法
echo "<pre>";
var_dump($resp);//打印一下,就看到 access_token这个属性了,就是它了,它就是AuthToken。。。
echo "</pre>";
听别的教程里说这个AuthToken有效期是一年。。不知道真假,待验证。有效期过了需要根据update_token来更新AuthToken,这个地方是获取token调用AlipaySystemOauthToken和更新AuthToken的详细介绍:
到这里就可以基本上搞定了这个获取信息的api了。。。
然后就可以利用各种request类来操作了,如下
$c = new AopClient();
$c->appId = "1020141230000224";//id
$c->rsaPrivateKeyFilePath = APPLICATION_PATH . '/../public/res/rsa_private_keyShaxiang.pem';
$c->format = "json";
$req = new AlipayUserTradeSearchRequest();//此处实例化各种请求就可以各种操作了
$req->setEndTime("2015-2-7 00:07:37");//设置结束时间,具体就不说了
$req->setAlipayOrderNo("111");//交易号
$req->setStartTime("2015-2-7 00:07:35");//开始时间 $resp = $c->execute($req, “201502BBa66dd2645f10418fb8ba1ef953a3dX”);//获取的AuthToken
返回的信息如下:
只是做一个指引。。。有不懂的问题可以咨询阿里旺旺“alipay开放平台”会有专门的技术人员给解答问题,不过自己能解决的尽量还是自己搞定吧。。
还有补充一下:他们有个沙箱测试这么一说,PHP下沙箱好像有些问题,强烈建议直接申请上线,然后修改api,上面的沙箱测试我也忘了为何成功了,之后用的时候都失败了,浪费了很多时间。总是获取私钥解析失败,有人说是因为给的私钥是经过pkcs8编码过的。有不懂的就多看几遍api,表示他们的api文档写的很烂唉。。。伤不起。。没有细节说明
2015-3-14补充:
最近有朋友说沙箱测试PHP获取不到auth_token,提示缺少sign参数。我又测试了一下,原因是在对回调地址的code处理时出了问题。私钥不能生成sign参数。Aopclient里面openssl_get_privatekey()这个方法返回false,换了openssl_pkey_get_private()还是不行。我当时可能是直接申请上线的。
估计是支付宝沙箱给出的私钥是经过PKCS8编码过的。参考一下:http://blog.csdn.net/zhouzme/article/details/38380621
建议大家直接应用上线吧,把Apache升级到2.29,openssl升级到1.02就可以通过安全监测了。
申请周期大概在四五个工作日。