cover

支付SDK 功能扩展

通用的支付插件,方便开发者对接支付平台:支付宝支付、虎皮椒支付、易支付


购买 / 收藏:请先登录


开发者:emlog


无代码加密 无额外授权 版本号:1.3.10 适配PHP:56,74,81

支付SDK

通用的支付插件,方便对接支付平台,目前只支持支付宝支付、虎皮椒支付、易支付。

🚨该插件需要配合其他应用主题或者插件来实现下单购买的功能,仅仅安装该插件没任何意义

支付宝

签约开通支付宝当面付

  • 注册并登录支付宝开放平台,完成个人或者企业认证
  • 申请开通支付宝当面付:按照提示完成当面付产品的签约(当面付个人认证用户提供办公场所照片也可以完成申请)。
  • 创建一个网页移动应用,得到 APPID
  • 进入应用开发设置:应用的加密方式为:密钥方式,最终会得到:应用私钥、支付宝公钥
  • 进入应用开发设置:填写应用网关和授权回调地址,具体地址由使用该SDK的应用提供。

插件设置

  • 进入插件设置页面:填写上一步得到的APPID、应用私钥、支付宝公钥
  • 设置完成即可,返回具体应用检查是否能唤起支付。

易支付

易支付是一套支付框架,基于这套框架可以搭建属于自己的易支付平台。市面上也有很多易支付平台,请仔细甄别,避免资金损失。

本插件基于易支付 v1 接口,参考文档:https://pay.ykmcn.com/doc/v1_legacy_api.html

虎皮椒支付

虎皮椒支付是一个个人支付接口平台,支持微信和支付宝收款。

申请虎皮椒支付

  1. 注册并登录 虎皮椒支付平台
  2. 完成实名认证和商户认证
  3. 创建应用,获得 APPID 和 APPSECRET
  4. 配置支付网关地址(默认为官方网关)
  5. 设置异步通知地址和同步跳转地址

设置插件

  • 进入插件设置页面,切换到"虎皮椒支付"选项卡
  • 填写从虎皮椒平台获得的APPID、APPSECRET
  • 确认网关地址(通常使用默认值即可)
  • 设置完成即可,返回具体应用检查是否能正常支付

开发者对接(普通用户请忽略)

1、支付宝当面付

发起当面付,获得支付二维码

代码对接部分针对应用开发者,普通用户请忽略

<?php 
$sku_id = Input::postIntVar('sku_id');
$sku_name = 'xxxxx';
$pay_type = 'alipay';
$pay_notify_url = BLOG_URL . 'user/order_callback';

$sku_info = $Log_Model->getDetail($sku_id);
$price = $sku_info['fields']['price'];

if ($price <= 0) {
    Output::error('价格错误', 200);
}

$Order_Model = new Order_Model('appname');
$order_id = $Order_Model->createOrder(UID, $pay_type, $sku_name, $sku_id, $price);

$paySdk = EmAliPaySdk::getInstance();
$response = $paySdk->createFaceToFacePayment($order_id, $price, '购买付费资源', $pay_notify_url);
if ($response['success']) {
    $qrCode = $response['qr_code'];
    Output::ok(['qrcode_url' => "https://api.qrserver.com/v1/create-qr-code/?data={$qrCode}", 'order_id' => $order_id, 'sku_id' => $sku_id], 200);
} else {
    Output::error($response['message'], 200);
}

发起网页支付 (支付宝电脑网站支付)

点击支付后跳转到支付宝网页端,展示收银台页面,用户可使用手机支付宝App扫描页面二维码完成支付。

<?php 
$sku_id = Input::postIntVar('sku_id');
$sku_name = 'xxxxx';
$pay_type = 'alipay';
$return_url = BLOG_URL . '?post=' . $sku_id;
$pay_notify_url = BLOG_URL . 'user/order_callback';

$sku_info = $Log_Model->getDetail($sku_id);
$price = $sku_info['fields']['price'];

if ($price <= 0) {
    Output::error('价格错误', 200);
}

$Order_Model = new Order_Model('appname');
$order_id = $Order_Model->createOrder(UID, $pay_type, $sku_name, $sku_id, $price);

$paySdk = EmAliPaySdk::getInstance();
// 返回自动提交的 HTML Form 表单字符串
$htmlForm = $paySdk->createWebPayment($order_id, $price, $return_url, $pay_notify_url);
echo $htmlForm;

支付回调

