易支付安全、低费率、实时到账

易支付虚拟商品接口 - API集成示例与SDK下载

易支付作为主流免签约支付解决方案,其虚拟商品接口专为激活码、数字素材、会员权益等场景设计,支持 “支付回调 + 自动发货” 闭环,适配个人开发者与中小型平台。以下提供 API 核心参数、多语言集成示例、SDK 下载地址 及调试技巧,帮助快速完成对接。

一、核心准备:接口参数与环境要求

1. 必备接口参数(从易支付平台获取)

对接前需在易支付商户后台(如彩虹易支付、码支付)创建应用,获取以下核心参数,缺一不可:

参数名称说明获取路径
merchant_id商户唯一标识商户后台 → API 管理 → 基本信息
api_key接口签名密钥(用于验证请求合法性)商户后台 → API 管理 → 密钥设置(需手动生成)
pay_url支付接口请求地址(提交订单)商户后台 → API 文档 → 虚拟商品支付接口
notify_url支付回调地址(接收支付结果)自行开发(需公网可访问,如https://xxx.com/notify.php)
return_url支付成功跳转地址(前端页面)自行配置(如订单完成页、商品交付页)

2. 环境要求

  • 服务器:支持 PHP/Java/Python/Node.js 等主流语言,需启用curl扩展(发起 HTTP 请求)、openssl扩展(签名加密);

  • 协议:必须使用 HTTPS(易支付接口要求,避免数据泄露);

  • 字符编码:统一为 UTF-8,防止中文参数乱码。

二、SDK 下载:官方 / 第三方适配资源

易支付无统一官方 SDK,但第三方开发者已针对主流语言开发适配工具,推荐从正规渠道下载,避免恶意代码:

语言 / 框架推荐 SDK / 工具下载地址(安全渠道)适配场景
PHP(通用)彩虹易支付 PHP SDKGitHub:rainbow-pay/php-sdk(开源无广告)个人开发者、小型虚拟商品站
PHP(WooCommerce)ITCRY WOOPAY 插件(内置易支付 API)GitHub:itcry/woo-pay(适配电商场景)WooCommerce 商城虚拟商品
Java易支付 Java 通用 SDKGitee:yee-pay/java-sdk(含完整示例)企业级平台、自研系统
Python易支付 Python 轻量 SDKPyPI:pip install yee-pay-sdk(搜索 “yee-pay-sdk”)快速开发、小型工具
Node.js易支付 Node.js SDKnpm:npm install easy-pay-api(开源维护版)Node.js 搭建的虚拟商品站

下载注意事项

  1. 优先选择 GitHub/Gitee 开源项目(star 数≥50),避免百度网盘等非正规渠道的破解版;

  2. 下载后核对文件完整性(如 PHP SDK 需包含Pay.php、Sign.php、Notify.php核心文件);

  3. 若需自定义开发,可直接参考易支付商户后台的《API 文档》,无需依赖 SDK。

三、API 集成示例:以 PHP 为例(最常用场景)

以下以 “虚拟商品(激活码)支付” 为例,演示 订单创建→支付发起→回调处理→自动发货 全流程,使用彩虹易支付 PHP SDK。

1. 第一步:SDK 初始化(引入核心文件)

将下载的 SDK 解压后,放入项目目录(如/vendor/easypay/),在支付页面引入并配置参数:

// 引入SDK核心文件
require_once './vendor/easypay/Pay.php';
require_once './vendor/easypay/Sign.php';

// 配置易支付参数(替换为你的实际信息)
$config = [
    'merchant_id' => '123456', // 你的商户ID
    'api_key'     => 'abcdef1234567890abcdef1234567890', // 你的API密钥
    'pay_url'     => 'https://www.101epay.com/pay/create', // 易支付接口地址
    'notify_url'  => 'https://yourdomain.com/pay/notify.php', // 回调地址(公网可访问)
    'return_url'  => 'https://yourdomain.com/pay/success.php', // 支付成功跳转页
];

// 初始化支付对象
$easyPay = new EasyPayPay($config);

2. 第二步:创建订单并发起支付

用户选择虚拟商品(如 “软件激活码 - 99 元”)后,后台生成订单并调用易支付接口,唤起支付页面:

// 1. 组装订单数据(虚拟商品必填参数)
$orderData = [
    'out_trade_no' => 'VIP_' . time() . rand(1000, 9999), // 唯一订单号(自定义格式,需唯一)
    'total_amount' => 99.00, // 支付金额(单位:元,支持两位小数)
    'subject'      => '软件激活码(终身授权)', // 商品名称(将显示在支付页面)
    'body'         => '激活码支付后自动发送至预留邮箱', // 商品描述
    'client_ip'    => $_SERVER['REMOTE_ADDR'], // 用户IP(用于风控)
    'attach'       => json_encode([
        'goods_type' => 'activation_code', // 商品类型(自定义,用于回调区分)
        'user_email' => 'user@example.com' // 用户预留邮箱(用于发放激活码)
    ]) // 附加数据(回调时会原样返回)
];

// 2. 生成签名(SDK内置签名方法,无需手动计算)
$sign = EasyPaySign::generateSign($orderData, $config['api_key']);
$orderData['sign'] = $sign;

// 3. 调用易支付接口,发起支付请求
try {
    $result = $easyPay->createOrder($orderData);
    // 成功:跳转至易支付扫码支付页面
    if ($result['code'] == 200) {
        header("Location: " . $result['data']['pay_url']);
        exit;
    } else {
        // 失败:输出错误信息(调试用)
        echo "创建订单失败:" . $result['msg'];
    }
} catch (Exception $e) {
    echo "接口调用异常:" . $e->getMessage();
}

3. 第三步:支付回调处理(核心!自动发货逻辑)

用户支付成功后,易支付会向notify_url发送 POST 请求,携带支付结果,需在回调页面验证签名并触发自动发货:

// notify.php(回调处理页面,无前端界面)
require_once './vendor/easypay/Pay.php';
require_once './vendor/easypay/Sign.php';

// 配置参数(与创建订单时一致)
$config = [
    'merchant_id' => '123456',
    'api_key'     => 'abcdef1234567890abcdef1234567890',
];

// 1. 接收易支付回调数据
$notifyData = $_POST;
if (empty($notifyData)) {
    exit("fail"); // 无数据,直接返回失败
}

// 2. 验证签名(关键!防止伪造回调)
$sign = $notifyData['sign'];
unset($notifyData['sign']); // 移除sign字段后重新计算签名
$verifySign = EasyPaySign::generateSign($notifyData, $config['api_key']);

if ($verifySign != $sign) {
    error_log("回调签名验证失败:" . json_encode($notifyData));
    exit("fail"); // 签名不一致,返回失败
}

// 3. 验证支付状态(只有支付成功才处理)
if ($notifyData['trade_status'] != 'SUCCESS') {
    exit("success"); // 非成功状态,返回成功避免易支付重复回调
}

// 4. 解析订单数据,触发自动发货
$outTradeNo = $notifyData['out_trade_no']; // 订单号
$attach = json_decode($notifyData['attach'], true); // 附加数据
$userEmail = $attach['user_email']; // 用户邮箱
$goodsType = $attach['goods_type']; // 商品类型

// 5. 自动发货逻辑(以激活码为例)
if ($goodsType == 'activation_code') {
    // 从激活码库中随机抽取1个未使用的激活码(需自行实现库存管理)
    $activationCode = getUnusedActivationCode(); 
    // 发送激活码至用户邮箱(需集成邮件接口,如PHPMailer)
    $sendResult = sendActivationCode($userEmail, $activationCode, $outTradeNo);
    
    // 6. 记录订单状态(更新数据库,标记为“已支付+已发货”)
    updateOrderStatus($outTradeNo, 'paid', $activationCode);
    
    if ($sendResult) {
        exit("success"); // 处理成功,返回success告知易支付无需重复回调
    } else {
        error_log("激活码发送失败:订单号=" . $outTradeNo);
        exit("fail"); // 处理失败,易支付会重试回调(默认3次)
    }
}

// 回调处理成功,必须返回“success”字符串(否则易支付会持续回调)
exit("success");

// 以下为辅助函数(需自行实现)
function getUnusedActivationCode() {
    // 从数据库/文件中获取未使用的激活码
    // 示例:return "ABC1234567890XYZ";
}

function sendActivationCode($email, $code, $orderNo) {
    // 集成邮件发送逻辑(如PHPMailer)
    // 邮件内容:包含订单号、激活码、使用教程
    return true; // 发送成功返回true,失败返回false
}

function updateOrderStatus($orderNo, $status, $code) {
    // 更新订单数据库状态(如MySQL)
}

4. 第四步:支付成功跳转页(前端提示)

用户支付完成后,会自动跳转到return_url配置的页面,用于展示支付成功信息并引导用户查看激活码:

// success.php(支付成功页)
$orderNo = $_GET@['out_trade_no'] ?? ''; // 从跳转参数中获取订单号
if (empty($orderNo)) {
    echo "订单号不存在!";
    exit;
}

// 查询订单状态(从数据库获取)
$order = getOrderInfo($orderNo);
?>



    
    支付成功


    

支付成功!

    

订单号:

    

商品名称:

    

支付金额:

    

激活码已发送至您的邮箱:

    

若未收到,请查看垃圾邮件或联系客服

    返回首页

四、其他语言集成示例(简化版)

1. Python 集成(使用requests库)

import requests
import json
import hashlib
import time
import random

# 配置参数
config = {
    "merchant_id": "123456",
    "api_key": "abcdef1234567890abcdef1234567890",
    "pay_url": "https://api.caihongpay.com/pay/create",
    "notify_url": "https://yourdomain.com/pay/notify",
    "return_url": "https://yourdomain.com/pay/success"
}

# 生成签名
def generate_sign(data, api_key):
    sorted_data = sorted(data.items(), key=lambda x: x[0])
    sign_str = "".join([f"{k}{v}" for k, v in sorted_data]) + api_key
    return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()

# 创建订单
def create_order():
    order_data = {
        "out_trade_no": f"VIP_{int(time.time())}{random.randint(1000, 9999)}",
        "total_amount": 99.00,
        "subject": "软件激活码(终身授权)",
        "body": "自动发货至邮箱",
        "client_ip": "127.0.0.1",
        "attach": json.dumps({"user_email": "user@example.com"})
    }
    order_data["sign"] = generate_sign(order_data, config["api_key"])
    
    response = requests.post(config["pay_url"], data=order_data)
    result = response.json()
    if result["code"] == 200:
        print("支付链接:", result["data"]["pay_url"])
    else:
        print("创建失败:", result["msg"])

if __name__ == "__main__":
    create_order()

2. Java 集成(使用OkHttp库)

import okhttp3.*;
import java.util.TreeMap;
import java.security.MessageDigest;

public class EasyPayDemo {
    // 配置参数
    private static final String MERCHANT_ID = "123456";
    private static final String API_KEY = "abcdef1234567890abcdef1234567890";
    private static final String PAY_URL = "https://api.caihongpay.com/pay/create";

    // 生成签名
    public static String generateSign(TreeMap data) {
        StringBuilder sb = new StringBuilder();
        for (String key : data.keySet()) {
            sb.append(key).append(data.get(key));
        }
        sb.append(API_KEY);
        return md5(sb.toString()).toUpperCase();
    }

    // MD5加密
    public static String md5(String str) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] bytes = md.digest(str.getBytes("UTF-8"));
            StringBuilder sb = new StringBuilder();
            for (byte b : bytes) {
                sb.append(String.format("%02x", b));
            }
            return sb.toString();
        } catch (Exception e) {
            return "";
        }
    }

    // 创建订单
    public static void createOrder() throws Exception {
        TreeMap orderData = new TreeMap<>();
        String orderNo = "VIP_" + System.currentTimeMillis() + (int) (Math.random() * 9000 + 1000);
        orderData.put("out_trade_no", orderNo);
        orderData.put("total_amount", "99.00");
        orderData.put("subject", "软件激活码(终身授权)");
        orderData.put("body", "自动发货至邮箱");
        orderData.put("client_ip", "127.0.0.1");
        orderData.put("attach", "{"user_email":"user@example.com"}");
        orderData.put("sign", generateSign(orderData));

        // 发起POST请求
        OkHttpClient client = new OkHttpClient();
        FormBody.Builder formBody = new FormBody.Builder();
        for (String key : orderData.keySet()) {
            formBody.add(key, orderData.get(key));
        }
        Request request = new Request.Builder().url(PAY_URL).post(formBody.build()).build();
        Response response = client.newCall(request).execute();
        String result = response.body().string();
        System.out.println("接口返回:" + result);
    }

    public static void main(String[] args) throws Exception {
        createOrder();
    }
}

