沙箱环境: 用于开发时进行支付回调测试
支付宝开放平台: https://open.alipay.com , 使用支付宝扫码登录,进入控制台,找到沙箱环境
开放平台沙箱环境: https://open.alipay.com/platform/appDaily.htm?tab=info
沙箱账号: 用于登录沙箱版支付宝
登录支付宝开放平台: https://open.alipay.com , 进入控制台面板: https://open.alipay.com/platform/developerIndex.htm
在控制台中的我的应用中创建 网页&移动应用,并且选择支付接入
应用类型设置为 网页应用,其他信息按照提示填写即可
点击接口加密方式中的 设置
加签内容配置
支付宝密钥在线生成器: https://miniu.alipay.com/keytool/create , 也可以下载软件版生成器生成密钥
将下图中的应用公钥复制并粘贴到上图中的 序号3: 公钥字符,进而得到支付宝应用公钥,开发者在调起支付时需要使用应用私钥和支付宝应用公钥。所以, 一定要将 应用私钥、应用公钥、支付宝应用公钥 保存好存起来
通过应用公钥获取到支付宝应用公钥,加签配置完成
通过提示可得出结论: 要使用手机网站支付、当面付能力需要商家绑定此应用进行签约
进入支付宝商家中心: https://mrchportalweb.alipay.com , 在账号中心中找到 APPID 绑定,点击 添加绑定
输入支付宝开发平台网页应用的 APPID,点击 下一步
完成绑定
绑定此应用的商家如果已经签约该能力,应用的能力名称对应的状态直接就是 已生效
如果商家没有签约的话,可以在商家中心-产品中心
进行签约, 签约成功后网页应用的状态自动变为 已签约
技术栈: ThinkPHP6.0 + yansongda/pay=2.* + endroid/qr-code
使用 yansongda/pay 扩展包调用支付宝扫码支付接口
获取扫码支付URL地址, 例如: https://qr.alipay.com/bax01214wuzcetwrql5700a8
composer require yansongda/pay:^2.10
使用 endroid/qr-code 扩展包将支付宝接口返回的URL地址转为二维码 (收款码)
composer require endroid/qr-code
查看扫码支付章节: https://pay.yansongda.cn/docs/v2/alipay/pay.html
在构造方法中初始化配置参数,并且生成支付宝功能操作实例: $alipay
public function __construct()
{
$config = [
'app_id' => '', // 应用appid
'notify_url' => '', // 异步通知地址
'ali_public_key' => '', // 支付宝应用公钥
'private_key' => '', // 应用私钥 加密方式: **RSA2**
'mode' => 'dev', // 设置此参数,将进入沙箱模式;省略该参数,进入正式环境
];
$this->alipay = \Yansongda\Pay\Pay::alipay($config);
}
qrcode 是一个 URL 地址,根据此地址生成一张二维码 image, 生成商家收款码,让用户使用支付宝扫码支付
$order = [
'out_trade_no' => time(), // 商家订单号
'total_amount' => 1, // 订单金额,单位:元
'subject' => '购买商品', // 订单备注
];
try {
// 应用 appid 配置错误时会抛出异常
$qrcode = $this->alipay->scan($order)->qr_code;
} catch (\Exception $e) {
// 异常处理 记录日志 ...
// $e->getMessage()
}
$image = \Qrcode::generate($qrcode);
echo '<img src="' . $image . '">';
异步通知地址: 当用户使用支付宝支付成功后,支付宝会向配置的 notify_url
发送请求,并携带一些参数
在 ThinkPHP 6.0 中可以通过 input() 来获取这些参数,或通过以下函数获取
file_get_contents("php://input");
但是实际开发中要用扩展包提供的方式,因为它帮助我们完成了验签的操作,可以更好的处理回调逻辑
/**
* 异步通知地址
*/
public function notify()
{
try {
$data = $this->alipay->verify(); // 是的,验签就这么简单!
// 请自行对 trade_status 进行判断及其它逻辑进行判断
// 只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。
// 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
// 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
// 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方
// 4、验证app_id是否为该商户本身。
// 5、其它业务逻辑情况
if (in_array($data->trade_status, ['TRADE_SUCCESS', 'TRADE_FINISHED'], true)) {
// 业务逻辑处理 修改订单状态
}
} catch (\Exception $e) {
// $e->getMessage();
}
return $this->alipay->success()->send();
}
在构造方法中初始化配置并且获取操作实例
public function __construct()
{
$config = [
'app_id' => '', // 应用appid
'notify_url' => '', // 异步通知地址
'return_url' => '', // 回调地址
'ali_public_key' => '', // 支付宝应用公钥
'private_key' => '', // 应用私钥 加密方式: **RSA2**
'mode' => 'dev', // 设置此参数,将进入沙箱模式;省略该参数,进入正式环境
];
$this->alipay = \Yansongda\Pay\Pay::alipay($config);
}
在小程序中可以生成一个 URL 链接地址,让用户复制链接至浏览器进行支付
这个链接地址就是调用手机网站支付的控制器方法入口,比如: https://www.itqaq.com/h5_pay/index
/**
* 手机网站支付
*/
public function index()
{
$order = [
'out_trade_no' => time(),
'total_amount' => 1,
'subject' => '手机网站支付',
];
return $this->alipay->wap($order)->send();
}
访问上面的 URL 链接地址,会自动重定向到以下页面,如下图所示,提供了两种支付方式:
1、 使用支付宝 APP 付款 (拉起支付宝客户端进行付款) 2、 继续浏览器付款 (登录支付宝账号进行付款)
支付成功后,异步通知同扫码支付,点击 已完成付款
会自动重定向到 return_url 地址,可在页面中放张支付成功的图片