php支付宝回调怎么写

(*-*)浩

(*-*)浩

2019-09-05

4100人浏览

原创

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

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

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

这是支付宝已经封装好的类:(推荐学习:PHP视频教程

/** rsaCheckV1 & rsaCheckV2<br>* 验证签名<br>* 在使用本方法前,必须初始化AopClient且传入公钥参数。<br>* 公钥是否是读取字符串还是读取文件,是根据初始化传入的值判断的。<br>**/<br>public function rsaCheckV1($params, $rsaPublicKeyFilePath,$signType='RSA') {<br>$sign = $params['sign'];<br>$params['sign_type'] = null;<br>$params['sign'] = null;<br>$this->alipayrsaPublicKey = $rsaPublicKeyFilePath;<br><br>return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath,$signType);<br>}<br>public function rsaCheckV2($params, $rsaPublicKeyFilePath, $signType='RSA') {<br>$sign = $params['sign'];<br>$params['sign'] = null;<br>return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath, $signType);<br>}<br>function verify($data, $sign, $rsaPublicKeyFilePath, $signType = 'RSA') {<br><br>if($this->checkEmpty($this->alipayPublicKey)){<br><br>$pubKey= $this->alipayrsaPublicKey;<br>$res = "-----BEGIN PUBLIC KEY-----\n" .<br>wordwrap($pubKey, 64, "\n", true) .<br>"\n-----END PUBLIC KEY-----";<br>}else {<br>//读取公钥文件<br>$pubKey = file_get_contents($rsaPublicKeyFilePath);<br>//转换为openssl格式密钥<br>$res = openssl_get_publickey($pubKey);<br>}<br><br>($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确'); <br><br>//调用openssl内置方法验签,返回bool值<br>if ("RSA2" == $signType) {<br>$result = (bool)openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_SHA256);<br>} else {<br>$result = (bool)openssl_verify($data, base64_decode($sign), $res);<br>}<br><br>if(!$this->checkEmpty($this->alipayPublicKey)) {<br>//释放资源<br>openssl_free_key($res);<br>}<br><br>return $result;<br>}L<br>SQLite<br>SQLite3<br>SQLSRV <br>Sybase<br>tokyo_tyrant<br>

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

PHP 8.5.5
PHP 8.5.5

PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。

下载

在这里要注意三点:

1—注意公钥的正确性,还有用的是支付宝公钥不是你当初生成的公钥<br>2—区别这里的方法和支付宝接口本身方法的公钥获取方式<br>3—注意接口方法本身的注释,很重要<br>

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

public function check($receipt_amount,$buyer_pay_amount,$order_price,$app_id,$seller_email){<br>  if($receipt_amount !== $order_price || $buyer_pay_amount !== $order_price){<br>//    echo 1;<br>   return $this->log('订单支付金额有误!');<br>  }<br>  //支付宝支付的所有参数<br>  $alipay_config = Config::get('alipay_config');<br>  if($app_id !== $alipay_config['appid']){<br>//   echo 2;<br>    return $this->log('商家编号有误!');<br>  }<br><br>  //验证收款商家是否正确<br>  if($seller_email !== $alipay_config['seller_id']){<br>//   echo 3;<br>   return $this->log('收款商家有误!');<br>  }<br>  return 'success';<br> }<br>

检验订单

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

public function index($order_sn='')<br> {<br>  if(isset($_POST['order_sn']) && empty($order_sn)){<br>   $order_sn = $_POST['order_sn'];<br>  }<br><br>  $table = self::order_info($order_sn);<br>  if($table == 'failure'){return 'false';}<br>  $oid = $table['order_id'];<br>  //通过订单id $oid 查询出订单中物品的id<br>  $goodsTable = Db::name('goods');<br>  $allgoods = Db::name("test1")->where('o_id', $oid)->field('g_id,g_num')->select();<br>  foreach ($allgoods as $k => $v) {<br>   //事务处理<br>   $goodsTable->startTrans();//事物开始<br>   try {<br>    //判断库存数量<br>    $goodsTable->query('update test2 set g_num = g_num-' . $v['g_num'] . ' where g_num >= ' . $v['g_num'] . ' and gid =' . $v['g_id']);<br><br>   } catch (\Exception $e) {<br>    $goodsTable->rollBack();//事物回滚<br>   }<br><br>   $goodsTable->commit();// 事物提交<br>  }<br><br>  //修改订单<br>  $res = Db::name('test3')->where('order_sn',$order_sn)->update(['order_state' => '1','pay_time'=>time()]);<br>  if($res != 0){<br>   return 'success';<br>  }<br> }<br>

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

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

支付宝
支付宝

支付宝,全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付服务,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

10

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

8

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

10

14

火山引擎实名认证失败怎么办
火山引擎实名认证失败怎么办

火山引擎实名认证失败可能与证件信息填写错误、姓名或企业信息不一致、证件照片不清晰、营业执照状态异常、手机号验证失败或审核资料不完整有关。本专题整理个人认证、企业认证、资料上传、审核退回、重新提交和认证不通过的常见处理方法。

2026.08.04

5

10

火山引擎域名备案流程详解
火山引擎域名备案流程详解

火山引擎域名备案适合需要在火山引擎云服务器、对象存储、CDN或网站服务上绑定域名的用户参考。本专题整理备案入口、账号实名认证、备案类型选择、主体信息填写、网站信息提交、资料上传、初审核验、管局审核和备案失败排查,帮助用户完成网站上线前的备案流程。

2026.08.04

1

10

火山引擎DNS解析配置步骤
火山引擎DNS解析配置步骤

使用火山引擎DNS解析网站域名时,需要确认域名已完成管理接入,并正确配置服务器IP、CNAME地址或验证记录。本专题整理域名添加、记录类型选择、TTL设置、解析状态检查、备案和访问测试等流程,适合新手搭建网站时参考。

2026.08.04

3

10

火山引擎对象存储使用教程
火山引擎对象存储使用教程

火山引擎对象存储适合用于网站图片、视频文件、备份数据、静态资源和应用附件管理。本专题整理TOS控制台入口、存储桶创建、地域选择、权限设置、文件上传、访问链接生成、CDN加速、费用查看和常见上传或访问失败问题,帮助用户快速掌握对象存储基础操作。

2026.08.04

1

10

火山引擎云服务器使用教程
火山引擎云服务器使用教程

火山引擎云服务器使用教程适合第一次购买、部署和管理云服务器的用户参考。本专题整理控制台入口、实例创建、地域和配置选择、系统镜像设置、安全组放行、远程连接、网站部署、续费计费和常见连接失败问题,帮助用户快速完成云服务器基础使用流程。

2026.08.04

5

10

火山引擎API Key绑定大模型教程
火山引擎API Key绑定大模型教程

火山引擎API Key怎么绑定大模型适合需要在火山方舟、应用后台、脚本工具或AI编程软件中调用模型的开发者参考。本专题整理控制台服务开通、API Key创建、模型权限检查、模型ID选择、Base URL填写、调用测试和鉴权失败排查,帮助用户完成从密钥到模型调用的配置流程。

2026.08.04

2

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习