[TOC] #### 1. 准备资料 --- 沙箱环境: 用于开发时进行支付回调测试 支付宝开放平台: [https://open.alipay.com](https://open.alipay.com) , 使用支付宝扫码登录,进入控制台,找到沙箱环境 开放平台沙箱环境: [https://open.alipay.com/platform/appDaily.htm?tab=info](https://open.alipay.com/platform/appDaily.htm?tab=info)  **沙箱账号: 用于登录沙箱版支付宝** #### 2. 创建网页应用 --- 登录支付宝开放平台: [https://open.alipay.com](https://open.alipay.com) , 进入控制台面板: [https://open.alipay.com/platform/developerIndex.htm](https://open.alipay.com/platform/developerIndex.htm) 在控制台中的我的应用中创建 **网页&移动应用**,并且选择支付接入  应用类型设置为 **网页应用**,其他信息按照提示填写即可  #### 3. 生成支付宝应用公钥 ---- 点击接口加密方式中的 **设置**  加签内容配置  支付宝密钥在线生成器: [https://miniu.alipay.com/keytool/create](https://miniu.alipay.com/keytool/create) , 也可以下载软件版生成器生成密钥 将下图中的应用公钥复制并粘贴到上图中的 **序号3: 公钥字符**,进而得到支付宝应用公钥,开发者在调起支付时需要使用应用私钥和支付宝应用公钥。所以, 一定要将 **应用私钥、应用公钥、支付宝应用公钥** 保存好存起来  通过应用公钥获取到支付宝应用公钥,加签配置完成  #### 4. 商家绑定网页应用 --- 通过提示可得出结论: 要使用手机网站支付、当面付能力需要商家绑定此应用进行签约  进入支付宝商家中心: [https://mrchportalweb.alipay.com](https://mrchportalweb.alipay.com) , 在账号中心中找到 APPID 绑定,点击 `添加绑定`  输入支付宝开发平台网页应用的 APPID,点击 `下一步` 完成绑定  绑定此应用的商家如果已经签约该能力,应用的能力名称对应的状态直接就是 `已生效`  如果商家没有签约的话,可以在`商家中心-产品中心`进行签约, 签约成功后网页应用的状态自动变为 `已签约`  #### 5. 当面付: 买家扫描商家二维码完成支付 --- 技术栈: ThinkPHP6.0 + yansongda/pay=2.* + endroid/qr-code 使用 **yansongda/pay** 扩展包调用支付宝扫码支付接口 获取扫码支付URL地址, 例如: [https://qr.alipay.com/bax01214wuzcetwrql5700a8](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](https://pay.yansongda.cn/docs/v2/alipay/pay.html) 在构造方法中初始化配置参数,并且生成支付宝功能操作实例: **$alipay** ```php 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, 生成商家收款码,让用户使用支付宝扫码支付 ```php $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()** 来获取这些参数,或通过以下函数获取 ```php file_get_contents("php://input"); ``` 但是实际开发中要用扩展包提供的方式,因为它帮助我们完成了验签的操作,可以更好的处理回调逻辑 ```php /** * 异步通知地址 */ 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. 手机网站支付: 通过浏览器唤起支付宝客户端进行付款 --- 在构造方法中初始化配置并且获取操作实例 ```php 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](https://www.itqaq.com/h5_pay/index) ```php /** * 手机网站支付 */ public function index() { $order = [ 'out_trade_no' => time(), 'total_amount' => 1, 'subject' => '手机网站支付', ]; return $this->alipay->wap($order)->send(); } ``` 访问上面的 URL 链接地址,会自动重定向到以下页面,如下图所示,提供了两种支付方式: 1、 使用支付宝 APP 付款 (拉起支付宝客户端进行付款) 2、 继续浏览器付款 (登录支付宝账号进行付款)  支付成功后,异步通知同扫码支付,点击 `已完成付款` 会自动重定向到 **return_url** 地址,可在页面中放张支付成功的图片 