对接支付宝php版easysdk接口分享

在网上没有找到支付宝easysdk接口的对接详细说明,自己一步一步的摸索,其中使用chatgpt的帮助作用不少。
根据官方给的文档
需要执行composer require alipaysdk/easysdk:^2.0安装sdk。如果你的项目已经安装过其它扩展,可以先把vendor文件夹备份一份,我用的是laravel框架,先问问chatgpt一般应该在那个文件下执行这个命令:
在这里插入图片描述
执行以后报错:
PHP Fatal error: Uncaught Error: Call to undefined function Composer\XdebugHandler\putenv() in phar:///www/server/php/74/bin/composer/vendor/composer/xdebug-handler/src/Process.php:93
Stack trace:
#0 phar:///www/server/php/74/bin/composer/vendor/composer/xdebug-handler/src/Status.php(48): Composer\XdebugHandler\Process::setEnv()
#1 phar:///www/server/php/74/bin/composer/vendor/composer/xdebug-handler/src/XdebugHandler.php(83): Composer\XdebugHandler\Status->construct()
#2 phar:///www/server/php/74/bin/composer/bin/composer(16): Composer\XdebugHandler\XdebugHandler->construct()
#3 /www/server/php/74/bin/composer(24): require(‘…’) …

问chatgpt怎样解决:
在这里插入图片描述
在这里插入图片描述
重新执行安装命令又报错,报错和chatgpt回答如下:
在这里插入图片描述
宝塔上安装fileinfo扩展
在这里插入图片描述

在这里插入图片描述
其它的一些像似的报错就不贴在这里了,可以在这个地址查看。
sdk安装好后,把路由和控制器写好,控制器代码如下,其中写require '…/vendor/autoload.php’是因为我写在了自定义的一个目录,可以根据自己的情况来写。代码根据上面提到的官方文档的代码修改而来。

