Swoole环境下支付相关SDK可选择的不多,由于之前有用过Yansongda/Pay v2版本,使用体验还是不错; 所以在新项目里面采用V3版本;
Yansongda/Pay V3版本内部相比V2版本有很多地方考虑的不够完善,比如微信下单接口失败了,都没有 prepay_id; 却还将错误的返回值用于下一步逻辑的入参 等~
一路踩坑终于调通,在这里记录详细使用,希望对后来的童鞋有所帮助;
完整配置文件示例:
'alipay' => [ 'default' => [ // 必填-支付宝分配的 app_id 'app_id' => '', // 必填-应用私钥 [商户平台复制的字符串] 'app_secret_cert' => 'xxxx', // 必填-应用公钥证书 [商户平台下载的 appCertPublicKey_xxxx.crt文件] 'app_public_cert_path' => 'appCertPublicKey_2016082500309964.crt', // 必填-支付宝公钥证书 [商户平台下载的 alipayCertPublicKey_RSA2.crt文件] 'alipay_public_cert_path' => 'alipayCertPublicKey_RSA2.crt', // 必填-支付宝根证书 [商户平台下载的 alipayRootCert.crt文件] 'alipay_root_cert_path' => 'alipayRootCert.crt', 'return_url' => '', 'notify_url' => '', // 选填-服务商模式下的服务商 id,当 mode 为 Pay::MODE_SERVICE 时使用该参数 'service_provider_id' => '', // 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE 'mode' => Pay::MODE_NORMAL, ], ], 'wechat' => [ 'default' => [ // 必填-商户号,服务商模式下为服务商商户号 'mch_id' => '', // 必填-商户秘钥 [商户平台设置的 APIV2 密钥或 APIV3 密钥] 'mch_secret_key' => '', // 必填-商户私钥 [商户平台下载的证书压缩包内的 apiclient_key.pem文件] 'mch_secret_cert' => 'apiclient_key.pem', // 必填-商户公钥证书 [商户平台下载的证书压缩包内的 apiclient_cert.pem文件] 'mch_public_cert_path' => 'apiclient_cert.pem', // 必填 'notify_url' => '', // 选填-公众号 的 app_id 'mp_app_id' => '', // 选填-小程序 的 app_id 'mini_app_id' => '', // 选填-app 的 app_id 'app_id' => '', // 选填-合单 app_id 'combine_app_id' => '', // 选填-合单商户号 'combine_mch_id' => '', // 选填-服务商模式下,子公众号 的 app_id 'sub_mp_app_id' => '', // 选填-服务商模式下,子 app 的 app_id 'sub_app_id' => '', // 选填-服务商模式下,子小程序 的 app_id 'sub_mini_app_id' => '', // 选填-服务商模式下,子商户id 'sub_mch_id' => '', // 选填-微信公钥证书路径, optional,强烈建议 php-fpm 模式下配置此参数 'wechat_public_cert_path' => [ '' => '', ], // 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SERVICE 'mode' => Pay::MODE_NORMAL, ], ], 'http' => [ 'timeout' => 5.0, 'connect_timeout' => 5.0, 'verify' => false, ], 'logger' => [ 'enable' => true, //如果不需要日志这里设置成false 'file' => './runtime/logs/pay.log', // 请注意权限 'level' => 'info', // 建议生产环境等级调整为 info,开发环境为 debug 'type' => 'single', // optional, 可选 daily, daily 时将按时间自动划分文件. 'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天 ],
Yansongda/Pay V3 支付宝回调处理示例:
\Yansongda\Pay\Pay::config($this->paymentService->getPayParamConfig()); $data = \Yansongda\Pay\Pay::alipay()->callback(ApplicationContext::getContainer()->get(ServerRequestInterface::class)); if ($data['trade_status'] == 'TRADE_SUCCESS' || $data['trade_status'] == 'TRADE_FINISHED') { // 支付成功的业务逻辑处理 // $this->paymentService->pay($data['out_trade_no'], 2, $data['trade_no']); }
Yansongda/Pay V3 微信V3回调处理示例:
\Yansongda\Pay\Pay::config($this->paymentService->getPayParamConfig()); $data = \Yansongda\Pay\Pay::wechat()->callback(ApplicationContext::getContainer()->get(ServerRequestInterface::class)); $cipherText = $data['resource']['ciphertext']; if ($data['event_type'] == 'TRANSACTION.SUCCESS' && $cipherText['trade_state'] == 'SUCCESS') { // 支付成功的业务逻辑处理 // $this->paymentService->pay($cipherText['out_trade_no'], 3, $cipherText['transaction_id']); }
重点: ApplicationContext::getContainer()->get(ServerRequestInterface::class)
官方文档里面接收回调相关的例子写的很笼统,一不注意就将陷入验签失败大坑
关于公钥证书模式下的应用私钥/公钥获取:
转载请注明本文标题和链接:《 在Swoole环境下 Yansongda/Pay V3版本的使用 》
你好站长,小小参谋网已经更换域名了,麻烦您有时间调整一下,谢谢原域名zzzx.org 新域名eejj.net祝老朋友您生活愉快,身体健康