zl程序教程

您现在的位置是:首页 >  APP

当前栏目

微信小程序中的支付宝支付

2023-02-18 16:45:56 时间

1. 准备资料


沙箱环境: 用于开发时进行支付回调测试

支付宝开放平台: https://open.alipay.com , 使用支付宝扫码登录,进入控制台,找到沙箱环境

开放平台沙箱环境: https://open.alipay.com/platform/appDaily.htm?tab=info

沙箱账号: 用于登录沙箱版支付宝

2. 创建网页应用


登录支付宝开放平台: https://open.alipay.com , 进入控制台面板: https://open.alipay.com/platform/developerIndex.htm

在控制台中的我的应用中创建 网页&移动应用,并且选择支付接入

应用类型设置为 网页应用,其他信息按照提示填写即可

3. 生成支付宝应用公钥


点击接口加密方式中的 设置

加签内容配置

支付宝密钥在线生成器: https://miniu.alipay.com/keytool/create , 也可以下载软件版生成器生成密钥

将下图中的应用公钥复制并粘贴到上图中的 序号3: 公钥字符,进而得到支付宝应用公钥,开发者在调起支付时需要使用应用私钥和支付宝应用公钥。所以, 一定要将 应用私钥、应用公钥、支付宝应用公钥 保存好存起来

通过应用公钥获取到支付宝应用公钥,加签配置完成

4. 商家绑定网页应用


通过提示可得出结论: 要使用手机网站支付、当面付能力需要商家绑定此应用进行签约

进入支付宝商家中心: https://mrchportalweb.alipay.com , 在账号中心中找到 APPID 绑定,点击 添加绑定

输入支付宝开发平台网页应用的 APPID,点击 下一步 完成绑定

绑定此应用的商家如果已经签约该能力,应用的能力名称对应的状态直接就是 已生效

如果商家没有签约的话,可以在商家中心-产品中心进行签约, 签约成功后网页应用的状态自动变为 已签约

5. 当面付: 买家扫描商家二维码完成支付


技术栈: 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();
}

6. 手机网站支付: 通过浏览器唤起支付宝客户端进行付款


在构造方法中初始化配置并且获取操作实例

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 地址,可在页面中放张支付成功的图片