支付能力
- 支付能力概览
- 收银中台产品介绍
- 接入准备
- 接入指南-注意事项
- 接入指南-扫码支付
- 接入指南-条码支付
- 接入指南-扩展功能
- 异步通知
- SDK&DEMO
- API 列表
- 支付对接常见字段问题
- 错误码列表
- 对接签名
- 新页面test
支付能力概览
收银中台产品介绍
test
接入准备
接入指南-注意事项
接入指南-扫码支付
接入指南-条码支付
接入指南-扩展功能
异步通知
SDK&DEMO
易百JAVA版SDK下载
public static void main(String[] args) {
String pattern = "yyyyMMdd";
String tradeNo = DateUtils.formatDate(new Date(), pattern) + System.currentTimeMillis();
// refund(tradeNo, tradeNo);
createTrade(tradeNo);
// queryPay();
// pay();
// queryTrade();
}
public static CashierClient getClient() {
CashierConfig config = new CashierConfig();
config.setAppId("ebuyfc163adf6a81");
config.setAppSecret("r0t1ngvqtp72xma6iy7m6hzy43ol5hz0");
config.setLang("zh_CN");
config.setUrl(Constants.UAT_URL);
return CashierClient.getCashierClient(config);
}
/**
* 统一下单
*/
public static void createTrade(String tradeNo) {
CashierClient cashierClient = getClient();
CreateTradeRequest createTradeRequest = new CreateTradeRequest();
//流水号格式固定
createTradeRequest.setOutTradeNo(tradeNo);
//使用场景必填,易百分配
createTradeRequest.setUseScene("H5");
//可提供给易百,易百配置
createTradeRequest.setNotifyUrl("https://develop.tuesday-tech.com/pcs/ebuy/notify");
//请求支付总金额
//如果有不走易百渠道优惠,扣除优惠部分
createTradeRequest.setTotalAmount(BigDecimal.valueOf(1.00));
//币种,国际标准
createTradeRequest.setCurrency("CNY");
//交易数据需区分到门店,需上传
//有优惠限制到门店,需上传
//有结算到门店,需上传
//其他需要上传门店信息到场景,需上传
// StoreInfo storeInfo = new StoreInfo();
// //店名称
// storeInfo.setName("test");
// //店号
// storeInfo.setShopNo("test");
// createTradeRequest.setStoreInfo(storeInfo);
//产品信息,建议所有订单产品上传
//有不需要走易百优惠的产品,不上传
//goodsDetail最大产品数限制100
List<OutGoodsDto> goodsDetail = new ArrayList<>();
OutGoodsDto outGoodsDto = new OutGoodsDto();
//产品名称,长度限制50
outGoodsDto.setGoodsName("测试产品");
//产品sku
outGoodsDto.setGoodsId("1061797738");
//产品数量
outGoodsDto.setGoodsNum(1);
//产品金额
outGoodsDto.setPriceSale(BigDecimal.valueOf(1.00));
goodsDetail.add(outGoodsDto);
createTradeRequest.setGoodsDetail(goodsDetail);
//支付方式集合
//支持优惠券coupon、商户储值卡cashcard、商户积分points、电子钱包cash(支付宝、微信等)、数字人民币ECNY
List<PayMethod> payMethod = new ArrayList<>();
PayMethod method = new PayMethod();
//coupon,cashcard的资产类型非必填,优先取易百路由结果
//其他场景必填
method.setAssetType("cash");
//coupon,cashcard的资产类型非必填,优先取易百路由结果
//其他场景必填
method.setPayWay("WECHAT");
//coupon不填,其他场景必填
method.setAmount(BigDecimal.valueOf(0.00));
//coupon,cashcard的资产必填
//如有密钥格式是cardCoupon01|secret01
method.setCardCoupons("10089234876342347753");
//指定优惠用在SKU为A的产品,如果A产品没上传,交易失败
method.setGoodsId("A");
/**
* 渠道会员id
* method.setThirdUserId("okKky5fnJb68U6c7Ujui3ZKVo6Ea");
*/
/**
* 资产使用限制规则
* method.setUseLimit("product");
*/
payMethod.add(method);
createTradeRequest.setPayMethod(payMethod);
//需要易百记录此笔交易中其他的支付信息
// List<Subsidy> subsidies = new ArrayList<>();
// Subsidy subsidy = new Subsidy();
// //支付主体
// subsidy.setAccount("xx");
// //支付金额
// subsidy.setAmount(BigDecimal.valueOf(20));
// subsidies.add(subsidy);
// createTradeRequest.setSubsidy(subsidies);
PaasResponse<CreateTradeResponse> createTradeResponse = cashierClient.createTrade(createTradeRequest);
System.out.println(createTradeResponse);
//只有全部成功此处是true,其他均为false
//如false,content不一定有
createTradeResponse.isSuccess();
//返回报文签名
createTradeResponse.getSign();
//uuid和请求一致
createTradeResponse.getUuid();
//报错码
createTradeResponse.getErrorCode();
//报错原因
createTradeResponse.getErrorMessage();
if (createTradeResponse.getContent() != null) {
CreateTradeResponse body = (CreateTradeResponse) createTradeResponse.getContent();
//PaidResult 某种资产(商家券、商家卡、商家积分、电子钱包和数字人民币)支付结果
PaidResult paidResult = body.getCardPaid();
if (paidResult != null) {
//此支付资产支付总金额
paidResult.getPaidAmount();
//此支付资产用户实付金额
paidResult.getUserAmount();
//此支付资产商户实收金额
paidResult.getMerchantAmount();
//此支付资产优惠金额入账编码
paidResult.getDiscountCode();
//此支付资产实收金额入账编码
paidResult.getTenderCode();
//此支付资产使用明显,正常不返回
paidResult.getUseList();
}
//电子钱包支付详情,字段描述同上
body.getCashPaid();
//优惠券支付详情,字段描述同上
body.getCouponPaid();
//电子钱包支付渠道的app id
body.getChannelAppId();
//唤起电子钱包支付渠道支付台报文
body.getChannelParams();
//总支付成功金额
body.getPaidAmount();
//总用户实付总金额
body.getUserPaid();
//总商户实收总金额
body.getMerchantAmount();
//电子钱包预支付id
body.getPrepayId();
//支付二维码
body.getQrCodeUrl();
//支付跳转页面
body.getRedirectUrl();
}
}
易百JS版SDK下载
API 列表
支付对接常见字段问题
/**
* 获取请求客户端对象
* setAppId ebuy分配的应用id
* setAppSecret ebuy分配的密钥
* setLang使用的语言
* setUrl请求的环境地址
*/
public static CashierClient getClient() {
CashierConfig config = new CashierConfig();
config.setAppId("ebuy6fbbe5471500");
config.setAppSecret("rbnoi3klpiell7qqby2ipy8jprrbtaf9");
config.setLang("zh_CN");
config.setUrl(Constants.PRO_URL);
return CashierClient.getCashierClient(config);
}
/**
* 退款示例
* 只填写流水号代表整单退,流水号的格式:YYYYMMDD + 随机字符串,总长度小于等于32位
* 如果部分退款需要填写refundMethod,填写退款资产类型和退款金额
* tradeNo 是正交易时流水号
* refundTradeNo退请求流水号
*/
public static void refund(String tradeNo, String refundTradeNo) {
CashierClient cashierClient = getClient();
RefundRequest refundRequest = new RefundRequest();
//正交易流水号
refundRequest.setOutTradeNo(tradeNo);
//退款请求流水号
refundRequest.setRefundTradeNo(refundTradeNo);
PaasResponse<RefundResponse> refundResponse = cashierClient.refund(refundRequest);
System.out.println(refundResponse);
//只有全部成功此处是true,其他均为false
//如false,content不一定有
//退款不做强一致性校验,可以查看明细
//资产类不一定能退款,需要对应支付平台支持
refundResponse.isSuccess();
//返回报文签名
refundResponse.getSign();
//uuid和请求一致
refundResponse.getUuid();
//报错码
refundResponse.getErrorCode();
//报错原因
refundResponse.getErrorMessage();
if (refundResponse.getContent() != null) {
//退款信息
RefundResponse refund = (RefundResponse) refundResponse.getContent();
//退款时间
refund.getRefundTime();
//总退款金额
refund.getRefundAmount();
//退款的交易流水号
refund.getOutTradeNo();
//资产退款详情,商家储值卡
RefundResult rslt = refund.getCardRefund();
//此资产退款金额
rslt.getRefundAmount();
//此资产退款状态
rslt.getRefundStatus();
//电子钱包退款详情
refund.getCashRefund();
//商家优惠券类退款详情
refund.getCouponRefund();
//商家积分积分类退款详情
refund.getPointsRefund();
}
}
/**
* 统一下单
*/
public static void createTrade(String tradeNo) {
CashierClient cashierClient = getClient();
CreateTradeRequest createTradeRequest = new CreateTradeRequest();
//流水号格式固定
createTradeRequest.setOutTradeNo(tradeNo);
//使用场景必填,易百分配
createTradeRequest.setUseScene("WECHAT_MINI");
//提供给易百,易百配置
createTradeRequest.setNotifyUrl("https://develop.tuesday-tech.com/pcs/ebuy/notify");
//请求支付总金额
//如果有不走易百渠道优惠,扣除优惠部分
createTradeRequest.setTotalAmount(BigDecimal.valueOf(10.00));
//币种,国际标准
createTradeRequest.setCurrency("SGD");
//支付身份信息
UserInfo userInfo = new UserInfo();
//支付者id
userInfo.setUserId("okKky5fnJb68U6c7Ujui3ZKVo6Ea");
//支付者id所在平台,易百提供
userInfo.setPlatform("WECAHT_O");
createTradeRequest.setUserInfo(userInfo);
//交易数据需区分到门店,需上传
//有优惠限制到门店,需上传
//有结算到门店,需上传
//其他需要上传门店信息到场景,需上传
StoreInfo storeInfo = new StoreInfo();
//店名称
storeInfo.setName("Fresh4ALL");
//店号
storeInfo.setShopNo("fresh4allmp");
createTradeRequest.setStoreInfo(storeInfo);
//产品信息,建议所有订单产品上传
//有不需要走易百优惠的产品,不上传
//goodsDetail最大产品数限制100
List<OutGoodsDto> goodsDetail = new ArrayList<>();
OutGoodsDto outGoodsDto = new OutGoodsDto();
//产品名称,长度限制50
outGoodsDto.setGoodsName("test");
//产品sku
outGoodsDto.setGoodsId("1061797738");
//产品数量
outGoodsDto.setGoodsNum(41);
//产品金额
outGoodsDto.setPriceSale(BigDecimal.valueOf(1.00));
goodsDetail.add(outGoodsDto);
createTradeRequest.setGoodsDetail(goodsDetail);
//支付方式集合
//支持优惠券coupon、商户储值卡cashcard、商户积分points、电子钱包cash(支付宝、微信等)、数字人民币ECNY
List<PayMethod> payMethod = new ArrayList<>();
PayMethod method = new PayMethod();
//coupon,cashcard的资产类型非必填,优先取易百路由结果
//其他场景必填
method.setAssetType("cash");
//coupon,cashcard的资产类型非必填,优先取易百路由结果
//其他场景必填
method.setPayWay("WECHAT");
//coupon不填,其他场景必填
method.setAmount(BigDecimal.valueOf(0.00));
//coupon,cashcard的资产必填
//如有密钥格式是cardCoupon01|secret01
method.setCardCoupons("10089234876342347753");
//指定优惠用在SKU为A的产品,如果A产品没上传,交易失败
method.setGoodsId("A");
payMethod.add(method);
createTradeRequest.setPayMethod(payMethod);
//需要易百记录此笔交易中其他的支付信息
List<Subsidy> subsidies = new ArrayList<>();
Subsidy subsidy = new Subsidy();
//支付主体
subsidy.setAccount("xx");
//支付金额
subsidy.setAmount(BigDecimal.valueOf(20));
subsidies.add(subsidy);
createTradeRequest.setSubsidy(subsidies);
PaasResponse<CreateTradeResponse> createTradeResponse = cashierClient.createTrade(createTradeRequest);
System.out.println(createTradeResponse);
//只有全部成功此处是true,其他均为false
//如false,content不一定有
createTradeResponse.isSuccess();
//返回报文签名
createTradeResponse.getSign();
//uuid和请求一致
createTradeResponse.getUuid();
//报错码
createTradeResponse.getErrorCode();
//报错原因
createTradeResponse.getErrorMessage();
if (createTradeResponse.getContent() != null) {
CreateTradeResponse body = (CreateTradeResponse) createTradeResponse.getContent();
//PaidResult 某种资产(商家券、商家卡、商家积分、电子钱包和数字人民币)支付结果
PaidResult paidResult = body.getCardPaid();
//此支付资产支付总金额
paidResult.getPaidAmount();
//此支付资产用户实付金额
paidResult.getUserAmount();
//此支付资产商户实收金额
paidResult.getMerchantAmount();
//此支付资产优惠金额入账编码
paidResult.getDiscountCode();
//此支付资产实收金额入账编码
paidResult.getTenderCode();
//此支付资产使用明显,正常不返回
paidResult.getUseList();
//电子钱包支付详情,字段描述同上
body.getCashPaid();
//优惠券支付详情,字段描述同上
body.getCouponPaid();
//电子钱包支付渠道的app id
body.getChannelAppId();
//唤起电子钱包支付渠道支付台报文
body.getChannelParams();
//总支付成功金额
body.getPaidAmount();
//总用户实付总金额
body.getUserPaid();
//总商户实收总金额
body.getMerchantAmount();
//电子钱包预支付id
body.getPrepayId();
//支付二维码
body.getQrCodeUrl();
//支付跳转页面
body.getRedirectUrl();
}
}
/**
* 交易查询
*/
public static void queryTrade() {
CashierClient cashierClient = getClient();
QueryTradeRequest queryTradeRequest = new QueryTradeRequest();
//正交易交易流水号
queryTradeRequest.setOutTradeNo("20210621swuirptcttimyjbofgdnoqrj");
//正交易时间
queryTradeRequest.setTradeTime("");
//返回报文类似正交易报文
PaasResponse<QueryTradeResponse> queryTradeResponse = cashierClient.queryTrade(queryTradeRequest);
}
错误码列表
错误码 |
描述 |
SYSTEM_ERROR |
系统错误 |
SYSTEM_BUSY |
系统繁忙 |
REQUEST_UUID_FORMAT_ERROR |
uuid格式错误 |
REQUEST_APPID_FORMAT_ERROR |
应用id格式错误 |
SIGN_TYPE_NOT_SUPPORT |
签名类型不支持 |
SIGN_CHECK_NOT_PASS |
签名校验失败 |
GET_APP_AUTH_INFO_ERRRO |
配置获取错误 |
TRADE_FAIL |
交易失败 |
TRADE_SUCCESS |
交易成功 |
TRADE_CLOSE |
交易已关闭 |
TRADE_NO_USED |
交易流水号重复 |
INVALID_PARAMETER |
参数错误 |
INVALID_CONFIG |
业务配置错误 |
ACCESS_FORBIDDEN |
无权限 |
PULL_CASHIER_FAIL |
唤起收银台失败 |
ACCOUNT_INVALID |
用户账号异常 |
COUPON_INVALID |
券状态异常 |
COUPON_USED |
券已使用 |
COUPON_NOEXIST |
券不存在 |
TIME_LIMIT |
资产使用时间限制 |
对接签名
1. 协议
请求协议:https协议post请求
Content-Type: application/json
报文格式(请求&返回):json
2. 请求地址
uat环境:https://uat-paas-gateway.e-buychina.com
3. 安全签名
签名算法:
为了保证请求及接收数据在传输过程中不被篡改,对接口请求及响应数据统一使用sha256进行签名。请求需要计算签名值,响应报文需要校验paas返回的签名值。
签名方法:
将json格式请求报文第一级key按照字母表顺序排序后使用key1=value1&key2=value2格式拼接成字符串最后再拼上签名密钥。
特别说明:
如果value也是一个对象,将对象转成json转字符串后参与签名。
使用SHA-256签名算法
4. 签名示例:appId=ebuyde43082858d1;KEY=D6954F665B12A4318DF2DE43082858DE
1、原始请求报文
{
"action":"refund",
"appId":"ebuyde43082858d1",
"content":{
"outTradeNo":"202107071625649048080",
"refundTradeNo":"202107071625649048080"
},
"lang":"zh_CN",
"signType":"sha256",
"timestamp":1625649048115,
"uuid":"20210707-cd28bed6332846979cf012223c981a14"
}
2、签名字符串拼接
content对象先转String字符串后再拼接,键值key值根据ASCII码的顺序拼接
拼接示例:action=refund&appId=ebuyde43082858d1&content={"outTradeNo":"202107071625649048080","refundTradeNo":"202107071625649048080"}&lang=zh_CN&signType=sha256×tamp=1625649048115&uuid=20210707-cd28bed6332846979cf012223c981a14
3、签名前字符串
拼接KEY:action=refund&appId=ebuyde43082858d1&content={"outTradeNo":"202107071625649048080","refundTradeNo":"202107071625649048080"}&lang=zh_CN&signType=sha256×tamp=1625649048115&uuid=20210707-cd28bed6332846979cf012223c981a14&D6954F665B12A4318DF2DE43082858DE
4、签名结果
sign=cefb7347b73b2793a6d4a99993480500bd74752e7b983acedb9515166e22d271