<?phpnamespace App\Http\Controllers;
require '../vendor/autoload.php';
use Illuminate\Http\Request;
use Alipay\EasySDK\Kernel\Factory;
use Alipay\EasySDK\Kernel\Util\ResponseChecker;
use Alipay\EasySDK\Kernel\Config;class AlipayController extends Controller
{public function createPayment(){//1. 设置参数(全局只需设置一次)Factory::setOptions($this->getOptions());try {//2. 发起API调用(以支付能力下的统一收单交易创建接口为例)$result = Factory::payment()->common()->create("iPhone6 16G", "20230526235526001", "88.88", "2088102170439210");$responseChecker = new ResponseChecker();//3. 处理响应或异常if ($responseChecker->success($result)) {// $payUrl = $result->qrCode;// header("Location: {$payUrl}");$body = $result->body;//通过打印返回信息,跳转的支付宝支付页面        print($body);echo "调用成功". PHP_EOL;} else {echo "调用失败,原因:". $result->msg.",".$result->subMsg.PHP_EOL;}} catch (Exception $e) {echo "调用失败,". $e->getMessage(). PHP_EOL;;}}function getOptions(){$options = new Config();$options->protocol = 'https';$options->gatewayHost = 'openapi-sandbox.dl.alipaydev.com';$options->signType = 'RSA2';$options->appId = '202100012266727922';$options->method = 'alipay.trade.page.pay';// 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中  method$options->merchantPrivateKey = 'MIIEpQIBAAKCAQEAy5hoPV8cQQ8+4oj81S6/sMf7Q76qasDjnfcl5bvCR7jlqgxkqTLvp804bsNYCGLpxQzyO2gK08lO5B+HJPG2QHNLMxpoAJZ+BJpTgIUOAjgQLt/1aSnBq+kmK36msuiWKqCdN551rBIzGDSv0xg6L8oR2BAR1hqmSz5POLMkwFwMkwGnxrOrzBmF8ll5EwFQGtIesLUNf8fSJTXY70yddGYz/ojy77xRtuP1GaUSRgXcUh5JBx8048L8zMW2S8id1X+otNXmFDZeBJ+1zQvxQA9ustAbUMU4yb7Z0y7UxiB9Q+4Mg5bPkFMeFlQ6HE+N/qbZLCWOXU6TjKRUTOWXHwIDAQABAoIBAQCh2v7701H98uXWaHs/65NfMgzyNXD7v271FRdexN7V8As9He8kiCb4avDzNX8V47Te/8TPL450AjUirGHfH/34zO+6p8KIvRtgA2Rg5uZVI0bSTR+nxBeA2LCMoXpa/wbqypdSMTpxWmKeWrxxAHC5r1ZyQ4w6fyM27ElE1T5hYSA9bjK4kklJ3LnvdSFTrHOOLDvsLne56DOkakE+vhiQqzRVMpPLZZr+CjyeWJNSvt8cCGmJsmKj3eYE6Z3PRwqtzS7qiGtUnuOViat1qEp78LX8dnxu0D8SB5hYoivMd3qYbQUF1ZgYVGyqUW7iOUeM8bEeTLQ5XPwDwWJVFBzZAoGBAPd10Uyqr/ffz94xMM+9TlFIvIZ6535yjhIuMzP6PxLElKaCu1wc6lc3it8ajrvWCXNzbCE+55Ty3tGq6rymZAmv347dC30VXCtNQeP4r+ztdgi3WH8oqfGWpiEF3kqrqZYVleMKyp8uQZZC2ypWEM6RYTfYijC/Rh3KvGCkWoEtAoGBANKfEPAiE+YFSabAUr31NBKiRFJhxHCSOHW2pL+X8JRyO8S9PfEp8y/qChFy1Fm7m/Ur4UsEOgVa5esTUCeMfyqBvDPs5IQzmRkC8Lbzbc7fQgqAU6xERIDUPhFbhQEJh/Pkj0tnyzOkIN2goI48Vg8FI2b2s+L14EzBWpHBArD7AoGBANHWWT3Ou1rQsb6zLbXqy/+HUz4h+C00TJ7ECG059cQfaAHud5v7dQeyNJNNPN2w+OCqbnWelteqPyHB8j04RzojpcnKTRSrSTX61DXRSrT5A48Okf955unSmlsEU+QzvqFi+m/FVd43ZixZ0ukKhEP16V9mwn/lojpfEPBOTeSdAoGATNqyKY2lySdgyrIe/yW8TJhdado2/gS9CWcOEsN0jBZq7M1JDvkJvhAegGNwTRYCQKI0YVU3fsC+aNrxQp0nwfD5JdFpSTwyv0etYnTNOtGInaBZ5+A5RvErfNXyYICD1WEvUIqdQUjAnV6Bd6VYmb58PpQC6+xgXmGnlMvjGYUCgYEA7WM2pqo0YMV2tuZmAL7w6SC9EkJZLELGr5CUueDJiMCNX0mQbIqRSSUIJ/PdHvpbL/wXXS3ngk3aECjp2ZVvBroB4CFJB3zenm9w6iVYVyudR1QNAtaYe0fkpazK8HjG2n49sw2GkFvpYZQ/z2JMQhD4/48TzLg3KI1hKJET+xA=';// $options->alipayCertPath = '../vendor_ali/alipayPublicCert.crt';// $options->alipayRootCertPath = '../vendor_ali/alipayRootCert.crt';// $options->merchantCertPath = '../vendor_ali/appPublicCert.crt';//注:如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可$options->alipayPublicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhlQOG8TEwgQzjhf2obQ6Vt7RDBkRarcrAhh/xfzOIs64pafkwys9V1Tl9COnSRlW+0bUoB5OG8V+5kO1rXA8oyzKovOcLRdmX1HXsis3hxJtjIhPH7tv95BqCEkS4snw5jd5UPrM3RscGsJ85ZO7qK4m9qG0s6NAu2glQ1FexQtvfLr7aLucP3uwNOEgv92VyUQiRcMwJ8muTlALIbHMrrGpc6xghRNPSNW8mLi2jZwv8BbntKWt8MJIKxxeEdGM/ld+bDzruCNzvkFR4SgX7NdFVFAeYqSlbwiPtDlT/6jmW6hatamtWoyc0ZM+EpoNeuCu3ZSa1P9niN69d2PzewIDAQAB';// $options->alipayPublicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwec3sj0MUmC/uTNiXcsMWi3nw3BG1MX4KAMPgq2Wk5CV2cRmkc8sXKuYLQ2VoFnokdZljUikyYWTS/BFsh8hIFK0xqETQmam9MC0exbLqDZOStMIxs9SoNLHdlH/m7/t9aZYAFasK3R4ixcHnJZyrBwrVAAc9ifFQqwGdeLCcHZO9pHGWfcmHCYRkt1MUe6LGRm9U7wBRvDUU8YKgK5D8ao10AaLgHHmZN+uVXTCwxBYGzwuu0MJugDhkJOmafaHvkcz9iuh4VUjHZT0Hbk3XCr9V7gHENHFs70OW34Yl2Ivlg9mc+vzyiEItPV6uzl+x6L/V8lYrq9OSci4RfboJwIDAQAB';$options->gatewayUrl = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";//可设置异步通知接收服务地址(可选) $options->notifyUrl = "https://www.min-ti.com/alipayipn";return $options;}}

用get方法(自己认为get方便调试,后面可以方便的还为更安全的post方法)访问这个方法报错:

AlibabaCloud\Tea\Exception\TeaUnableRetryError: Undefined array key "sign" in file /vendor/alipaysdk/easysdk/php/src/Payment/Common/Client.php on line 121#0 /app/Http/Controllers/AlipayController.php(20): Alipay\EasySDK\Payment\Common\Client->create()
#1 /vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\Http\Controllers\AlipayController->createPayment()
#2 /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\Routing\Controller->callAction()
#3 /vendor/laravel/framework/src/Illuminate/Routing/Route.php(262): Illuminate\Routing\ControllerDispatcher->dispatch()

这个报错字面意思的key没有定义,在网上没能找到这个报错的解决方法,easysdk接口相关的文档也很少,问chatgpt也没有足够的信息来定位错误,只好打开报错文件的文件来调试定位报错,报错文件对应的方法为:

public function create($subject, $outTradeNo, $totalAmount, $buyerId){$_runtime = ["ignoreSSL" => $this->_kernel->getConfig("ignoreSSL"),"httpProxy" => $this->_kernel->getConfig("httpProxy"),"connectTimeout" => 15000,"readTimeout" => 15000,"retry" => ["maxAttempts" => 0]];$_lastRequest = null;$_lastException = null;$_now = time();$_retryTimes = 0;while (Tea::allowRetry(@$_runtime["retry"], $_retryTimes, $_now)) {if ($_retryTimes > 0) {$_backoffTime = Tea::getBackoffTime(@$_runtime["backoff"], $_retryTimes);if ($_backoffTime > 0) {Tea::sleep($_backoffTime);}}$_retryTimes = $_retryTimes + 1;try {$_request = new Request();$systemParams = ["method" => "alipay.trade.create","app_id" => $this->_kernel->getConfig("appId"),"timestamp" => $this->_kernel->getTimestamp(),"format" => "json","version" => "1.0","alipay_sdk" => $this->_kernel->getSdkVersion(),"charset" => "UTF-8","sign_type" => $this->_kernel->getConfig("signType"),"app_cert_sn" => $this->_kernel->getMerchantCertSN(),"alipay_root_cert_sn" => $this->_kernel->getAlipayRootCertSN()];$bizParams = ["subject" => $subject,"out_trade_no" => $outTradeNo,"total_amount" => $totalAmount,"buyer_id" => $buyerId];$textParams = [];$_request->protocol = $this->_kernel->getConfig("protocol");$_request->method = "POST";$_request->pathname = "/gateway.do";$_request->headers = ["host" => $this->_kernel->getConfig("gatewayHost"),"content-type" => "application/x-www-form-urlencoded;charset=utf-8"];$_request->query = $this->_kernel->sortMap(Tea::merge(["sign" => $this->_kernel->sign($systemParams, $bizParams, $textParams, $this->_kernel->getConfig("merchantPrivateKey"))], $systemParams, $textParams));$_request->body = $this->_kernel->toUrlEncodedRequestBody($bizParams);$_lastRequest = $_request;$_response= Tea::send($_request, $_runtime);$respMap = $this->_kernel->readAsJson($_response, "alipay.trade.create");if ($this->_kernel->isCertMode()) {if ($this->_kernel->verify($respMap, $this->_kernel->extractAlipayPublicKey($this->_kernel->getAlipayCertSN($respMap)))) {return AlipayTradeCreateResponse::fromMap($this->_kernel->toRespModel($respMap));}}else {// var_dump($this->_kernel->getConfig("alipayPublicKey"));// echo "\n\n";// var_dump($respMap);if ($this->_kernel->verify($respMap, $this->_kernel->getConfig("alipayPublicKey"))) {return AlipayTradeCreateResponse::fromMap($this->_kernel->toRespModel($respMap));}}throw new TeaError(["message" => "验签失败,请检查支付宝公钥设置是否正确。"]);}catch (Exception $e) {if (!($e instanceof TeaError)) {$e = new TeaError([], $e->getMessage(), $e->getCode(), $e);}if (Tea::isRetryable($e)) {$_lastException = $e;continue;}throw $e;}}throw new TeaUnableRetryError($_lastRequest, $_lastException);}

错误是在最后一行抛出的,其中有一行明显与sign有关:

"sign" => $this->_kernel->sign($systemParams, $bizParams, $textParams, $this->_kernel->getConfig("merchantPrivateKey"))

将其打印键sign对应的值是有值的,这样又陷入困境,chatgpt和各种搜索引擎找答案都没有合适的,参考支付宝的标准接口也没有找到对应的情况(后面发现这里是这个接口最坑的地方,真实的报错其实不是这样的。)chatgpt虽然没有直接找到答案,还是起到了帮助,帮助解读这个报错方法的代码,减少了阅读代码的时间。
没有现成办法,采用了先注释掉其中一部分代码,看是否还是报这个错来定位具体的报错行,发现是在做这一个判断的时候报的错:

if ($this->_kernel->verify($respMap, $this->_kernel->getConfig("alipayPublicKey")))

接着打印$respMap才发现真正的报错是这样的:
array(2) { [“http_body”]=> string(140) “{“alipay_trade_create_response”:{“code”:“40002”,“msg”:“Invalid Arguments”,“sub_code”:“isv.invalid-app-id”,“sub_msg”:“没有权限”}}” [“method”]=> string(19) “alipay.trade.create” }
检查对应的appid的账号是否申请了这支付功能和重新填写,之后也遇到appid不对,一一排查以后采用了沙箱账号调试成功!
然后改为pc网页支付,在控制器里面把:

$result = Factory::payment()->common()->create("iPhone6 16G", "20230526235526001", "88.88", "2088102170439210");

改为

 $result = Factory::payment()->page()->pay("iPhone6 16G", "20230526235526001", "88.88", "完成支付返回地址");

如果是手机页面支付,改为

$result = Factory::payment()->wap()->pay("iPhone6 16G", "20230526235526001", "88.88", '中途关闭支付返回地址', "完成支付返回地址");

返回信息验证举例,假如返回的地址对应的方法为alipayreturnurl

public function alipayreturnurl(Request $request){$data = $request->all();$params = $request->query();       Factory::setOptions($this->getOptions());$result = Factory::payment()->common()->verifyNotify($params); // 验证签名if ($result) {// 验证通过,处理业务逻辑       } else {// 验证失败,不处理业务逻辑            } }

这样调试基本ok了,接着是功能细化了。
示例地址查看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/9613.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录第一次利用chatgpt 实现RSA加密解密编程

1&#xff0c;下载Cursor软件 2&#xff0c;左侧文件栏目新建一个first.java 3&#xff0c;在编辑区输入“//使用RSA公私钥实现JWT令牌的签名和验签”&#xff0c;并且连续输入两个回车&#xff08;相当于调用CtrlK&#xff09; AI会自动生成代码&#xff0c;点击“Accept al…

ChatGPT | Word文档如何更好地提取表格内容给ChatGPT

本文来自http://blog.csdn.net/hellogv/ &#xff0c;引用必须注明出处&#xff01; Word文档如何更好地提取表格内容给ChatGPT做知识库&#xff0c;这属于文本预处理工作。 本文只讲思路、测试结果&#xff0c;技术实现用Python和Java都能完成&#xff0c;下一篇文章再贴源码…

分享一个淘宝/天猫/京东/阿里 图片抓取工具

链接&#xff1a;https://pan.baidu.com/s/1lbTL8UNQr4o45Z30J_YGLA提取码&#xff1a;xr3z 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 转载于:https://www.cnblogs.com/ForStudyAlways/p/11212591.html

利用python爬取淘宝的商品图片

代码 from selenium import webdriver from selenium.webdriver.common import keys import time import requests import random# 创建浏览器 def functions():browser webdriver.Chrome(rG:\taobao\chromedriver.exe)# 让浏览器打开淘宝browser.get("https://www.taob…

JavaScript实现淘宝商品展示(鼠标放在小图片上,上面会出现相应的大图片)

最终效果&#xff1a; 代码部分&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1"><title>图片放大效果</title&…

html转化成图片,相当于生成海报,长按保存到手机

html <div class"tab-con" id"erweima"><div class"erweima-box"><div class"erweima"><div class"top"><span>扫码支付</span><span>排队免单</span></div><di…

淘宝图片服务器的学习

一、淘宝网的困境 对于淘宝网这样的大型电子商务网站&#xff0c;对于图片服务的要求特别的高。而且对于卖家来说&#xff0c;图片远胜于文字描述&#xff0c;因此卖家也格外看重图片的显示质量、访问速度等问题。根据淘宝网的流量分析&#xff0c;整个淘宝网流量中&#xff0c…

用ChatGPT/midjourney生成创意营销图片素材,产品图、虚拟主播、终端店铺图

营销素材对应的关键词库&#xff08;3个&#xff09;&#xff1a; 元素、风格、AI绘画工具midjourney 提问模板&#xff1a; 第一步&#xff0c;先预设场景&#xff0c;询问应该包含的关键词范围 假设你是一位世界一流水平的设计师&#xff0c;你想要使用AI绘画工具midjourn…

仿淘宝的详情页图片切换

鼠标放在小图片上&#xff0c;上面的大图会切换到相应的图片 html代码&#xff1a; css代码&#xff1a; js代码&#xff1a; 完整代码&#xff1a; <!DOCTYPE html><html lang"en"> <head> <meta charset"utf-8"> …

html css js肝撸淘宝官网代码(淘宝web端官网页面+部分js功能实现)

大家好&#xff0c;我是梅巴哥er。本篇是我写的一个练习&#xff0c;淘宝首页。用html, css, js写的。交互功能只写了一部分&#xff0c;仅供学习参考。如想下载源码&#xff0c;请移步https://github.com/guozi007a/taobao-homepage.git我传到github上了。在这个页面点Code选项…

ChatGPT对于普通人有什么机会和影响?

ChatGPT爆火“出圈”&#xff0c;短短三个月里&#xff0c;势如破竹。 月活已经达到1亿&#xff0c;什么概念呢&#xff1f;Tiktok在海外达到1亿月活用了将近9个月时间&#xff0c;Instagram用了大约2年半&#xff0c;就连比尔盖茨都表示“Web3没那么重要&#xff0c;元宇宙没…

ChatGPT爆火,真有那么神?

近来&#xff0c;人工智能聊天机器人ChatGPT实火。上线仅仅2个月&#xff0c;ChatGPT的活跃用户就突破一亿&#xff0c;曾创下无数增长奇迹的TikTok都望尘莫及。连比尔盖茨都没忍住承认&#xff1a;ChatGPT出现的意义&#xff0c;不亚于互联网和个人电脑的诞生。 ChatGPT真有那…

震惊!火爆全网的ChatGPT背后使用的数据库居然是……

摘要&#xff1a;ChatGPT承认了自己背后使用的数据库是Cassandra。 OpenAI最近发布的AI驱动的智能聊天机器人ChatGPT在互联网上掀起了一阵风暴&#xff0c;热衷于尝试这一新AI成果的网民不在少数。ChatGPT针对网友广泛的问题提供了非常有针对性的回答&#xff0c;其不可思议的能…

赛狐ERP率先引入ChatGPT 一键生成优质Listing

最近被火遍全球的ChatGPT刷屏了&#xff0c;作为以人工智能技术驱动的自然语言处理工具&#xff0c;它正在用一种新的方式改变着我们的工作和生活。为了更好地赋能卖家&#xff0c;赛狐ERP研发团队快速响应市场需求&#xff0c;率先引入了ChatGPT技术&#xff0c;基于亚马逊畅销…

谷歌推出PaLM-E,能超越ChatGPT么?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 ChatGPT的横空出世&#xff0c;打的老牌科技巨头谷歌措手不及。在OpenAI微软的双重压力下&#xff0c;自赋“红码”的谷歌亮出“大招”。 近日&#xff0c;谷歌和柏林工业大学的团队重磅推出史上最大的视觉语言模型——PaLM…

“文心一言”和“ChatGPT”两者有何差距?

如果说现阶段火遍全球应用是什么&#xff0c;绝大多数人会脱口而出——ChatGPT。当然最近我们国内版也出来了&#xff0c;就是百度的“文心一言”&#xff0c;文心一言和ChatGPT都是当下以语言模型为核心的人工智能平台&#xff0c;这两者对比之下有何不一样呢&#xff1f;下面…

ChatGPT+Midjourney

一键部署属于你的ChatGPTMidjourney网页&#xff0c;目前已实现&#xff1a; 1.imagin 想象 2.upscale 放大 3.variation 变幻 4.describe 识图 5.blend 混图 6.垫图 开源地址&#xff1a;https://github.com/Licoy/ChatGPT-Midjourney 欢迎大家访问&#xff1a;http://…

ChatGPT 的议论文究竟写的怎么样?111 位高中教师告诉你答案

夕小瑶科技说 原创 作者 | 小戏、Python 在 OpenAI GPT-4 发布时发布的《GPT-4 Technical Report》中&#xff0c;其中很吸引人眼球的一部分是 GPT-4 应用于教育领域的出色表现&#xff0c;通过让 GPT-4 去完成美国的 AP 课程及考试&#xff0c;来评估 GPT-4 在多个学科中的性…

刚刚!ChatGPT演示即将上线王炸功能!不仅推出官方版AutoGPT,还能联网,支持处理Excel,发推购物一条龙!...

转载自量子位 OpenAI官方AutoGPT&#xff0c;要来了&#xff01; 就在AutoGPT项目破10万Star之际&#xff0c;OpenAI也放出重磅炸弹&#xff0c;由联合创始人格雷格布洛克曼&#xff08;Greg Brockman&#xff09;亲自现场演示了ChatGPT即将上线的新功能。 比如要一张这样有氛围…

【历史上的今天】7 月 10 日:iOS App Store 问世;台积电创始人出生;第一台被“越狱”的 iPhone

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 7 月 10 日&#xff0c;在 1856 年的今天&#xff0c;交流电的发明者尼古拉特斯拉&#xff08;Nikola Tesla&#xff09;出生。特斯拉被认为是电力商业化的重要…