<?php 
$request = $_POST;
header('Content-Type: application/json');
if (empty($request)) {
    Output::error('参数错误', 200);
}
$paySdk = EmAliPaySdk::getInstance();
$result = $paySdk->handleFaceToFaceCallback($request);
if ($result) {
    $out_trade_no = isset($request['out_trade_no']) ? $request['out_trade_no'] : '';
    $Order_Model = new Order_Model('appname');
    $data = [
        'order_id' => $out_trade_no,
        'pay_price' => $result['total_amount'],
        'out_trade_no' => $result['trade_no'],
        'update_time' => time(),
    ];
    $Order_Model->updateOrder($out_trade_no, $data);
    Output::ok('success', 200);
} else {
    Output::error('fail', 200);
}

2、易支付

目前基于易支付 v1 接口,参考文档:https://pay.yuankainet.cn/doc_old.html

下单接口

$sku_id = Input::postIntVar('sku_id');
$sku_name = Input::postStrVar('sku_name');
$pay_type = Input::postStrVar('pay_type', 'alipay');
$pay_notify_url = BLOG_URL . 'user/order_callback'; // 支付成功后,易支付会回调该地址
$pay_return_url = BLOG_URL . 'user/order'; // 支付成功后跳转的页面

// 获取商品价格
$sku_info = $Log_Model->getDetail($sku_id);
$price = $sku_info['fields']['price'];

// 创建订单
$Order_Model = new Order_Model('wind-max');
$order_id = $Order_Model->createOrder(UID, $pay_type, $sku_name, $sku_id, $price);

$easyPay = EmEasyPaySdk::getInstance();
$result = $easyPay->createPageJumpPayment($order_id, $price, $sku_title, $pay_notify_url, $pay_return_url);

if ($result['success'] && isset($result['gateway_url'])) {
    Output::ok(['gateway_url' => $result['gateway_url'], 'order_id' => $result['order_id'], 'params' => $result['params']], 200);
} else {
    Output::error(isset($result['message']) ? $result['message'] : '易支付创建失败', 200);
}

前台js请求下单接口

前台js请求下单接口,利用下单接口返回的数据,构建form表单直接post提交跳转到支付页面,演示js代码如下:

// 支付按钮
<form id="payment-form-easypay" action="order_pay" method="post" class="space-y-4">
    <input type="hidden" id="sku_id" name="sku_id" value="<?= $sku_id ?>">
    <input type="hidden" id="sku_name" name="sku_name" value="<?= $sku_name ?>">
    <button type="submit" class="py-2 px-4 bg-green-600 hover:bg-green-700 focus:ring-green-500 focus:ring-offset-green-200 text-white w-full transition ease-in duration-200 text-center text-base font-semibold shadow-md focus:outline-none focus:ring-2 focus:ring-offset-2 rounded-lg flex items-center justify-center space-x-2">
        <span>去支付</span>
    </button>
</form>

// ajax请求下单接口
$('#payment-form-easypay').on('submit', function(e) {
    e.preventDefault();
    const formData = $(this).serialize();

    $.ajax({
        url: $(this).attr('action'),
        type: 'POST',
        data: formData,
        success: function(response) {
            if (response.code === 0) {
                generateAndSubmitPaymentForm(response.data.gateway_url, response.data.params);
            }
        },
        error: function() {
            cocoMessage.error('发起支付失败,请检查网络连接或稍后再试', 4000)
            closeModalWindow();
        }
    });
});

/**
 * 生成支付表单并自动提交,跳转到易支付平台,完成支付后跳转回返回页面
 */
function generateAndSubmitPaymentForm(gateway, params) {
    // 创建表单元素
    var form = document.createElement('form');
    form.id = 'dynamicPaymentForm';
    form.method = 'post';
    form.action = gateway;
    form.style.display = 'none';

    // 添加隐藏字段
    for (var key in params) {
        if (params.hasOwnProperty(key)) {
            var input = document.createElement('input');
            input.type = 'hidden';
            input.name = key;
            input.value = params[key];
            form.appendChild(input);
        }
    }

    // 将表单添加到页面并提交
    document.body.appendChild(form);
    form.submit();

    // 提交后移除表单
    setTimeout(function() {
        if (document.body.contains(form)) {
            document.body.removeChild(form);
        }
    }, 100);
}

支付成功异步通知回调

$request = $_GET;
if (empty($request)) {
    Output::error('参数错误', 200);
}
// 处理易支付回调
$easyPaySdk = EmEasyPaySdk::getInstance();
$result = $easyPaySdk->handleNotify($request);

if ($result) {
    $out_trade_no = $result['order_id'];
    $Order_Model = new Order_Model('wind-max');
    $data = [
        'order_id' => $out_trade_no,
        'pay_price' => $result['total_amount'],
        'out_trade_no' => $result['trade_no'],
        'update_time' => time(),
    ];
    $r = $Order_Model->updateOrder($out_trade_no, $data);
    // 易支付回调需要返回success
    echo 'success';
    exit;
} else {
    echo 'fail';
    exit;
}

