订单直充接口

您所在的位置:网站首页 爱奇艺错误码16-0-A00000-802 订单直充接口

订单直充接口

2024-07-16 17:54| 来源: 网络整理| 查看: 265

# 订单直充接口 # 简介 # 业务介绍

适用于ToB合作方,直充或单点,通过本文档的接口实现用户权益的开通

# 接口定义 # 应用场景

合作方订单完成后调用本接口,通知爱奇艺为用户发放会员权益

# 接口域名 环境 域名 生产 openapi.vip.iqiyi.com 测试 test-openapi.vip.iqiyi.com # URL

/partner/subscribe.action

# 请求方式 参数 说明 Method GET/POST Content-Type application/x-www-form-urlencoded # 请求参数

正式参数由爱奇艺商务提供,测试参数参见在线测试

变量名 名称 是否必须 说明 partnerNo 合作方编码 是 合作方的唯一标识,由爱奇艺提供 sign 签名串 是 MD5签名,签名方法见MD5加密描述 orderNo 订单号 是 合作方的订单号,字符串或数字或两者组合,必须能唯一标识每个订单 item 产品编码 是 产品编码,由爱奇艺提供 contentId 奇谱内容编号 产品编码为单点产品时必传 对应爱奇艺点播内容的奇谱id,只有当产品编码为单点产品时,此字段才有意义 amount 数量 是 购买产品数量 sum 金额 (整数) 是 订单总金额=(合作方侧商品售卖单价*amount),单位为“分”。爱奇艺侧会根据这个金额以及双方合同约定的结算方式和分成比例等,计算出结算价,用于双方最终结算。 mobile 用户手机号 3选1 手机号,未注册的爱奇艺会自动注册,并下发短信通知用户账号信息 encryptedMobile 加密的手机号 3选1 加密格式的手机号(其他同上),采用RSA加密,加密方法见RSA加密,密钥由爱奇艺提供 partnerUserId 合作方用户id 3选1 对于无法传手机号的合作方,在与爱奇艺passport完成对接后,可传此字段。如果同时传入mobile/ encryptedMobile字段,优先取此字段。 areaCode 手机号区号 否 不传默认为大陆手机区号86,海外手机号传国家代码 behavior 用户购买行为 否 爱奇艺侧用于统计用户的购买行为,并不影响订单的权益开通,取值:1-用户首购,2-用户续费,3-系统代为续费 version 接口版本号 否 当version≥2.0时,返回结果中才会包含startTime字段 fc 来源信息标识 否 非爱奇艺售卖渠道无需填写 fv 合作方为下游客户创建的FV 否 # 返回参数 字段名 类型 说明 code String 返回码,参考附录 msg String 返回码说明 startTime String version≥2.0后才会返回,会员开始时间,格式:yyyy-MM-dd HH:mm:ss deadline String 会员结束时间,格式:yyyy-MM-dd HH:mm:ss signPage String 自动续费签约页面地址URL(用户未签约时才返回) # 返回示例 { "code": "A00000", "msg": "成功", "data": { "startTime": "2016-11-11 12:00:00", "deadline": "2016-11-11 12:00:00", "signPage": "www.xxx.com/xxx" } } # 回码定义 返回码code 描述 备注 A00000 请求成功 Q00301 参数错误(如合作方编号为空,订单号非法等) Q00304 用户账号校验失败,合作方传过来的手机号等,我们需要去内部的账号系统校验合法性,如果在校验过程交互超时或校验失败,就会返回此错误码 建议重试或作为失败处理 Q00305 用户不是新用户(调用新用户产品时才会返回) Q00307 签名错误 Q00308 请求超时 建议重试或作为失败处理 Q00332 系统错误 Q00406 调交易下单失败,无法重试 Q00407 交易下单失败_系统在异步重试_请稍后重新下单 已生单,建议重试或者等异步通知,结果未知,不可直接当做失败或成功处理 Q00411 非有效的价格 Q00412 超过产品单次购买最大数量限制 Q00413 查询会员信息失败 建议重试或作为失败处理 Q00414 封停用户 Q00502 账号被风控 Q00504 产品库存不足 Q00505 用户已到限购次数 Q00506 产品库存扣减失败,请重试 建议重试或作为失败处理 Q00507 产品限购次数消耗失败,请重试 建议重试或作为失败处理 Q00607 未签约自动续费 Q00608 请求自动续费接口错误 建议重试或作为失败处理 Q00613 用户未购买过老版本学生会员套餐(仅老版本学生会员 未购买过老版本学生会员的用户不再支持购买老版本的学生会员) Q00614 用户已经是黄金或星钻会员, 无法购买学生会员套餐 Q00615 用户学生会员套餐已达购买次数上限(仅学生会员 学生会员权益累计购买时长不能超过24个月) Q00713 合作方用户没有可用的优惠资格,即身份校验没通过 # 幂等机制

如果在同步订单过程中接口返回错误,且返回的错误码在上述回码定义中未备注已生单,则合作方可以使用原订单号再次发起同步请求,爱奇艺会重新生单 返回的错误码如果在上述回码定义中备注为已生单,合作方使用原订单号再次发起同步请求时,爱奇艺侧会按照订单号做幂等处理,不会重复产生订单

