Appearance
在线支付
支付宝
支付宝是常用的在线支付手段,斑马兽网站就在使用支付宝完成在线付款。
支付应用
首先登录支付宝网站 然后进入 产品中心 选择支付产品,根据需要开通你的支付应用。

如果已经创建过应用可以在控制台查看

生成证书
支付宝官网提供了生成密钥 的文档,下面我再把这些步骤给提炼一下。
密钥工具
需要使用工具来生成密钥,访问支付宝文档然后根据系统选择下载。
苹果用会出现无法运行的情况, 在系统设置中的安全与隐私中允许其打开。

生成密钥
下面来生成的网站的支付密钥,打开软件后点击 生成密钥 按钮

然后点击获取CSR文件,为之后生成证书做准备


然后点击 打开文件位置 记住这个位置,这些文件不要删除。

生成证书
点击上图中的上传公钥链接,将跳转到支付宝应用界面。然后选择你要更改密钥的应用。
在弹出的菜单中选择「加密变更」来设置密钥
在弹出的界面中选择加密变更/公钥证书,然后点击 上传CSR文件在线生成证书按钮 将刚才生成的csr文件上传
然后将证书下载,之后在程序中使用
编写程序
下面进入我们的项目来实现在线支付。
安装扩展
我们来使用 yansongda/pay 扩展包快速为网站集成支付宝支付,使用 composer 安装扩展包。
composer require yansongda/pay:~3.2.0 -vvv
网站配置
我们需要使用上面生成的 crt 文件与appid及应用私钥。
app_id 指应用 ID 在 支付密钥管理 界面查看到

应用私钥 是通过密钥工具生成的应用私钥如下图
软件会将密钥文件保存到系统中,苹果电脑用户会保存在 文稿/支付宝开放平台开发助手/CSR 目录中

如果你把软件不小心关闭了,可以在 文稿/支付宝开放平台开发助手/CSR 获取

然后创建 config/alipay.php 配置文件,内容如下
<?php
use Yansongda\Pay\Pay;
return [
'alipay' => [
'default' => [
// 必填-支付宝分配的 app_id
'app_id' => env('ALIPAY_APP_ID'),
// 必填-应用私钥 字符串或路径
'app_secret_cert' => env('ALIPAY_APP_SECRET_CRET'),
// 必填-应用公钥证书 文件类似:appCertPublicKey_2017xxxx.crt
'app_public_cert_path' => base_path(env('ALIPAY_APP_PUBLIC_CERT_PATH')),
// 必填-支付宝公钥证书 文件类似:ertPublicKey_RSA2.crt
'alipay_public_cert_path' => base_path(env('ALIPAY_PUBLIC_CERT_PATH')),
// 必填-支付宝根证书 文件类似:crt/alipayRootCert.crt
'alipay_root_cert_path' => base_path(env('ALIPAY_ROOT_CERT_PATH')),
'return_url' => '',
'notify_url' => '',
// 选填-第三方应用授权token
'app_auth_token' => '',
// 选填-服务商模式下的服务商 id,当 mode 为 Pay::MODE_SERVICE 时使用该参数
'service_provider_id' => '',
// 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
'mode' => Pay::MODE_NORMAL,
]
],
'wechat' => [
'default' => [
// 必填-商户号,服务商模式下为服务商商户号
'mch_id' => '',
// 必填-商户秘钥
'mch_secret_key' => '',
// 必填-商户私钥 字符串或路径
'mch_secret_cert' => '',
// 必填-商户公钥证书路径
'mch_public_cert_path' => '',
// 必填
'notify_url' => 'https://yansongda.cn/wechat/notify',
// 选填-公众号 的 app_id
'mp_app_id' => '2016082000291234',
// 选填-小程序 的 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' => [
'45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__ . '/Cert/wechatPublicKey.crt',
],
// 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SERVICE
// 'mode' => Pay::MODE_NORMAL,
]
],
'unipay' => [
'default' => [
// 必填-商户号
'mch_id' => '777290058167151',
// 必填-商户公私钥
'mch_cert_path' => __DIR__ . '/Cert/unipayAppCert.pfx',
// 必填-商户公私钥密码
'mch_cert_password' => '000000',
// 必填-银联公钥证书路径
'unipay_public_cert_path' => __DIR__ . '/Cert/unipayCertPublicKey.cer',
// 必填
'return_url' => 'https://yansongda.cn/unipay/return',
// 必填
'notify_url' => 'https://yansongda.cn/unipay/notify',
],
],
'logger' => [
'enable' => false,
'file' => base_path('logs/pay.log'),
'level' => 'info', // 建议生产环境等级调整为 info,开发环境为 debug
'type' => 'single', // optional, 可选 daily.
'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
],
'http' => [ // optional
'timeout' => 5.0,
'connect_timeout' => 5.0,
// 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
],
];
业务代码
下面是 Laravel 框架为例编写支付控制器代码
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Log;
use Yansongda\Pay\Pay;
class AlipayController extends Controller
{
public function __construct()
{
$config = config('alipay');
$config['alipay']['default']['return_url'] = url('/api/alipay/return');
$config['alipay']['default']['notify_url'] = url('/api/alipay/notify');
Pay::config($config);
}
//发起支付
public function pay()
{
return Pay::alipay()->web([
//商户订单
'out_trade_no' => '' . time(),
'total_amount' => '0.01',
'subject' => 'yansongda 测试 - 1',
]);
}
//同步通知
public function returnUrl(Request $request)
{
$result = Pay::alipay()->callback();
//下面根据定单数据完成网站业务
dump($result);
}
//异步通知
public function notifyUrl()
{
$pay = Pay::alipay();
$result = $pay->callback();
//下面根据定单数据完成网站业务
dump($result);
return $pay->success();
}
}
沙箱模式
沙箱环境 (Beta) 是协助开发者进行接口功能开发及主要功能联调的辅助环境。
支付宝会不定期维护沙箱模式,所以会出现使用少箱模式不稳定的情况
应用配置
访问 沙箱应用 来获取测试应用的 APPID 等数据

有关密钥的生成请查看下面的生成密钥部分
沙箱钱包
使用沙箱环境测试时,不能使用正常的支付宝应用,需要安装沙箱版钱包。
- 沙箱钱包只支持 Android 手机
- 使用手机浏览器扫码下载安装

然后使用沙箱帐号进行登录

常见问题
- INVALID_SIGN: Alipay Sign Verify FAILED
- 如果沙盒模式下提示 「支付存在钓鱼风险!防钓鱼网站的方法」,重起浏览器或使用其他浏览器测试
- 沙箱 APP 扫码付款时如果提示「系统有点尽快,一会再试试,或者可以在电脑上付款」,是因为付款帐户与收款帐户相同