虎皮椒支付

发起虎皮椒支付

<?php 
$sku_id = Input::postIntVar('sku_id');
$sku_name = 'xxxxx';
$pay_type = 'xunhu';
$notify_url = BLOG_URL . 'user/order_callback';
$return_url = BLOG_URL . '?post=' . $sku_id;

$sku_info = $Log_Model->getDetail($sku_id);
$price = $sku_info['fields']['price'];

if ($price <= 0) {
    Output::error('价格错误', 200);
}

$Order_Model = new Order_Model('appname');
$order_id = $Order_Model->createOrder(UID, $pay_type, $sku_name, $sku_id, $price);

$paySdk = EmXunhuPaySdk::getInstance();
$response = $paySdk->createPayment($order_id, $price, $sku_name, $notify_url, $return_url);
if ($response['success']) {
    // 支持两种支付方式:网页跳转和二维码支付
     echo "支付创建成功!<br>";
     echo "订单号:" . $response['order_id'] . "<br>";
     echo "支付链接:<a href='" . $response['pay_url'] . "' target='_blank'>点击支付</a><br>";

     // 如果有二维码地址,显示二维码支付选项
     if (!empty($response['qrcode_url'])) {
         echo "二维码支付:<br>";
         echo "<img src='" . $response['qrcode_url'] . "' alt='支付二维码' style='width:200px;height:200px;'><br>";
         echo "扫描上方二维码完成支付<br>";
     }
} else {
    Output::error($response['message'], 200);
}

返回结果:

  • success: 是否成功
  • order_id: 订单号
  • pay_url: 支付链接(跳转网页支付)
  • qrcode_url: 二维码支付地址(可选,用于生成二维码支付)

虎皮椒支付回调

            $request = $_POST;

            if (empty($request)) {
                // 虎皮椒回调失败需要返回 fail
                echo 'fail';
                exit;
            }

            $paySdk = EmXunhuPaySdk::getInstance();
            $result = $paySdk->handleNotify($request);

            if ($result) {
                $out_trade_no = $result['order_id'];
                $Order_Model = new Order_Model('appname');// 这里 appname改为你的应用名称
                $data = array(
                    'order_id' => $out_trade_no,
                    'pay_price' => $result['total_fee'],
                    'out_trade_no' => $result['transaction_id'],
                    'update_time' => time(),
                );

                $updateResult = $Order_Model->updateOrder($out_trade_no, $data);

                if ($updateResult) {
                    // 虎皮椒回调成功需要返回 success
                    echo 'success';
                    exit;
                } else {
                    echo 'fail';
                    exit;
                }
            } else {
                echo 'fail';
                exit;
            }
请先登录, 再发布评论

在支付宝的开发信息中,不小心设置了接口内容加密方式,怎么处理?如下:
加密后,接口的请求内容和响应内容将会由明文内容变为密文内容,可以大大提升接口内容传输的安全性。
选填,若不设置,则接口内容不会被加密。使用 获取会员手机号 等能力时,必填。更多信息请参见AES加密说明
已设置


阿六哥哥

铁杆 2025-08-11

希望后续接入微信支付~


使用sdk,延迟有5到12秒

emlog 铁杆 开发者 5个月前

新版已修复,可以更新试试


揽月听风

铁杆 2025-01-08

实际开发中存在如下问题,返回的是对象 需要修改为对象,否则会报错

avatar

emlog 开发者

新版已修复,可以更新试试


错误代码 missing-signature 错误原因: 缺少签名参数
这怎么整

avatar

emlog 开发者

加我QQ吧,点我名字进去有QQ


Hinoishi

铁杆 2024-10-11

回调地址怎么填

avatar

emlog 开发者

加我QQ吧,点我名字进去有QQ


填加个易支付吧!支付宝都被清退了!

avatar

emlog 开发者

感谢反馈,下个版本考虑下


星辰散人

铁杆 2024-04-05

是直接在里面填入文件内容还是文件路径?

avatar

emlog 开发者

配置支付信息即可


  • 1.3.10
    2个月前

    完善支付宝网页支付

  • 1.3.9
    4个月前

    提升兼容性

  • 1.3.8
    5个月前

    优化整体性能,避免影响站点加载速度

  • 1.3.7
    11个月前

  • 1.3.6
    12个月前

  • 1.3.5
    2025-09-28

  • 1.3.4
    2025-09-27

  • 1.3.3
    2025-09-27

  • 1.3.1
    2025-09-26

  • 1.2.1
    2025-08-07

  • 1.2.0
    2025-08-07

  • 1.1.1
    2025-01-08

  • 1.1.0
    2024-12-17

  • 1.0
    2024-04-03