易支付虚拟商品接口 - API集成示例与SDK下载
易支付作为主流免签约支付解决方案,其虚拟商品接口专为激活码、数字素材、会员权益等场景设计,支持 “支付回调 + 自动发货” 闭环,适配个人开发者与中小型平台。以下提供 API 核心参数、多语言集成示例、SDK 下载地址 及调试技巧,帮助快速完成对接。
一、核心准备:接口参数与环境要求
1. 必备接口参数(从易支付平台获取)
对接前需在易支付商户后台(如彩虹易支付、码支付)创建应用,获取以下核心参数,缺一不可:
| 参数名称 | 说明 | 获取路径 |
|---|---|---|
| 商户唯一标识 | 商户后台 → API 管理 → 基本信息 | |
| 接口签名密钥(用于验证请求合法性) | 商户后台 → API 管理 → 密钥设置(需手动生成) | |
| 支付接口请求地址(提交订单) | 商户后台 → API 文档 → 虚拟商品支付接口 | |
| 支付回调地址(接收支付结果) | 自行开发(需公网可访问,如 | |
| 支付成功跳转地址(前端页面) | 自行配置(如订单完成页、商品交付页) |
2. 环境要求
二、SDK 下载:官方 / 第三方适配资源
易支付无统一官方 SDK,但第三方开发者已针对主流语言开发适配工具,推荐从正规渠道下载,避免恶意代码:
| 语言 / 框架 | 推荐 SDK / 工具 | 下载地址(安全渠道) | 适配场景 |
|---|---|---|---|
| PHP(通用) | 彩虹易支付 PHP SDK | GitHub:rainbow-pay/php-sdk(开源无广告) | 个人开发者、小型虚拟商品站 |
| PHP(WooCommerce) | ITCRY WOOPAY 插件(内置易支付 API) | GitHub:itcry/woo-pay(适配电商场景) | WooCommerce 商城虚拟商品 |
| Java | 易支付 Java 通用 SDK | Gitee:yee-pay/java-sdk(含完整示例) | 企业级平台、自研系统 |
| Python | 易支付 Python 轻量 SDK | PyPI: | 快速开发、小型工具 |
| Node.js | 易支付 Node.js SDK | npm: | Node.js 搭建的虚拟商品站 |
下载注意事项
三、API 集成示例:以 PHP 为例(最常用场景)
以下以 “虚拟商品(激活码)支付” 为例,演示 订单创建→支付发起→回调处理→自动发货 全流程,使用彩虹易支付 PHP SDK。
1. 第一步:SDK 初始化(引入核心文件)
将下载的 SDK 解压后,放入项目目录(如
// 引入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.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. 第四步:支付成功跳转页(前端提示)
用户支付完成后,会自动跳转到
// 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. 调试技巧
2. 常见问题解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 订单创建失败,提示 “签名错误” | 1. 参数缺失(如 | 1. 核对 |
| 支付成功后未触发回调 | 1. 回调地址未公网可访问;2. 服务器防火墙拦截易支付 IP;3. 回调页面返回非 “success” | 1. 用 |
| 自动发货失败 | 1. 激活码库存为空;2. 邮件 / 短信接口异常;3. 附加数据解析错误 | 1. 检查激活码库存是否充足;2. 单独测试邮件接口是否能正常发送;3. 用 |
| 支付页面无法打开 | 1. 易支付接口地址错误;2. 服务器未启用 HTTPS;3. 参数格式错误(如金额为整数) | 1. 核对商户后台的 API 接口地址;2. 申请 SSL 证书并启用 HTTPS;3. 金额需保留两位小数(如 99.00 而非 99) |
六、安全与合规注意事项
通过以上步骤,即可完成易支付虚拟商品接口的集成,实现 “用户支付→自动发货” 的全自动化流程,适配激活码、数字素材等各类虚拟商品收款场景。若需更复杂的功能(如会员订阅、跨境支付),可参考易支付 API 文档扩展开发。