# 附录 # MD5加密描述

采用MD5计算签名,MD5密钥由爱奇艺提供,具体计算方法如下: 1、 假设共有三个参数 a=3、b=2、c=1; 2、 按参数名的字母正序排列,再用“&”连接后得到串A,即为“a=3&b=2&c=1”; 3、 将MD5密钥拼接到串A后面,假设MD5密钥为“qwer”,则拼接后为“a=3&b=2&c=1qwer”; 4、 计算拼接串的MD5即为最终签名值,注意使用UTF-8编码计算,MD5后的签名最后都转成小写。 举例: 参数:a=3、b=2、c=1; MD5密钥:qwer 最终签名串:f80118ff523f25eda67cb799bdc9c52d

# JAVA版本示例代码如下: public class Test{ /** * MD5签名测试类 * */ private static final char[] DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; public static void main(String[] args) { TreeMap paramMap = new TreeMap(); paramMap.put("a", "3"); paramMap.put("b", "2"); paramMap.put("c", "1"); String md5key = "qwer"; String targetParam = Joiner.on("&").withKeyValueSeparator("=") .useForNull("").join(paramMap); // MD5签名工具类,可以自己实现, MD5实现参照 String targetSign = EncodeUtils.MD5(targetParam + md5key, "UTF-8"); System.out.println("targetSign: " + targetSign); } } # 加密工具类 # MD5加密 import com.google.common.base.Joiner; import org.apache.commons.lang.StringUtils; import org.junit.Test; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class EncodeUtils{ public static String MD5(String text, String charset) { MessageDigest msgDigest = null; try { msgDigest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { throw new IllegalStateException("System doesn't support MD5 algorithm."); } try { msgDigest.update(text.getBytes(charset)); //注意改接口是按照指定编码形式签名 } catch (UnsupportedEncodingException e) { throw new IllegalStateException("System doesn't support your EncodingException."); } byte[] bytes = msgDigest.digest(); String md5Str = new String(encodeHex(bytes)); return md5Str; } public static char[] encodeHex(byte[] data) { int l = data.length; char[] out = new char[l 4]; out[j++] = DIGITS[0x0F & data[i]]; } return out; } } # RSA加密 import org.apache.commons.codec.binary.Base64; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import java.io.ByteArrayOutputStream; import java.security.Key; import java.security.KeyFactory; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; /** * Description: 安全加密RSA. */ public class RsaUtil{ private static final int MAX_DECRYPT_BLOCK = 128; /** * 公钥加密过程 * * @param publicKey 公钥 base64转码串 * @param plainTextData 明文数据 * @return 加密结果Base64转码串 * @throws Exception 加密过程中的异常信息 */ public static String encryptForBase64(String publicKey, byte[] plainTextData) throws Exception { RSAPublicKey rsaPublicKey = getPublicKeyByStr(publicKey); BASE64Encoder base64 = new BASE64Encoder(); return base64.encode(encrypt(rsaPublicKey, plainTextData)); } /** * 公钥加密过程 * * @param publicKey * @param plainTextData * @return * @throws Exception */ public static byte[] encrypt(RSAPublicKey publicKey, byte[] plainTextData) throws Exception { if (publicKey == null) { System.out.println("加密公钥为空, 请设置"); throw new Exception(); } Cipher cipher = null; try { // 使用默认RSA cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] output = cipher.doFinal(plainTextData); return output; } catch (Exception e) { throw new Exception(e); } } public static RSAPublicKey getPublicKeyByStr(String publicKeyStr) throws Exception { try { BASE64Decoder Base64 = new BASE64Decoder(); byte[] buffer = Base64.decodeBuffer(publicKeyStr); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer); return (RSAPublicKey) keyFactory.generatePublic(keySpec); } catch (Exception e) { e.printStackTrace(); throw new Exception(e); } } } # 常见问题 # 签名错误

请仔细阅读按签名规则和示例代码,需要注意:参数值为null的,key也会参与计算签名,所以最好传参就去掉值为null的key。MD5后的签名最后都转成小写

# 下单未返回成功如何处理

可以重试发起下单、或接入回调接口等待我方成功后回调(如果接入了),我方重试间隔(回调时间点)如下: { "5s", "10s", "1m", "5m", "10m", "30m", "1h", "2h", "12h" } 即回调最晚时间是在12h后,如果下单后12h仍未回调,请联系我方人工处理

# 在线测试 参数 值 备注 partnerNo toB_common_test item 111222333444555single 111-天卡会员(1天)222-月卡会员(1月)333-季卡会员444-年卡会员555-周卡会员(7天)single-单点

所需密钥:

参数 值 MD5密钥 b0ee3c7f62760330 爱奇艺公钥 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYfgx6oYHOOyb4b9Os9zgtKfUaSqFCJSFS1CGRk1YYzuaUioK46nI+FiMY6OI1xgNvgaVEuIKYgM9niYaODVbvLIj8hx/By4nj91VcIg5b5lTj3no+yDewiecoBp3rohAgpfGDYwLmzuB8lL74XMr3GJPA8MDxdNncvtcXeYpohwIDAQAB 点击此处进行接口调试 在线调试

合作方领取三方商品权益接口 →



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3