支付宝调试
使用扩展包辅助开发:github.com/yansongda/p…
支付宝异步回调结果文档:opendocs.alipay.com/open/203/10…
支付宝唤起请求参数说明:opendocs.alipay.com/open/204/10…
该扩展包,实现了支付宝、微信相关的常见操作,比如:App支付、转账、扫码支付、小程序支付等等,使用很简单,跟着文档走遍就明白了,踩的坑多数是 配置相关的坑,多数可通过搜索解决。
安装
composer require yansongda/pay -vvv
配置说明
文件路径:config/pay.php
'alipay' => [
'notify_url' => 'http://staging.youjianqi.com/api/alipay/notify',
'return_url' => 'http://staging.youjianqi.com/api/alipay/return',
'app_id' => '2021001160653660',
'private_key' => '填入应用的密钥',
'ali_public_key' => '填入支付宝公钥',
'log' => [ // optional
'file' => './logs/alipay.log',
'level' => 'info', // 建议生产环境等级调整为 info,开发环境为 debug
'type' => 'single', // optional, 可选 daily.
'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
],
'http' => [
'timeout' => 30,
'connect_timeout' => 30,
],
'mode' => 'normal',
],
- Appid: 必填,支付宝分配的引用id
- notify_url:用户操作成功后,暴露给支付宝的回调接口
- return_url:跳转的页面url,用户支付成功后跳转的url
- private_key:支付宝应用私钥
- ali_public_key:支付宝分配的公钥,不是应用公钥
- mode:应用环境,线上启用normal模式,开发使用 dev 进入沙箱模式
实际演练
生成签名给前端,唤起支付宝需要
public function resolveGenerateOrder($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo)
{
$order = [
'out_trade_no' => time(),
'total_amount' => '0.01',
'subject' => 'test subject-测试订单',
];
$alipay = Pay::alipay(config('pay.yjq_alipay'));
// 将返回字符串,供后续 APP 调用,调用方式不在本文档讨论范围内,请参考官方文档。
return ($alipay->app($order)->getContent());
// return // laravel 框架中请直接 return $alipay->app($order)
}
- Total_amount:支付金额
- Subject:支付时显示的标题
- out_trade_no:我们提供的交易号(id),我们自己生成传入
回调Controller
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Yansongda\Pay\Pay;
class PayController extends Controller
{
public function alipayNotify(Request $request)
{
$data = $request->all();
info('notify' . json_encode($data));
// 需要注意,alipay中的ali_public_key需要是支付宝公钥,而不是应用公钥
$result = Pay::alipay(config('pay.yjq_alipay'))->verify();
info('result' . $result);
}
public function alipayReturn(Request $request)
{
$data = $request->all();
info('return' . json_encode($data));
}
}
支付宝回调数据
{
"gmt_create":"2020-06-05 18:42:34",
"charset":"utf-8",
"seller_email":"jinlinle@haxibiao.com",
"subject":"test subject-测试订单",
"sign":"VWyCeJ+4YrvnvV3DodRpE6zS+gdmNQBGjyZAmxZeh2w7B/QxdjzgU2j+c5uiXi0cFHOeRBhXpgyM/KImMwcWMr8ozvKFYo+pMMeWFogf+R3VDGU9cnahFbNIEdUPn9O1kdncYwZzMjfQvNKehnqfqr5iOzzePx096BXwWfCzJFwb3PcSvP3aXStLFAIhYq9q9rNBrdg3OUFLp4Ww12/8S1Chm2tCl0U/h4g2vHQ1K9AeU1x0un6Qd6Et/f+bU9gPF6CnjUTtNjOksUFy5vGxsmnpYJc5r0Deq2pf1b0eHpOhlqyf9DdSZx8Yx99zLJ7VvGZzpqk+rb4CvBE7zFWdnw==",
"buyer_id":"2088222691542159",
"invoice_amount":"0.01",
"notify_id":"2020060500222184235042151451122226",
"fund_bill_list":"[{"amount":"0.01","fundChannel":"PCREDIT"}]",
"notify_type":"trade_status_sync",
"trade_status":"TRADE_SUCCESS",
"receipt_amount":"0.01",
"app_id":"2021001160653660",
"buyer_pay_amount":"0.01",
"sign_type":"RSA2",
"seller_id":"2088231973528275",
"gmt_payment":"2020-06-05 18:42:35",
"notify_time":"2020-06-05 22:09:12",
"version":"1.0",
"out_trade_no":"1591353731",
"total_amount":"0.01",
"trade_no":"2020060522001442151437413220",
"auth_app_id":"2021001160653660",
"buyer_logon_id":"138****2286",
"point_amount":"0.00"
}
关键参数:trade_status,代表交易状态。
| 交易状态 | 解释 |
|---|---|
| TRADE_FINISHED | 交易结束,不可退款 |
| TRADE_SUCCESS | 交易完成,交易支付成功 |
| WAIT_BUYER_PAY | 交易创建,等待付款 |
| TRADE_CLOSED | 未付款交易超时关闭,或支付完成后全额退款 |
参数:fund_bill_list中的 amount , fundChannel 代表订单金额和支付渠道
| 支付渠道代码 | 支付渠道 |
|---|---|
| COUPON | 支付宝红包 |
| ALIPAYACCOUNT | 支付宝余额 |
| POINT | 集分宝 |
| DISCOUNT | 折扣券 |
| PCARD | 预付卡 |
| FINANCEACCOUNT | 余额宝 |
| MCARD | 商家储值卡 |
| MDISCOUNT | 商户优惠券 |
| MCOUPON | 商户红包 |
| PCREDIT | 蚂蚁花呗 |
上面的支付案例,是使用蚂蚁花呗支付。
结尾
本次使用的成熟的扩展包辅助开发,多数踩坑是配置信息导致,好在这些问题搜索可以有结果,所以开发不困难。