在网上没有找到支付宝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安装好后,把路由和控制器写好,控制器代码:

<?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方法访问这个方法报错:

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"))

将其打印却是有值的,这样又陷入死胡同了,不知道究竟是什么原因,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了,接着是功能细化了。

对接支付宝php版easysdk接口分享相关推荐

  1. 对接支付宝手机网站支付接口,alin10071

    最近项目要增加支付宝扫二维码实现h5支付的功能,我们采用了调用支付宝手机网站支付接口:alipay.trade.wap.pay 但是每次调起返回都是 无可用支付方式 测了一天才发现是因为我的支付宝余额 ...

  2. 对接支付宝网站支付接口

    今天因为业务需要线上支付充值,所以需要对接支付宝的网站支付接口.首先去支付宝开发者中心看了一遍demo:网址如下:https://docs.open.alipay.com/270/106291/ 大致 ...

  3. 对接支付宝App支付和网页支付接口详解

    之前在项目中使用过支付宝的沙箱测试支付和实际开发支付,是关于App对接支付宝接口的,由于前段时间有朋友询问怎么对接网页支付,通过研究支付包的开发文档,在这里总结一下对接支付宝的App支付接口和网页支付 ...

  4. 支付宝对接支付-JAVA版

    前言 本文使用SpringBoot+SpringMVC对接支付宝电脑网站支付接口.接下来将详细讲解开发步骤及一些常见问题. 官方文档:https://opendocs.alipay.com/open/ ...

  5. 对接支付宝单笔转账接口

    对接支付宝单笔转账接口 功能介绍 接入准备 调用支付宝api需要以下参数: 项目引入 操作流程 创建小程序 配置小程序 集成配置 SDK 助手 详细操作流程 获取appId 获取证书 获取AES密钥 ...

  6. PHP版本对接支付宝支付接口 电脑网站 详细介绍 沙箱环境 超简单易懂

    PHP版本对接支付宝支付接口 其实理顺了思路后,按照我接下来的步骤来,真的超级简单啊,为啥有那么多的朋友们折腾了那么久呢,嘿嘿,接下来跟我走吧~ 我是昨天晚上洗完澡之后,大概八九点,才开始正式开工尝试 ...

  7. Flutter对接支付宝接口

    " Flutter支付宝接口的对接教程" 对于一个App来说,支付功能是不可获取的一部分,今天,我就来分享一下在Flutter框架中支付宝的APP支付功能的接入过程.本文结构如下: ...

  8. 钉钉考勤接口调用与OA系统数据对接(多线程版)

    钉钉考勤接口调用与OA系统数据对接(多线程版) 公司由原来的指纹打卡更换为钉钉打卡,需要钉钉和现有的OA考勤数据对接(合并钉钉打卡数据和OA上的请假,外出,出差数据),因为人数增减单线程定时任务数据抓 ...

  9. [转]个人网站对接支付宝,微信支付接口史上最详细教程

    对接支付宝支付接口,官方文档已经写的很清楚了,但是也有很多像我一样的小白,第一次对接支付宝支付接口,会有些迷茫,所以我在此写下这篇文章,给我和我一样的同学,一点思路吧.三分钟就可以申请,支付宝个人即时 ...

最新文章

  1. 再次证明消息四元组的处理顺序。
  2. origin中文版散点图拟合曲线_「测试狗」Origin入门教程:如何进行单段及多段线性拟合...
  3. 常见linux命令使用方法(二)
  4. 拯救react的hooks:react的问题和hooks的作用
  5. 1. Nest Js
  6. 潘天佑博士2014微软学生夏令营演讲:如何培养领导力
  7. 初步学习pg_control文件之八
  8. 【时间序列预测】基于matlab麻雀算法优化LSTM时间序列预测【含Matlab源码 JQ001期】
  9. 研磨设计模式-设计模式的基础-设计模式有什么
  10. python中linspace函数_Python numpy.linspace函数方法的使用
  11. python生成复合饼图
  12. 分水岭算法 c语言实现,分水岭算法的应用
  13. unity3D多点测量、多边形面积测量
  14. idea java代码混淆_idea 环境下代码混淆打包
  15. CSAPP 3e Attack lab
  16. 数学文化 卢卡斯数列和黄金分割
  17. 至尊宝android.phone,Android至尊宝 索尼爱立信X10i行货评测
  18. 计算机在黑板前面英语怎么写,计算机多媒体在英语教学中的运用
  19. xp系统可用的远程投屏软件_Windows XP电脑投屏
  20. 列变位法解密(2016百度之星 - 测试赛(热身,陈题))

热门文章

  1. 输入框技巧 禁用输入法 禁用提示 提示归类
  2. wpf 打开输入法、禁用输入法
  3. C++基础之数组和字符串
  4. dad my_英文绘本 || My Dad!《我爸爸》
  5. CodeSys Rand Numer 随机数生成
  6. S3Browser配置、使用与允许跨域设置
  7. meta20 无法安装 google play_不ROOT不刷机,小米手机如何安装谷歌 GMS 三件套
  8. python爬取餐饮数据_使用 Python 分析全国所有必胜客餐厅
  9. vue中引入echart图及遇到的问题记录
  10. 爬取微博热搜并发送提醒(邮件和server酱)