Skip to content

在线支付

支付宝

向军大叔每晚八点在 抖音bilibli 直播

xj-small

支付宝是常用的在线支付手段,后盾人网站就在使用支付宝完成在线付款。

支付应用

首先登录支付宝网站 然后进入 产品中心 选择支付产品,根据需要开通你的支付应用。

image-20220627173247079

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

image-20220627174455036

生成证书

支付宝官网提供了生成密钥 的文档,但可能有些同学看得有点绕,下面我再把这些步骤给提炼一下。

密钥工具

需要使用工具来生成密钥,访问支付宝文档然后根据系统选择下载。

  • WINDOWS(Windows 版本工具请不要安装在含有空格的目录路径下,否则会导致公私钥乱码的问题)。
  • MAC_OSX

苹果用会出现无法运行的情况, 在系统设置中的安全与隐私中允许其打开。

image-20210806182456550

生成密钥

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

image-20220627173742886

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

image-20221012204548096image-20220627172204802

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

image-20220627172431123

生成证书

  1. 点击上图中的上传公钥链接,将跳转到支付宝应用界面。然后选择你要更改密钥的应用。
image-20200715155417065
  1. 在弹出的菜单中选择「加密变更」来设置密钥
image-20200715155536279
  1. 在弹出的界面中选择加密变更/公钥证书,然后点击 上传CSR文件在线生成证书按钮 将刚才生成的csr文件上传

    image-20220627172612478
  2. 然后将证书下载,之后在程序中使用

image-20220627172955133

编写程序

下面进入我们的项目来实现在线支付。

安装扩展

我们来使用 yansongda/pay 扩展包快速为网站集成支付宝支付,使用 composer 安装扩展包。

composer require yansongda/pay:~3.2.0 -vvv

网站配置

我们需要使用上面生成的 crt 文件与appid及应用私钥。

app_id 指应用 ID 在 支付密钥管理 界面查看到

image-20210806191034926

应用私钥 是通过密钥工具生成的应用私钥如下图

软件会将密钥文件保存到系统中,苹果电脑用户会保存在 文稿/支付宝开放平台开发助手/CSR 目录中

image-20200715164209128

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

image-20221012214259052

然后创建 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 等数据

image-20200811112448609

有关密钥的生成请查看下面的生成密钥部分

沙箱钱包

使用沙箱环境测试时,不能使用正常的支付宝应用,需要安装沙箱版钱包

  • 沙箱钱包只支持 Android 手机
  • 使用手机浏览器扫码下载安装
image-20200811113446231

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

image-20200811191141507

常见问题

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