之前写过支付宝app支付的支付的后台代码,现在来说一下异步通知:

个人感觉支付宝的异步通知,步骤比微信简单点,但里面的坑可是没少多少,就一个验签就把我整的快疯了….

异步通知:

1,先确定在支付的时候写的回调地址的正确性!!!!!!

2.找到支付宝封装的验签类,rsaCheckV1(这个也是在app2.0接口里面)

3.验证回调参数

*4.检验订单

先确定在支付的时候写的回调地址的正确性!!!!!!

一定要确定回调地址的写的是否指到是你写回调验证的那个放里面,别到时候在回头找错误的时候,抓耳挠腮..

找到支付宝封装的验签类,rsaCheckV1(这个也是在app2.0接口里面)

这是支付宝已经封装好的类:

/** rsaCheckV1 & rsaCheckV2

* 验证签名

* 在使用本方法前,必须初始化AopClient且传入公钥参数。

* 公钥是否是读取字符串还是读取文件,是根据初始化传入的值判断的。

**/

public function rsaCheckV1($params, $rsaPublicKeyFilePath,$signType='RSA') {

$sign = $params['sign'];

$params['sign_type'] = null;

$params['sign'] = null;

$this->alipayrsaPublicKey = $rsaPublicKeyFilePath;

return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath,$signType);

}

public function rsaCheckV2($params, $rsaPublicKeyFilePath, $signType='RSA') {

$sign = $params['sign'];

$params['sign'] = null;

return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath, $signType);

}

function verify($data, $sign, $rsaPublicKeyFilePath, $signType = 'RSA') {

if($this->checkEmpty($this->alipayPublicKey)){

$pubKey= $this->alipayrsaPublicKey;

$res = "-----BEGIN PUBLIC KEY-----\n" .

wordwrap($pubKey, 64, "\n", true) .

"\n-----END PUBLIC KEY-----";

}else {

//读取公钥文件

$pubKey = file_get_contents($rsaPublicKeyFilePath);

//转换为openssl格式密钥

$res = openssl_get_publickey($pubKey);

}

($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确');

//调用openssl内置方法验签,返回bool值

if ("RSA2" == $signType) {

$result = (bool)openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_SHA256);

} else {

$result = (bool)openssl_verify($data, base64_decode($sign), $res);

}

if(!$this->checkEmpty($this->alipayPublicKey)) {

//释放资源

openssl_free_key($res);

}

return $result;

}

还有就是别把这两个方法混淆了,前者需要传signtype,后者不需要(前面两个方法都会调用第三个方法),还有一点很重要,就是这个方法的本身是从文件里面提取公钥的的,但是本人是直接传的,就把这个方法稍加改动了一下,让它直接读取我传的公钥.这个验签方法返回的是(bool)true或者(bool)false,来判断验签是否成功.

在这里要注意三点:

1—注意公钥的正确性,还有用的是支付宝公钥不是你当初生成的公钥

2—区别这里的方法和支付宝接口本身方法的公钥获取方式

3—注意接口方法本身的注释,很重要

验证回调参数

支付宝的回调参数是以post的方式回传的,但是我们在测试的时候可以直接把回调url直接写在地址栏里面,然后用get方式接受,这样就不用拼参数了,结果是一样的(回调url可以记录在log文件里面),还有就是验签的时候需要所有的回传参数原封不动的去验签,而这里自己需要什么参数就接收什么参数就可以,这里就不多说了,就是正常的接受参数的问题.下面给出我在验证参数时,检验订单金额和商家编号的代码,仅做参考(我用的tp5):

public function check($receipt_amount,$buyer_pay_amount,$order_price,$app_id,$seller_email){

if($receipt_amount !== $order_price || $buyer_pay_amount !== $order_price){

// echo 1;

return $this->log('订单支付金额有误!');

}

//支付宝支付的所有参数

$alipay_config = Config::get('alipay_config');

if($app_id !== $alipay_config['appid']){

// echo 2;

return $this->log('商家编号有误!');

}

//验证收款商家是否正确

if($seller_email !== $alipay_config['seller_id']){

// echo 3;

return $this->log('收款商家有误!');

}

return 'success';

}

检验订单

这里主要就是检验库存,这里最好用事物处理,(虽然你的订单量可能不一定回到这个地步),下面给出我的代码,仅做参考(tp5):

public function index($order_sn='')

{

if(isset($_POST['order_sn']) && empty($order_sn)){

$order_sn = $_POST['order_sn'];

}

$table = self::order_info($order_sn);

if($table == 'failure'){return 'false';}

$oid = $table['order_id'];

//通过订单id $oid 查询出订单中物品的id

$goodsTable = Db::name('goods');

$allgoods = Db::name("test1")->where('o_id', $oid)->field('g_id,g_num')->select();

foreach ($allgoods as $k => $v) {

//事务处理

$goodsTable->startTrans();//事物开始

try {

//判断库存数量

$goodsTable->query('update test2 set g_num = g_num-' . $v['g_num'] . ' where g_num >= ' . $v['g_num'] . ' and gid =' . $v['g_id']);

} catch (\Exception $e) {

$goodsTable->rollBack();//事物回滚

}

$goodsTable->commit();// 事物提交

}

//修改订单

$res = Db::name('test3')->where('order_sn',$order_sn)->update(['order_state' => '1','pay_time'=>time()]);

if($res != 0){

return 'success';

}

}