五、调试与常见问题排查

1. 调试技巧

  • 启用易支付 “测试模式”:在商户后台开启测试模式,可使用测试金额(0.01 元)模拟支付,无需真实付款;

  • 查看接口日志:在代码中添加日志记录(如error_log、System.out),记录请求参数、响应结果、签名信息,便于排查;

  • 回调地址测试:使用ngrok将本地地址映射为公网(如ngrok http 80),用于本地调试回调逻辑,避免部署后才发现问题。

2. 常见问题解决方案

问题现象可能原因解决方案
订单创建失败,提示 “签名错误”1. 参数缺失(如merchant_id未传);2. 签名生成规则与易支付不一致;3. 编码格式非 UTF-81. 核对orderData参数是否完整;2. 按易支付 API 文档重新实现签名(参考 SDK 方法);3. 确保请求时指定Content-Type: application/x-www-form-urlencoded; charset=utf-8
支付成功后未触发回调1. 回调地址未公网可访问;2. 服务器防火墙拦截易支付 IP;3. 回调页面返回非 “success”1. 用curl测试回调地址是否能访问(如curl https://xxx.com/notify.php);2. 在服务器放行易支付 IP 段(商户后台可查询);3. 确保回调处理成功后输出 “success”(无多余字符)
自动发货失败1. 激活码库存为空;2. 邮件 / 短信接口异常;3. 附加数据解析错误1. 检查激活码库存是否充足;2. 单独测试邮件接口是否能正常发送;3. 用json_decode解析attach时添加JSON_UNESCAPED_UNICODE参数,避免中文乱码
支付页面无法打开1. 易支付接口地址错误;2. 服务器未启用 HTTPS;3. 参数格式错误(如金额为整数)1. 核对商户后台的 API 接口地址;2. 申请 SSL 证书并启用 HTTPS;3. 金额需保留两位小数(如 99.00 而非 99)

六、安全与合规注意事项

  1. 签名密钥api_key需妥善保管,禁止泄露给第三方,建议每 3 个月更换一次;

  2. 订单号out_trade_no必须唯一,避免重复订单导致支付混乱;

  3. 回调页面需验证签名和支付状态,防止恶意伪造回调触发发货;

  4. 虚拟商品需在购买页标注 “虚拟商品,交付后不支持无理由退款”,避免纠纷;

  5. 定期备份激活码库存和订单数据,防止服务器故障导致数据丢失。

通过以上步骤,即可完成易支付虚拟商品接口的集成,实现 “用户支付→自动发货” 的全自动化流程,适配激活码、数字素材等各类虚拟商品收款场景。若需更复杂的功能(如会员订阅、跨境支付),可参考易支付 API 文档扩展开发。


返回顶部