最近公司要用php做一个网站支付宝自动充值的功能,具体就是客户把钱直接转到公司的支付宝账号里,然后在我们网站上填写上交易号,我们网站程序自动获取交易信息,自动给网站的账户充值。

我的具体想法就是利用支付宝的api根据交易号查找跟公司账号交易的信息,获取信息以后把金额、交易人、交易时间等信息存入网站数据库。

然后这两天就研究了一下支付宝的api,以前没用过支付宝的api,走了一些弯路,把经验记下,给后来者参考。

一、找接口

在找接口的过程中我发现阿里巴巴有两套接口。一套是支付宝api,简称Aop,只有企业实名认证的账户才可以申请。另一套是淘宝开放平台的api,简称Top,个人可以申请,有的接口也需要企业认证。这两套接口应该使用哪一个想必很好分辨了,跟支付宝有关就申请支付宝的Aop,跟淘宝相关的就申请Top。

我需要的是支付宝接口,就在支付宝文档里找想要的接口。alipay.user.trade.search

二、使用接口

怎么使用接口呢?在这两个平台上都是要创建应用,通过应用的id和一些token来获取权限,再进行相应的操作。这里我只用过支付宝的api,所以只说一下Aop的了。

打开控制面板创建应用。

创建完成以后,会分配一个App ID给你。当你修改应用的时候还提示你需要填写一个回调地址,回调地址是什么呢?暂且一等,一步一步的来。

当应用创建完了以后是需要根据App ID来进行用户授权的,要不然你没有权限获取用户账号的交易信息。

授权的地址是:

登录授权示例:
https://openauth.alipay.com/oauth2/authorize.htm?client_id=top.21116668
支付授权示例:
https://openauth.alipay.com/oauth2/authorize.htm?client_id=top.21116668&scope=p
后边的client_id就是你的应用id。
授权的时候回出现如下图的界面,当用户使用你应用时候就会出现如下界面,此处我的功能需要只需要查询公司的账户交易信息,所以我就用公司的账户授权一下。
具体授权教程官方给出了:
 
当你点击授权的时候,授权程序会重定向到你的回调地址,并加上一个code的参数,如下图,当然我回调地址已经做了操作,可以根据code获取一些信息了。

现在你就可以通过这个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的详细介绍:

https://openhome.alipay.com/doc/docIndex.htm?url=https://openhome.alipay.com/doc/viewKbDoc.htm?key=236615_236620_259878&type=info

到这里就可以基本上搞定了这个获取信息的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就可以通过安全监测了。

申请周期大概在四五个工作日。

支付宝api教程,支付宝根据交易号自动充值的更多相关文章

  1. ECSHOP 支付宝发货确认接口,记录支付宝返回的交易号

    1,在order_info 数据表尾添加trade_no 字段 数据表尾怎么添加trade_no 字段 ECSHOP为了支付宝发货确认接口,需要记录支付宝返回的交易号 1,在order_info 数据 ...

  2. yii2 支付宝支付教程 [ 2.0 版本 ]

    yii2 支付宝支付教程 [ 2.0 版本 ] 支付宝支付流程个人理解大致就这三步1.前台页面将支付信息数据通过立即支付按钮 ajax提交到订单处理层2.在订单处理层引用支付宝的接口 将支付数据写入 ...

  3. 支付宝api指南

    tyle="margin:20px 0px 0px; line-height:26px; font-family:Arial"> 在这些服务中,服务类型大致可以分为以下几类: ...

  4. Python撸支付宝红包教程,行走在灰色产业边缘的程序员!

      2018年刚到就作死撸羊毛(支付宝).2017年用分享给支付宝好友链接的官方通道"撸"了400大洋. 如许天天早上7:30便起床开愉快心的分享红包链接.200多个老友分享完一次 ...

  5. 支付宝-API接口解析-转账到银行

    支付宝-API接口解析-转账到银行 扫码转账 测试地址 解析内容: alipays://platformapi/startapp?appId=09999988&actionType=toCar ...

  6. 支付宝API

    1. 业务场景描述:在我们的爱旅行项目中,用户只有报名并且付款之后才能算作参加旅行团成功,因此必须提供快速便捷的支付功能:这里,我们选择了阿里的支付宝api来实现快捷支付,基于此,我们向蚂蚁金服发起申 ...

  7. 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付         今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...

  8. C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付           今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后 ...

  9. 【分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付           今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后 ...

随机推荐

  1. 如何用 iptables 禁止某个ip?

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  2. Indesign多媒体富交互插件【MagBuilder】与iOS app 【MagViewer】介绍

    [写在前面]进园子有一段时间了,从来都是看别人的文章,自己的一点东西都记在本地笔记里,现在想把一些东西拿来出分享,希望能够认识一些志同道合的朋友和老师. 学习Adobe插件开发的初衷是为了给PS做插件 ...

  3. Android 设置横屏或竖屏

    方法一:在AndroidManifest.xml中配置 如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你所指定的activity中加上androi ...

  4. [Practical Git] Configure global settings with git config

    You can set up global "git config" settings that apply to all git projects on your system. ...

  5. sphinx 增量索引 及时更新、sphinx indexer索引合成时去旧和过滤办法(转)

    一.sphinx增量索引的设置    数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少.例如.原来的数据有几百万 ...

  6. 使用pypi镜像源加速第三方库在线安装

    用easy_install和pip来安装第三方库很方便 它们的原理其实就是从Python的官方源pypi.python.org/pypi 下载到本地,然后解包安装. 不过因为某些原因,访问官方的pyp ...

  7. Retina屏下1px border

    layout tltle tags post ios7下移动web开发的几个坑 webapp 1.Retina屏下1px border 由于高清屏的特性,1px是由2×2个像素点来渲染,那么我们样式上 ...

  8. 《RESTful Web Services》第四章 设计URI

    引言 URI是跨越Web的资源描述符,一个URI由以下内容组成——协议.主机.端口号.路径

  9. Encryption

    Encryption Configuration Basic Usage Encrypting a value Decrypting a value Configuration Before usin ...

  10. NSURLSession、NSURLConnection

    NSURLSesstion GET方法 block回调方法NSString * urlStr = @"http://192.168.1.247:8100/stream?cname=cha_2 ...