支付宝的作用就不废话了;
反正在天朝是个网站用到支付;都首先要考虑支付宝了;
支付宝有两种加密方式;MD5和RSA;
MD5加密方式比较简单些;可以用在pc端的扫码支付;
今个要讲的就是这个;
此处略过500字的注册账号获取key的过程;直奔主题;
示例项目:https://github.com/baijunyao/thinkphp-bjyadmin
一:导入sdk
/ThinkPHP/Library/Vendor/Alipay
需要说明的是;这个sdk原本是担保支付的;
后来被我改成即时到账的;
所以;如果如果按我这篇文章整合;就需要下载示例项目;
然后拷贝Alipay了;
二:配置项
/Application/Common/Conf/config.php
'ALIPAY_CONFIG' => array(
'partner' => '', // partner 从支付宝商户版个人中心获取
'seller_email' => '', // email 从支付宝商户版个人中心获取
'key' => '', // key 从支付宝商户版个人中心获取
'sign_type' => strtoupper(trim('MD5')), // 可选md5 和 RSA
'input_charset' => 'utf-8', // 编码 (固定值不用改)
'transport' => 'http', // 协议 (固定值不用改)
'cacert' => VENDOR_PATH.'Alipay/cacert.pem', // cacert.pem存放的位置 (固定值不用改)
'notify_url' => 'http://baijunyao.com/Api/Alipay/alipay_notify', // 异步接收支付状态通知的链接
'return_url' => 'http://baijunyao.com/Api/Alipay/alipay_return', // 页面跳转 同步通知 页面路径 支付宝处理完请求后,当前页面自 动跳转到商户网站里指定页面的 http 路径。 (扫码支付专用)
'show_url' => 'http://baijunyao.com/User/Order/index', // 商品展示网址,收银台页面上,商品展示的超链接。 (扫码支付专用)
'private_key_path' => '', //移动端生成的私有key文件存放于服务器的 绝对路径 如果为MD5加密方式;此项可为空 (移动支付专用)
'public_key_path' => '', //移动端生成的公共key文件存放于服务器的 绝对路径 如果为MD5加密方式;此项可为空 (移动支付专用)
),
好吧;注释我已经写的比较清楚了;今个我们讲的是pc端的扫码支付;
可以先无视private_key_path、public_key_path这两个参数;其他的就是填空题了;
三:支付函数
/Application/Common/Common/function.php
/**
* 跳向支付宝付款
* @param array $order 订单数据 必须包含 out_trade_no(订单号)、price(订单金额)、subject(商品名称标题)
*/
function alipay($order){
vendor('Alipay.AlipaySubmit','','.class.php');
// 获取配置
$config=C('ALIPAY_CONFIG');
$data=array(
"_input_charset" => $config['input_charset'], // 编码格式
"logistics_fee" => "0.00", // 物流费用
"logistics_payment" => "SELLER_PAY", // 物流支付方式SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费)
"logistics_type" => "EXPRESS", // 物流类型EXPRESS(快递)、POST(平邮)、EMS(EMS)
"notify_url" => $config['notify_url'], // 异步接收支付状态通知的链接
"out_trade_no" => $order['out_trade_no'], // 订单号
"partner" => $config['partner'], // partner 从支付宝商户版个人中心获取
"payment_type" => "1", // 支付类型对应请求时的 payment_type 参数,原样返回。固定设置为1即可
"price" => $order['price'], // 订单价格单位为元
// "price" => 0.01, // // 调价用于测试
"quantity" => "1", // price、quantity 能代替 total_fee。 即存在 total_fee,就不能存在 price 和 quantity;存在 price、quantity, 就不能存在 total_fee。 (没绕明白;好吧;那无视这个参数即可)
"receive_address" => '1', // 收货人地址 即时到账方式无视此参数即可
"receive_mobile" => '1', // 收货人手机号码 即时到账方式无视即可
"receive_name" => '1', // 收货人姓名 即时到账方式无视即可
"receive_zip" => '1', // 收货人邮编 即时到账方式无视即可
"return_url" => $config['return_url'], // 页面跳转 同步通知 页面路径 支付宝处理完请求后,当前页面自 动跳转到商户网站里指定页面的 http 路径。
"seller_email" => $config['seller_email'], // email 从支付宝商户版个人中心获取
"service" => "create_direct_pay_by_user", // 接口名称 固定设置为create_direct_pay_by_user
"show_url" => $config['show_url'], // 商品展示网址,收银台页面上,商品展示的超链接。
"subject" => $order['subject'] // 商品名称商品的标题/交易标题/订单标 题/订单关键字等
);
$alipay=new \AlipaySubmit($config);
$new=$alipay->buildRequestPara($data);
$go_pay=$alipay->buildRequestForm($new, 'get','支付');
echo $go_pay;
}
同样;看注释就行了;
调用方法;
$data=array(
'out_trade_no'=>time(),
'price'=>1,
'subject'=>'测试'
);
alipay($data);
如果你这填空题做的不错的话;到这已经跳到支付宝付款页面了;
四:同步接收通知
/Application/Api/Controller/AlipayController.class.php
* return_url接收页面
*/
public function alipay_return(){
// 引入支付宝
vendor('Alipay.AlipayNotify','','.class.php');
$config=$config=C('ALIPAY_CONFIG');
$notify=new \AlipayNotify($config);
// 验证支付数据
$status=$notify->verifyReturn();
if($status){
// 下面写验证通过的逻辑 比如说更改订单状态等等 $_GET['out_trade_no'] 为订单号;
$this->success('支付成功',U('User/Order/index'));
}else{
$this->success('支付失败',U('User/Order/index'));
}
}
经过第三步支付成功后;支付宝是会带着一堆get参数跳向配置项中的return_url给的url;
然后在这里写接收通知的逻辑;
五:异步接收通知
/Application/Api/Controller/AlipayController.class.php
/**
* notify_url接收页面
*/
public function alipay_notify(){
// 引入支付宝
vendor('Alipay.AlipayNotify','','.class.php');
$config=$config=C('ALIPAY_CONFIG');
$alipayNotify = new \AlipayNotify($config);
// 验证支付数据
$verify_result = $alipayNotify->verifyNotify();
if($verify_result) {
echo "success";
// 下面写验证通过的逻辑 比如说更改订单状态等等 $_POST['out_trade_no'] 为订单号;
}else {
echo "fail";
}
}
正常流程中;第四步就已经结束了;
但是呢;很多时候因为各种原因;比如说用户支付成功后还没等支付宝跳转就关掉了窗口;
等等原因;在支付成功后并没有成功跳转回return_url指定的url
这时候就是notify_url这个发挥作用的时候了;
支付宝会按照一定的频率往我们的服务器发送异步post的支付结果通知;
我们把处理支付成功后的业务逻辑在这也放一份就可以了;
//*****************关于不知道怎么查看异步发过来的数据的补充*****************
2016.10.28:
好多童鞋在问支付后;不知道怎么查看接收到的支付状态通知;
这里做个补充;首先;我们的服务器必须是外网可以正常访问到的;
必须注意不能有 登录或者权限之类的拦截;
另外补充一个简单的查看收到的内容的方法用于测试;
/Application/Api/Controller/AlipayController.class.php
/**
* notify_url接收页面
*/
public function alipay_notify(){
// 下面的file_put_contents是用来简单查看异步发过来的数据 测试完可以删除;
file_put_contents('./notify.text', json_encode($_POST));
// 引入支付宝
vendor('Alipay.AlipayNotify','','.class.php');
$config=$config=C('ALIPAY_CONFIG');
$alipayNotify = new \AlipayNotify($config);
// 验证支付数据
$verify_result = $alipayNotify->verifyNotify();
if($verify_result) {
echo "success";
// 下面写验证通过的逻辑 比如说更改订单状态等等 $_POST['out_trade_no'] 为订单号;
}else {
echo "fail";
}
}
//*****************关于可能出现ILLEGAL_SIGN错误的解放方案*****************
示例项目中的 function.php 中顶部是有设置编码的:
header("Content-type:text/html;charset=utf-8");
如果整合到自己的项目中;记得添加上这句;
本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客https://baijunyao.com 欢迎捐赠赞赏加入组织创建QQ群及捐赠渠道
低调哥 :现在,个人用户可以申请做这个支付实验嘛?
2017-10-20 17:41:47 回复
奔跑的狮子 :不可以了,现在加密方式换了 RAS和RAS2
2017-11-01 10:33:37 回复
JUST DO! :跪求tp中短信发送接口验证例子,收下我的膝盖
2017-08-23 12:07:56 回复
JUST DO! :跪求图片中短信发送接口验证例子,收下我的膝盖
2017-08-23 12:07:31 回复
a'ゞ时间 :感谢分享,tp5整合成功
2017-08-23 10:32:04 回复
式微 :大神大神 这个cacert.pem 为什么跟我生成的不一样啊 需要换吗 用你直接给的那个会有问题吗?。
2017-05-11 15:37:11 回复
…0o-o0… :你好,我也是
2017-03-19 19:53:19 回复
恋恋狗尾巴草 :想问一下有没有支付宝退款?
2017-02-24 10:13:44 回复
我本俗人贪财好色 :帅白大神,能不能加你qq啊?我qq737314589.
2017-02-23 16:21:58 回复
╯SummEr。 :帅白 验证支付数据之后会写一些自己的逻辑 比如说 改变订单状态 但我需要在这边修改商品库存么 那么这个id怎么传送过来呢
2017-01-06 16:31:18 回复
云淡风晴 :订单号和订单id的关系是自己设计的;
2017-01-07 11:04:13 回复
天下無雙 :调试错误,请回到请求来源地,重新发起请求。错误代码 ILLEGAL_PARTNER 是什么原因
2016-12-06 18:16:04 回复
云淡风晴 :检查配置项的各参数是否正确;
2016-12-11 22:19:40 回复
我本俗人贪财好色 :朋友,你调好了吗?我是新手,也是这样的。
2017-02-23 10:05:44 回复
…0o-o0… :你好,我也是
2017-03-19 19:51:17 回复
———————————— :/Application/Common/Common/function.php加句话:header("Content-type:text/html;charset=utf-8");不然很多电脑:错误代码 ILLEGAL_SIGN
2016-11-14 16:59:32 回复
云淡风晴 :恩恩;我写个提醒;多谢;
2016-12-11 22:20:40 回复
梵梵✅ :支付成功了回调后数据验证出错,显示支付失败。不知道怎么调试呢?
2016-11-04 14:35:26 回复
云淡风晴 :支付失败的原因有很多;搜索下报错的信息;网上能找到解决方法的;
2016-11-04 23:30:54 回复
晴天 :大神 为啥支付成功了 没有写入数据库呢
2016-09-29 12:10:55 回复
云淡风晴 :判断下是否生成notify.text文件;
2016-11-04 23:31:21 回复
许少年 :俊哥,这个SDK,可以做,支付定,当面付吗? alipay.trade.precreate (统一收单线下交易预创建)
2016-09-27 11:45:55 回复
云淡风晴 :没有整合当面付;
2016-09-28 00:00:19 回复
衬人心欢 :俊哥,很感谢你的这些文章!真心感谢!谢谢
2016-09-05 17:18:23 回复
云淡风晴 :谢谢支持;
2016-09-05 22:17:38 回复
随风轻去 :开个打赏功能吧 文章都是精品 很细致的东西~~~希望博主继续加油~~~跟进TP5啊
2016-09-04 13:23:25 回复
云淡风晴 :谢谢支持;
2016-09-05 22:17:30 回复
一一零五 :你好,我第一次写这个接口,也出现 issign 返回 false的情况, 不知道从哪里找问题,返回的数据指的是哪里返回的?谢谢!
2016-08-30 18:31:23 回复
云淡风晴 :是/ThinkPHP/Library/Vendor/Alipay/AlipayNotify.class.php 这个文件中生成的签名为false?
2016-08-30 22:52:43 回复
hiwangqi :很感谢博主,文章这么细心,文章下放个打赏功能,我肯定第一个打赏,毕竟知识无价嘛
2016-08-25 00:16:18 回复
云淡风晴 :谢谢支持;
2016-08-30 22:48:17 回复
阳阳VIP :支付成功 issign 返回 false 什么原因。。
2016-08-16 09:22:14 回复
云淡风晴 :把返回的数据;跟支付时候提交的数据对比;看有什么不一致的地方?
2016-08-16 21:02:06 回复
阳阳VIP :支付成功 issign 返回 false 什么原因。。
2016-08-16 09:22:13 回复
王者逸 :码云不能下载 可以换个下载链接吗
2016-07-29 14:57:04 回复
云淡风晴 :https://github.com/baijunyao/thinkphp-bjyadmin
2016-07-29 14:59:43 回复
王者逸 :感谢
2016-07-30 10:58:41 回复
Kwong Yan :你这个代码高亮是使用哪一个插件
2016-07-05 20:53:09 回复
云淡风晴 :ueditor编辑器;
2016-07-05 21:38:19 回复
最新评论