接下来就是把结果返回给支付宝就可以,失败:return ‘failure';成功:return ‘success';到这里就结束了.

还有就是在出错后和在找bug的时候都平心静气一些,理智的找问题才会更快的找到问题 ( 如果实在不行就去找支付宝的人工支持,他会为你调试你的代码,会给出一个差不多的结论,然后你再去改就会容易很多 :) ).

最后希望大家支付,回调都可以成功!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

php 回调通知 连连支付_php app支付宝回调(异步通知)详解相关推荐

  1. php怎么看回调的异步通知的数据_php app支付宝回调(异步通知)详解

    之前写过支付宝app支付的支付的后台代码,现在来说一下异步通知: 个人感觉支付宝的异步通知,步骤比微信简单点,但里面的坑可是没少多少,就一个验签就把我整的快疯了-. 异步通知: 1,先确定在支付的时候 ...

  2. php 回调通知 连连支付_php怎么写连连支付退款

    匿名用户 1级 2017-12-20 回答 风控参数 风控参数是我司风险控制系统用来控制用户盗卡风险,保障用户资金安全的参数,也是商户上线之前一个重要的审核事项,一定要传的哟~ 如果是: 1.小额虚拟 ...

  3. 微信小程序学习:(二)app.js及index.js详解

    微信小程序学习:(二)app.js及index.js详解 项目地址:https://github.com/leoricding/- 在用ide创建小程序项目时,系统默认为我们创建了一个hellowor ...

  4. App启动时Application初始化详解

    参考博文: http://www.jianshu.com/p/6037f6fda285 App的ActivityThread与Application详解 一个App的程序入口到底是什么? 是Activ ...

  5. 蚂蚁森林保护地 支付宝蚂蚁森林保护地区详解 蚂蚁森林保护地到底有哪些?

    本篇文章由 泉州SEO www.234yp.com 整理发布,转载请注明原文地址 www.234yp.com/Article/147465.html 谢谢合作! 蚂蚁森林保护地 您可能感兴趣的话题:  ...

  6. 支付宝手机网站支付开发记录之结果异步通知

    开发的时候明明配置了异步通知,可是没有执行异步通知,就算是官方Demo也不行 https://openclub.alipay.com/read.php?tid=1314&fid=46& ...

  7. app Store 审核被拒问题详解

    App Store 审核指南 简介 App 正在改变世界,丰富人们的生活,并为像您一样的开发者提供前所未有的创新机会.因此,App Store 已成长为一个激动人心且充满活力的生态系统,正为数百万的开 ...

  8. fileupload的回调方法_jQuery File Upload文件上传插件使用详解

    本篇教程介绍了jQuery File Upload文件上传插件使用详解,希望阅读本篇文章以后大家有所收获,帮助大家对jQuery的理解更加深入. < jQuery File Upload 是一个 ...

  9. app是互联网信息服务器地址,详解如何让自己的网站/APP/应用支持IPV6访问,从域名到服务器配置...

    详解如何让自己的网站/APP/应用支持IPV6访问,从域名解析配置到服务器配置详细步骤完整. 感谢阅读,本文依然和一颗优雅草科技毫无关系且不代表且不代表其观点和立场,由伊凡撰写,如有转载请注明来源,码 ...

最新文章

  1. pandas把dataframe的数据列转化为索引列实战:单列转化为索引、多列转化为复合索引
  2. 求助啊,被STM32的CAN折磨的疯了
  3. 一个仿沙漏效果的自定义view(贝瑟尔曲线实现)
  4. Python3 写JSON数据到文件(多行格式化版)
  5. MyEclipse开启Jquery智能提示
  6. echo, print, printf 和 sprintf 区别(PHP)
  7. ArcGIS Server(详细介绍)转
  8. x-studio教程之 - 导入csb并发布到CocosStudio2.x兼容工程
  9. 开发中使用第三方工具/服务
  10. 谷歌卫星影像免费下载?来看这些软件
  11. 企业无线接入平台好吗
  12. 用Mailgun方式在Drone pipeline中集成SMTP邮件通知
  13. C# 把汉字转换成拼音(全拼)
  14. 关于时间序列分析中的平稳性的理解笔记
  15. 世界首富用 AI 开除“兄弟”
  16. 机器学习--集成学习--Bagging,Boosting,Stacking
  17. 主板知识大全 ( 一 )
  18. 欢迎更多的需要毕设和接毕设的加入! Android/Java毕业设计——唯一QQ群:639813324
  19. Linux后端服务器网络编程之线程模型丨reactor模型详解
  20. 养老院解决方案——完整的智能养老院呼叫管理系统

热门文章

  1. 计算机文科类专业二本,适合文科生的二本大学 文科二本分数线是多少
  2. java删除文件的上一级_java中多级目录的删除
  3. 已激活的windowns、office查看用的密钥
  4. Dubbo 学习总结(12)—— 十年再出发,Dubbo 3.0 Preview 即将在 3 月发布
  5. Dubbo学习总结(8)——阿里开源框架:Dubbo2.7 三大新特性详解!
  6. Java基础学习总结(104)——多线程、并发、工具类相关的面试题
  7. Docker学习总结(14)——从代码到上线, 云端Docker化持续交付实践
  8. Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别
  9. SSO单点登录学习总结(2)——基于Cookie+fliter单点登录实例
  10. celery java_Python的Java Celery项目相当于什么?