本项目的官方GitHub地址是 https://github.com/beecloud/beecloud-java
本SDK的是根据BeeCloud Rest API开发的Java SDK,适用于JRE 1.6及以上平台。可以作为调用BeeCloud Rest API的示例或者直接用于生产。
1.从github下载带依赖的jar文件,然后导入到自己的工程依赖包中
2.若是工程采用maven进行依赖配置,可在自己工程的pom.xml文件里加入以下配置
<dependency>
<groupId>cn.beecloud</groupId>
<artifactId>beecloud-java-sdk</artifactId>
<version>3.1.3</version>
</dependency>
工程名以及版本号需要保持更新。(更新可参考本项目的pom.xml,文件最顶端)
三个步骤,2分钟轻松搞定:
BeeCloud.registerApp(appId, testSecret, appSecret, masterSecret);
BeeCloud.registerApp(appId, testSecret, appSecret, masterSecret);
LIVE模式testSecret可为null
默认开启LIVE模式
BeeCloud.registerApp(appId, testSecret, appSecret, masterSecret);
BeeCloud.setSandbox(true);
SANDBOX模式appSecret、masterSecret可为null
设置sandbox属性为true,开启SANDBOX模式
国际支付接口接收BCInternationlOrder参数对象,该对象封装了发起国际支付所需的各个具体参数。
成功发起国际支付接口将会返回带objectId的BCInternationlOrder对象。
若是跳转至paypal支付,返回的BCInternationlOrder对象包含跳转支付url,用户跳转至此url,登陆paypal便可完成支付。
若是直接使用信用卡支付,直接支付成功,返回的BCInternationlOrder对象包含信用卡ID,此ID在快捷支付时需要。
若是通过信用卡ID支付,直接支付成功。
发起国际支付异常情况将抛出BCException, 开发者需要捕获此异常进行相应失败操作 开发者可根据异常消息判断异常的具体信息,异常信息的格式为"resultCode:xxx;resultMsg:xxx;errDetail:xxx"。
BCInternationlOrder internationalOrder = new BCInternationlOrder();
/*
* PAYPAL内支付
*/
internationalOrder.setChannel(PAY_CHANNEL.PAYPAL_PAYPAL);
internationalOrder.setBillNo(billNo);
internationalOrder.setCurrency(PAYPAL_CURRENCY.USD);
internationalOrder.setTitle("paypal test");
internationalOrder.setTotalFee(1);
internationalOrder.setReturnUrl(paypalReturnUrl);
try {
internationalOrder = BCPay.startBCInternatioalPay(internationalOrder);
out.println(internationalOrder.getObjectId());
response.sendRedirect(internationalOrder.getUrl());
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
BCInternationlOrder internationalOrder = new BCInternationlOrder();
/*
* 信用卡支付
*/
CreditCardInfo creditCardInfo = new CreditCardInfo();
creditCardInfo.setCardNo("5183182005528540");
creditCardInfo.setExpireMonth(11);
creditCardInfo.setExpireYear(19);
creditCardInfo.setCvv(350);
creditCardInfo.setFirstName("SAN");
creditCardInfo.setLastName("ZHANG");
creditCardInfo.setCardType(CARD_TYPE.mastercard);
internationalOrder.setBillNo(billNo);
internationalOrder.setChannel(PAY_CHANNEL.PAYPAL_CREDITCARD);
internationalOrder.setCreditCardInfo(creditCardInfo);
internationalOrder.setCurrency(PAYPAL_CURRENCY.USD);
internationalOrder.setTitle("paypal credit card test");
internationalOrder.setTotalFee(1);
try {
internationalOrder = BCPay.startBCInternatioalPay(internationalOrder);
out.println(internationalOrder.getObjectId());
out.println("PAYPAL_CREDITCARD 支付成功!");
out.println(internationalOrder.getCreditCardId());
request.getSession().setAttribute("creditCardId", internationalOrder.getCreditCardId());//存储信用卡ID
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
/*
* 信用卡ID支付
*/
internationalOrder.setBillNo(billNo);
internationalOrder.setChannel(PAY_CHANNEL.PAYPAL_SAVED_CREDITCARD);
internationalOrder.setCurrency(PAYPAL_CURRENCY.USD);
internationalOrder.setTitle("PAYPAL_SAVED_CREDITCARD test");
internationalOrder.setTotalFee(1);
internationalOrder.setBillNo(request.getSession().getAttribute("creditCardId").toString());//使用信用卡ID
try {
internationalOrder = BCPay.startBCInternatioalPay(internationalOrder);
out.println(internationalOrder.getObjectId());
out.println("PAYPAL_SAVED_CREDITCARD 支付成功!");
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
代码中的参数对象BCInternationlOrder封装字段含义如下:
key | 说明 |
---|---|
channel | 渠道类型, 根据不同场景选择不同的支付方式,包含: PAYPAL_PAYPAL paypal内支付 PAYPAL_CREDITCARD 使用信用卡支付 PAYPAL_SAVED_CREDITCARD 使用存储的信用卡id支付(必填) |
totalFee | 订单总金额, 只能为整数,单位为分,例如 1,(必填) |
billNo | 商户订单号, 8到32个字符内,数字和/或字母组合,确保在商户系统中唯一, 例如(201506101035040000001),(必填) |
title | 订单标题, 32个字节内,最长支持16个汉字,(必填) |
currency | 货币种类代码,包含: AUD BRL CAD CZK DKK EUR HKD HUF ILS JPY MYR MXN TWD NZD NOK PHP PLN GBP SGD SEK CHF THB TRY THB USD(必填) |
creditCardInfo | 信用卡信息, 当channel为PAYPAL_CREDITCARD必填, (选填) |
creditCardId | 信用卡id,当使用PAYPAL_CREDITCARD支付完成后会返回一个信用卡id, 当channel为PAYPAL_SAVED_CREDITCARD必填,(选填) |
returnUrl | 同步返回页面 , 支付渠道处理完请求后,当前页面自动跳转到商户网站里指定页面的http路径。当channel为PAYPAL_PAYPAL时为必填,(选填) |
objectId | 境外支付订单唯一标识, 下单成功后返回 |
url | 当channel 为PAYPAL_PAYPAL时返回,跳转支付的url |
信用卡信息对象CreditCardInfo封装字段含义如下:
key | 说明 |
---|---|
cardNo | 卡号,(必填) |
expireMonth | 过期时间中的月,(必填) |
expireYear | 过期时间中的年,(必填) |
cvv | 信用卡的三位cvv码,(必填) |
firstName | 用户名字,(必填) |
lastName | 用户的姓,(必填) |
cardType | 卡类别 visa/mastercard/discover/amex,(必填) |
国内支付接口接收BCOrder参数对象,该对象封装了发起国内际支付所需的各个具体参数。
成功发起国内支付接口将会返回带objectId的BCOrder对象。
发起国内支付异常情况将抛出BCException, 开发者需要捕获此异常进行相应失败操作 开发者可根据异常消息判断异常的具体信息,异常信息的格式为"resultCode:xxx;resultMsg:xxx;errDetail:xxx"。
返回的BCOrder对象包含表单支付html和跳转支付url,开发者提交支付表单或者跳转至url完成支付。
BCOrder bcOrder = new BCOrder(PAY_CHANNEL.ALI_WEB, 1, billNo, title);
bcOrder.setBillTimeout(360);
bcOrder.setReturnUrl(aliReturnUrl);
try {
bcOrder = BCPay.startBCPay(bcOrder);
out.println(bcOrder.getObjectId());
Thread.sleep(3000);
out.println(bcOrder.getHtml());
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回的BCOrder对象包含表单支付html和跳转支付url,开发者提交支付表单或者跳转至url完成支付。
BCOrder bcOrder = new BCOrder(PAY_CHANNEL.ALI_WAP, 1, billNo, title);
bcOrder.setBillTimeout(360);
bcOrder.setReturnUrl(aliReturnUrl);
try {
bcOrder = BCPay.startBCPay(bcOrder);
out.println(bcOrder.getObjectId());
Thread.sleep(3000);
out.println(bcOrder.getHtml());
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回的BCOrder对象包含表单支付html和跳转支付url,开发者提交支付表单或者跳转至url完成支付。
BCOrder bcOrder = new BCOrder(PAY_CHANNEL.ALI_QRCODE, 1, billNo, title);
bcOrder.setBillTimeout(360);
bcOrder.setReturnUrl(aliReturnUrl);
bcOrder.setQrPayMode(QR_PAY_MODE.MODE_FRONT);
try {
bcOrder = BCPay.startBCPay(bcOrder);
out.println(bcOrder.getObjectId());
Thread.sleep(3000);
out.println(bcOrder.getHtml());
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回的BCOrder对象包含code url,格式为:weixin://wxpay/bizpayurl?sr=XXXXX。 调用第三方库将返回的code url生成二维码图片。 该模式链接较短,生成的二维码打印到结账小票上的识别率较高。
BCOrder bcOrder = new BCOrder(PAY_CHANNEL.WX_NATIVE, 1, billNo, title);
bcOrder.setBillTimeout(360);
try {
bcOrder = BCPay.startBCPay(bcOrder);
out.println(bcOrder.getObjectId());
out.println(bcOrder.getCodeUrl());
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回的BCOrder对象包wxJSAPIMap对象;获取openId,并使用wxJSAPIMap对象完成支付。进一步实现参考demo
BCOrder bcOrder = new BCOrder(PAY_CHANNEL.WX_JSAPI, 1, billNo, title);
bcOrder.setBillTimeout(360);
String openId = resultObject.get("openid").toString();//获取openId
bcOrder.setOpenId(openId);
bcOrder = BCPay.startBCPay(bcOrder);
try {
bcOrder = BCPay.startBCPay(bcOrder);
out.println(bcOrder.getObjectId());
Map<String, String> map = bcOrder.getWxJSAPIMap();
jsapiAppid = map.get("appId").toString();
timeStamp = map.get("timeStamp").toString();
nonceStr = map.get("nonceStr").toString();
jsapipackage = map.get("package").toString();
signType = map.get("signType").toString();
paySign = map.get("paySign").toString();
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回的BCOrder对象包含表单支付html,开发者提交支付表单即可完成支付。
BCOrder bcOrder = new BCOrder(PAY_CHANNEL.UN_WEB, 1, billNo, title);
bcOrder.setReturnUrl(unReturnUrl);
bcOrder.setBillTimeout(360);
try {
bcOrder = BCPay.startBCPay(bcOrder);
out.println(bcOrder.getObjectId());
out.println(bcOrder.getHtml());
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回的BCOrder对象包含表单支付html,开发者提交支付表单即可完成支付。
BCOrder bcOrder = new BCOrder(PAY_CHANNEL.KUAIQIAN_WEB, 1, billNo, title);
bcOrder.setReturnUrl(kqReturnUrl);
bcOrder.setBillTimeout(360);
try {
bcOrder = BCPay.startBCPay(bcOrder);
out.println(bcOrder.getObjectId());
out.println(bcOrder.getHtml());
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回的BCOrder对象包含表单支付html,开发者提交支付表单即可完成支付。
BCOrder bcOrder = new BCOrder(PAY_CHANNEL.KUAIQIAN_WAP, 1, billNo, title);
bcOrder.setReturnUrl(kqReturnUrl);
bcOrder.setBillTimeout(360);
try {
bcOrder = BCPay.startBCPay(bcOrder);
out.println(bcOrder.getObjectId());
out.println(bcOrder.getHtml());
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回的BCOrder对象包含表单支付html,开发者提交支付表单即可完成支付。
BCOrder bcOrder = new BCOrder(PAY_CHANNEL.JD_WEB, 1, billNo, title);
bcOrder.setReturnUrl(jdReturnUrl);
try {
bcOrder = BCPay.startBCPay(bcOrder);
out.println(bcOrder.getObjectId());
out.println(bcOrder.getHtml());
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回的BCOrder对象包含表单支付html,开发者提交支付表单即可完成支付。
BCOrder bcOrder = new BCOrder(PAY_CHANNEL.JD_WAP, 1, billNo, title);
bcOrder.setReturnUrl(jdReturnUrl);
try {
bcOrder = BCPay.startBCPay(bcOrder);
out.println(bcOrder.getObjectId());
out.println(bcOrder.getHtml());
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回的BCOrder对象包含跳转支付url,开发者跳转至url完成支付。
BCOrder bcOrder = new BCOrder(PAY_CHANNEL.YEE_WEB, 1, billNo, title);
bcOrder.setReturnUrl(yeeWebReturnUrl);
bcOrder.setBillTimeout(360);
try {
bcOrder = BCPay.startBCPay(bcOrder);
out.println(bcOrder.getObjectId());
response.sendRedirect(bcOrder.getUrl());
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回的BCOrder对象包含跳转支付url,开发者跳转至url完成支付。
BCOrder bcOrder = new BCOrder(PAY_CHANNEL.YEE_WAP, 1, billNo, title);
bcOrder.setBillTimeout(360);
bcOrder.setReturnUrl(yeeWapReturnUrl);
try {
bcOrder = BCPay.startBCPay(bcOrder);
out.println(bcOrder.getObjectId());
response.sendRedirect(bcOrder.getUrl());
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回的BCOrder对象包含objectId, 支付完成。
BCOrder bcOrder = new BCOrder(PAY_CHANNEL.YEE_NOBANKCARD, 1, billNo, title);
String cardNo = "15078120125091678";
String cardPwd = "121684730734269992";
String frqid = "SZX";
bcOrder.setTotalFee(10);
bcOrder.setCardNo(cardNo);
bcOrder.setCardPwd(cardPwd);
bcOrder.setFrqid(frqid);
try {
bcOrder = BCPay.startBCPay(bcOrder);
out.println("点卡支付成功!");
out.println(bcOrder.getObjectId());
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回的BCOrder对象包含跳转支付url,开发者跳转至url完成支付。
BCOrder bcOrder = new BCOrder(PAY_CHANNEL.BD_WAP, 1, billNo, title);
bcOrder.setReturnUrl(bdReturnUrl);
bcOrder.setBillTimeout(360);
try {
bcOrder = BCPay.startBCPay(bcOrder);
out.println(bcOrder.getObjectId());
response.sendRedirect(bcOrder.getUrl());
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回的BCOrder对象包含跳转支付url,开发者跳转至url完成支付。
BCOrder bcOrder = new BCOrder(PAY_CHANNEL.BD_WEB, 1, billNo, title);
bcOrder.setReturnUrl(bdReturnUrl);
bcOrder.setBillTimeout(360);
try {
bcOrder = BCPay.startBCPay(bcOrder);
out.println(bcOrder.getObjectId());
response.sendRedirect(bcOrder.getUrl());
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
代码中的参数对象BCOrder封装字段含义如下: 请求参数及返回字段:
key | 说明 |
---|---|
channel | 渠道类型, 根据不同场景选择不同的支付方式,包含: WX_NATIVE 微信公众号二维码支付 WX_JSAPI 微信公众号支付 ALI_WEB 支付宝网页支付 ALI_QRCODE 支付宝内嵌二维码支付 ALI_WAP 支付宝移动网页支付 UN_WEB 银联网页支付 JD_WEB 京东网页支付 JD_WAP 京东移动网页支付 YEE_WEB 易宝网页支付 YEE_WAP 易宝移动网页支付 YEE_NOBANKCARD 易宝点卡支付 KUAIQIAN_WEB 快钱网页支付 KUAIQIAN_WAP 快钱移动网页支付 BD_WEB 百度网页支付 BD_WAP 百度移动网页支付(必填) |
totalFee | 订单总金额, 只能为整数,单位为分,例如 1,(必填) |
billNo | 商户订单号, 8到32个字符内,数字和/或字母组合,确保在商户系统中唯一, 例如(201506101035040000001),(必填) |
title | 订单标题, 32个字节内,最长支持16个汉字,(必填) |
optional | 附加数据, 用户自定义的参数,将会在webhook通知中原样返回,该字段主要用于商户携带订单的自定义数据,(选填) |
returnUrl | 同步返回页面 , 支付渠道处理完请求后,当前页面自动跳转到商户网站里指定页面的http路径。支付渠道处理完请求后,当前页面自动跳转到商户网站里指定页面的http路径,必须为http://或者https://开头。当 channel 参数为 ALI_WEB 或 ALI_QRCODE 或 UN_WEB 或 JD_WEB 或 JD_WAP时为必填,(选填) |
openId | 微信公众号支付(WX_JSAPI)必填,(选填) |
showUrl | 商品展示地址,当channel为ALI_WEB时选填,需以http://开头的完整路径,例如:http://www.商户网址.com/myorder,(选填) |
qrPayMode | 二维码类型,ALI_QRCODE的必填参数,二维码类型含义 MODE_BRIEF_FRONT: 订单码-简约前置模式, 对应 iframe 宽度不能小于 600px, 高度不能小于 300px MODE_FRONT: 订单码-前置模式, 对应 iframe 宽度不能小于 300px, 高度不能小于 600px MODE_MINI_FRONT: 订单码-迷你前置模式, 对应 iframe 宽度不能小于 75px, 高度不能小于 75px ,(选填) |
billTimeoutValue | 订单失效时间,单位秒,非零正整数,建议最短失效时间间隔必须大于360秒,快钱不支持此参数。例如:360(选填) |
cardNo | 点卡卡号,每种卡的要求不一样,例如易宝支持的QQ币卡号是9位的,江苏省内部的QQ币卡号是15位,易宝不支付,当channel 参数为YEE_NOBANKCARD时必填,(选填) |
cardPwd | 点卡密码,简称卡密当channel 参数为YEE_NOBANKCARD时必填,(选填) |
frqid | 点卡类型编码: 骏网一卡通(JUNNET) 盛大卡(SNDACARD) 神州行(SZX) 征途卡(ZHENGTU) Q币卡(QQCARD) 联通卡(UNICOM) 久游卡(JIUYOU) 易充卡(YICHONGCARD) 网易卡(NETEASE) 完美卡(WANMEI) 搜狐卡(SOHU) 电信卡(TELECOM) 纵游一卡通(ZONGYOU) 天下一卡通(TIANXIA) 天宏一卡通(TIANHONG) 32 一卡通(THIRTYTWOCARD) 当channel 参数为YEE_NOBANKCARD时必填,(选填) |
objectId | 支付订单唯一标识, 下单成功后返回 |
codeUrl | 微信扫码code url, 微信扫码支付下单成功时返回 |
url | 支付跳转url,当渠道为ALI_WEB 或 ALI_QRCODE 或 ALI_WAP 或 YEE_WAP 或 YEE_WEB 或 BD_WEB 或 BD_WAP,并且下单成功时返回 |
html | 支付提交html, 当渠道为ALI_WEB 或 ALI_QRCODE 或 ALI_WAP 或 UN_WEB 或 JD_WAP 或 JD_WEB 或 KUAIQIAN_WAP 或 KUAIQIAN_WEB,并且下单成功时返回 |
wxJSAPIMap | 微信公众号支付要素,微信公众号支付下单成功时返回 |
key | 说明 |
---|---|
objectId | 支付订单唯一标识, 可通过查询获得 |
billNo | 商户订单号, 可通过查询获得 |
totalFee | 订单总金额, 可通过查询获得 |
title | 订单标题, 可通过查询获得 |
channel | 渠道类型, 可通过查询获得 |
channelTradeNo | 渠道交易号, 支付完成之后可通过查询获得 |
result | 是否支付, 可通过查询获得 |
refundResult | 是否退款, 可通过查询获得 |
revertResult | 订单是否撤销, 可通过查询获得 |
messageDetail | 渠道详细信息,默认为"不显示", 当needDetail为true时,并于支付完成之后可通过查询获得 |
dateTime | 订单创建时间,yyyy-MM-dd HH:mm:ss格式,可通过查询获得 |
optionalString | optional json字符串, 可通过查询获得 |
单笔打款接口接收TransferParameter参数对象,该对象封装了发起单笔打款所需的各个具体参数。
成功发起单笔打款将会返回单笔打款跳转url或者空字符串。
发起单笔打款异常情况将抛出BCException, 开发者需要捕获此异常进行相应失败操作 开发者可根据异常消息判断异常的具体信息,异常信息的格式为"resultCode:xxx;resultMsg:xxx;errDetail:xxx"。
返回跳转打款url,开发者跳转至url完成打款。
TransferParameter param = new TransferParameter();
param.setChannel(TRANSFER_CHANNEL.ALI_TRANSFER);
param.setChannelUserId(aliUserId);
param.setChannelUserName(aliUserName);
param.setTotalFee(1);
param.setDescription("支付宝单笔打款!");
param.setAccountName("苏州比可网络科技有限公司");
param.setTransferNo(aliTransferNo);
try {
String url = BCPay.startTransfer(param);
response.sendRedirect(url);
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回空字符串,完成打款。
TransferParameter param = new TransferParameter();
param.setChannel(TRANSFER_CHANNEL.WX_REDPACK);
param.setChannelUserId(openId);
param.setTransferNo(redpackTransferNo);
param.setTotalFee(200);
RedpackInfo redpackInfo = new RedpackInfo();
redpackInfo.setActivityName(activityName);
redpackInfo.setSendName(sendName);
redpackInfo.setWishing(wishing);
param.setRedpackInfo(redpackInfo);
param.setDescription("发红包");
try {
String result = BCPay.startTransfer(param);
out.println("微信红包发送成功!");
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
返回空字符串,完成打款。
TransferParameter param = new TransferParameter();
param.setChannel(TRANSFER_CHANNEL.WX_TRANSFER);
param.setChannelUserId(openId);
param.setTransferNo(wxTransferNo);
param.setTotalFee(200);
param.setDescription("微信单笔打款!");
try {
String result = BCPay.startTransfer(param);
out.println("微信单笔打款成功!");
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
代码中的参数对象TransferParameter封装字段含义如下:
key | 说明 |
---|---|
channel | 渠道类型, 根据不同场景选择不同的支付方式,包含: ALI_TRANSFER 支付宝单笔打款 WX_REDPACK 微信红包 WX_TRANSFER 微信单笔打款,(必填) |
transferNo | 打款单号,支付宝为11-32位数字字母组合, 微信为10位数字,(必填) |
totalFee | 打款金额,此次打款的金额,单位分,正整数(微信红包1.00-200元,微信打款>=1元),(必填) |
description | 打款说明,此次打款的说明,(必填) |
channelUserId | 用户id,支付渠道方内收款人的标示, 微信为openid, 支付宝为支付宝账户,(必填) |
channelUserName | 用户名,支付渠道内收款人账户名,支付宝必填,(选填) |
redpackInfo | 红包信息,微信红包的详细描述,微信红包必填,(选填) |
accountName | 打款方账号名称,打款方账号名全称,支付宝必填,例如:苏州比可网络科技有限公司,(选填) |
红包信息对象redpackInfo封装字段含义如下:
key | 说明 |
---|---|
sendName | 红包发送者名称 32位,(必填) |
wishing | 红包祝福语 128 位,(必填) |
activityName | 红包活动名称 32位,(必填) |
批量打款接口接收TransfersParameter参数对象,该对象封装了发起批量打款所需的各个具体参数。
成功发起批量打款将会返回批量打款跳转url。
发起批量打款异常情况将抛出BCException, 开发者需要捕获此异常进行相应失败操作 开发者可根据异常消息判断异常的具体信息,异常信息的格式为"resultCode:xxx;resultMsg:xxx;errDetail:xxx"。
TransfersParameter para = new TransfersParameter();
para.setBatchNo(batchNo);
para.setAccountName(accountName);
para.setTransferDataList(list);
para.setChannel(PAY_CHANNEL.ALI);
List<ALITransferData> list = new ArrayList<ALITransferData>();
ALITransferData data1 = new ALITransferData("transfertest11223", "13584809743", "袁某某", 1, "赏赐");
ALITransferData data2 = new ALITransferData("transfertest11224", "13584809742", "张某某", 1, "赏赐");
list.add(data1);
list.add(data2);
try {
String url = BCPay.startTransfers(para);
response.sendRedirect(url);
} catch (BCException e) {
log.error(e.getMessage(), e);
out.println(e.getMessage());
}
代码中的TransfersParameter封装字段含义如下:
key | 说明 |
---|---|
channel | 渠道类型, 暂时只支持ALI,(必填) |
batchNo | 批量付款批号, 此次批量付款的唯一标示,11-32位数字字母组合,(必填) |
accountName | 付款方的支付宝账户名, 支付宝账户名称,例如:毛毛,(必填) |
transferDataList | 付款的详细数据 {ALITransferData} 的 List集合,(必填) |
付款详细数据对象ALITransferData封装字段含义如下:
key | 说明 |
---|---|
transferId | 付款流水号,32位以内数字字母,(必填) |
receiverAccount | 收款方账户,(必填) |
receiverName | 收款方账号姓名,(必填) |
transferFee | 打款金额,单位为分,(必填) |
transferNote | 打款备注,(必填) |
退款接口接收BCRefund参数对象,该对象封装了发起退款所需的各个具体参数。
成功发起退款接口将会返回带objectId的BCRefund对象。 退款接口分为直接退款和预退款功能,当BCRefund的needApproval属性设置为true时,开启预退款功能,当BCRefund的needApproval属性为空或者false, 开启直接退款功能,并在channel为ALI时返回带支付宝退款跳转url的BCRefund对象, 开发者跳转至url输入支付密码完成退款。
发起退款异常情况将抛出BCException, 开发者需要捕获此异常进行相应失败操作 开发者可根据异常消息判断异常的具体信息,异常信息的格式为"resultCode:xxx;resultMsg:xxx;errDetail:xxx"。
BCRefund refund = new BCRefund(billNo, refundNo, 1);
try {
BCRefund refund = BCPay.startBCRefund(refund);
if (refund.getAliRefundUrl() != null) {//直接退款(支付宝)
response.sendRedirect(refund.getAliRefundUrl());
} else {
if (refund.isNeedApproval() != null && refund.isNeedApproval()) {//预退款
out.println("预退款成功!");
out.println(refund.getObjectId());
} else {//直接退款
out.println("退款成功!WX、易宝、百度、快钱渠道还需要定期查询退款结果!");
out.println(refund.getObjectId());
}
}
} catch (BCException e) {
out.println(e.getMessage());
e.printStackTrace();
}
代码中的参数对象BCRefund封装字段含义如下: 请求参数及返回字段:
key | 说明 |
---|---|
channel | 渠道类型, 根据不同场景选择不同的支付方式,包含: WX 微信 ALI 支付宝 UN 银联 JD 京东 KUAIQIAN 快钱 YEE 易宝 BD 百度,(选填,可为NULL) |
refundNo | 商户退款单号 , 格式为:退款日期(8位) + 流水号(3~24 位)。不可重复,且退款日期必须是当天日期。流水号可以接受数字或英文字符,建议使用数字,但不可接受“000”,例如:201506101035040000001 (必填) |
billNo | 商户订单号, 32个字符内,数字和/或字母组合,确保在商户系统中唯一,(必填) |
refundFee | 退款金额,只能为整数,单位为分,例如1,(必填) |
optional | 附加数据 用户自定义的参数,将会在webhook通知中原样返回,该字段主要用于商户携带订单的自定义数据,例如{"key1":"value1","key2":"value2",...}, (选填) |
needApproval | 标识该笔是预退款还是直接退款,true为预退款,false或者 null为直接退款,(选填) |
objectId | 退款记录唯一标识,发起退款成功后返回 |
aliRefundUrl | 阿里退款跳转url,支付宝发起直接退款成功后返回 |
key | 说明 |
---|---|
objectId | 退款记录唯一标识,可通过查询返回 |
billNo | 商户订单号,可通过查询返回 |
refundNo | 商户退款单号,可通过查询返回 |
totalFee | 订单总金额,可通过查询返回 |
refundFee | 退款金额,可通过查询返回 |
channel | 渠道类型,可通过查询返回 |
optionalString | 附加数据json字符串,可通过查询返回 |
title | 标题,可通过查询返回 |
finished | 退款是否结束,可通过查询返回 |
refunded | 退款是否成功,可通过查询返回 |
dateTime | 订单创建时间,yyyy-MM-dd HH:mm:ss格式,可通过查询获得 |
messageDetail | 渠道详细信息,默认为"不显示", 当needDetail为true时,可通过查询获得 |
预退款批量审核接口接收BCBatchRefund参数对象,该对象封装了发起预退款批量审核所需的各个具体参数。
成功发起预退款批量审核接口将会返回审核后的BCBatchRefund对象。
预退款批量审核接口分为批量同意和批量否决,当BCBatchRefund的agree属性设置为false时,开启批量否决,当BCBatchRefund的agree属性为true, 开启批量同意,返回的BCBatchRefund对象包含每笔预退款真正退款后的结果消息的idResult(Map<String, String)对象,并在channel为ALI时返回带支付宝退款跳转url的BCBatchRefund对象, 开发者跳转至url输入支付密码完成退款。
发起预退款批量审核异常情况将抛出BCException, 开发者需要捕获此异常进行相应失败操作 开发者可根据异常消息判断异常的具体信息,异常信息的格式为"resultCode:xxx;resultMsg:xxx;errDetail:xxx"。
BCBatchRefund batchRefundAgree = new BCBatchRefund();
batchRefundAgree.setIds(Arrays.asList(ids));
batchRefundAgree.setChannel(channel);
batchRefundAgree.setAgree(true);//批量同意
try {
BCBatchRefund result = BCPay.startBatchRefund(batchRefundAgree);
out.println("<div>");
for (String key : result.getIdResult().keySet()) {
String info = result.getIdResult().get(key);
out.println(key + ":" + info + "<br/>");
}
if (channel.equals(PAY_CHANNEL.ALI))
response.sendRedirect(result.getAliRefundUrl());
} catch(BCException ex) {
ex.printStackTrace();
out.println(ex.getMessage());
}
BCBatchRefund batchRefundDeny = new BCBatchRefund();
batchRefundDeny.setIds(Arrays.asList(ids));
batchRefundDeny.setChannel(channel);
batchRefundDeny.setAgree(false);//批量否决
try {
BCBatchRefund result = BCPay.startBatchRefund(batchRefundDeny);
out.println("<h3>批量驳回成功!</h3>");
} catch(BCException ex) {
ex.printStackTrace();
out.println(ex.getMessage());
}
代码中的参数对象BCBatchRefund封装字段含义如下: 请求参数及返回字段:
key | 说明 |
---|---|
ids | 退款记录id列表,批量审核的退款记录的唯一标识符集合,(必填) |
channel | 渠道类型, 根据不同场景选择不同的支付方式,包含: WX、ALI、UN、YEE、JD、KUAIQIAN、BD(必填) |
agree | 同意或者驳回,批量驳回传false,批量同意传true,(必填) |
idResult | 退款id、结果信息集合,Map类型,key为退款记录id,当退款成功时,value值为"OK";当退款失败时, value值为具体的错误信息 |
aliRefundUrl | 支付宝批量退款跳转url,支付宝预退款批量同意处理成功后返回 |
订单查询接收BCQueryParameter参数对象,该对象封装了发起订单查询所需的各个具体参数。
成功发起订单查询接口将会返回BCOrder对象的集合。
发起订单查询异常情况将抛出BCException, 开发者需要捕获此异常进行相应失败操作 开发者可根据异常消息判断异常的具体信息,异常信息的格式为"resultCode:xxx;resultMsg:xxx;errDetail:xxx"。
BCQueryParameter param = new BCQueryParameter();
param.setNeedDetail(true);//设置返回messgeDetail
param.setChannel(channel);//设置查询条件channel
try {
List<BCOrder> bcOrders = BCPay.startQueryBill(param);
System.out.println("billSize:" + bcOrders.size());
} catch (BCException e) {
out.println(e.getMessage());
}
代码中的参数对象BCQueryParameter封装字段含义如下:
key | 说明 |
---|---|
channel | 渠道类型, 根据不同场景选择不同的支付方式,包含: WX WX_APP 微信手机APP支付 WX_NATIVE 微信公众号二维码支付 WX_JSAPI 微信公众号支付 ALI ALI_APP 支付宝APP支付 ALI_WEB 支付宝网页支付 ALI_QRCODE ALI_WAP 支付宝移动网页支付 支付宝内嵌二维码支付 UN UN_APP 银联APP支付 UN_WEB 银联网页支付 KUAIQIAN KUAIQIAN_WEB 快钱网页支付 KUAIQIAN_WAP 快钱移动网页支付 YEE YEE_WEB 易宝网页支付 YEE_WAP 易宝移动网页支付 YEE_NOBANKCARD 易宝点卡支付 JD JD_WEB 京东网页支付 JD_WAP 京东移动网页支付 PAYPAL PAYPAL_SANDBOX PAYPAL_LIVE BD BD_WEB 百度网页支付 BD_APP 百度APP支付 BD_WAP 百度移动网页支付,(选填) |
billNo | 商户订单号,String类型,(选填) |
startTime | 起始时间, Date类型,(选填) |
endTime | 结束时间, Date类型, (选填) |
payResult | 支付成功与否标识,(选填) |
refundResult | 退款成功与否标识,(选填) |
needDetail | 是否需要返回渠道详细信息,不返回可减少网络开销,(选填) |
skip | 查询起始位置 默认为0。设置为10,表示忽略满足条件的前10条数据 , (选填) |
limit | 查询的条数, 默认为10,最大为50。设置为10,表示只查询满足条件的10条数据 |
返回的BCOrder集合包含字段参考国内支付部分的查询返回字段。
订单总数查接收BCQueryParameter参数对象,该对象封装了发起订单总数查所需的各个具体参数。
成功发起订单总数查询接口将会返回订单总数。
发起订单总数查询异常情况将抛出BCException, 开发者需要捕获此异常进行相应失败操作 开发者可根据异常消息判断异常的具体信息,异常信息的格式为"resultCode:xxx;resultMsg:xxx;errDetail:xxx"。
BCQueryParameter param = new BCQueryParameter();
try {
int count = BCPay.startQueryBillCount(param);
pageContext.setAttribute("count", count);
} catch (BCException e) {
out.println(e.getMessage());
}
代码中的参数对象BCQueryParameter可设置查询条件参考订单查询的参数含义部分,并排除skip, limit, needDetail三个参数。
单笔订单查询接收订单的唯一标识。
成功发起单笔订单查询接口将会返回BCOrder对象。
发起单笔订单查询异常情况将抛出BCException, 开发者需要捕获此异常进行相应失败操作 开发者可根据异常消息判断异常的具体信息,异常信息的格式为"resultCode:xxx;resultMsg:xxx;errDetail:xxx"。
try {
BCOrder result = BCPay.startQueryBillById(id);
pageContext.setAttribute("bill", result);
} catch (BCException e) {
out.println(e.getMessage());
}
返回的BCOrder对象包含字段参考国内支付部分的查询返回字段。
退款查询接收BCQueryParameter参数对象,该对象封装了发起退款查询所需的各个具体参数。
成功发起退款查询接口将会返回BCRefund对象的集合。
发起退款查询异常情况将抛出BCException, 开发者需要捕获此异常进行相应失败操作 开发者可根据异常消息判断异常的具体信息,异常信息的格式为"resultCode:xxx;resultMsg:xxx;errDetail:xxx"。
BCQueryParameter param = new BCQueryParameter();
param.setChannel(channel);
param.setNeedDetail(true);
try {
List<BCRefund> bcRefunds = BCPay.startQueryRefund(param);
pageContext.setAttribute("refundList", bcRefunds);
System.out.println("refundList:" + bcRefunds.size());
} catch (BCException e) {
e.printStackTrace();
out.println(e.getMessage());
}
代码中的参数对象BCQueryParameter封装字段含义如下:
key | 说明 |
---|---|
channel | 渠道类型, 根据不同场景选择不同的支付方式,包含: WX WX_APP 微信手机APP支付 WX_NATIVE 微信公众号二维码支付 WX_JSAPI 微信公众号支付 ALI ALI_APP 支付宝APP支付 ALI_WEB 支付宝网页支付 ALI_QRCODE ALI_WAP 支付宝移动网页支付 支付宝内嵌二维码支付 UN UN_APP 银联APP支付 UN_WEB 银联网页支付 KUAIQIAN KUAIQIAN_WEB 快钱网页支付 KUAIQIAN_WAP 快钱移动网页支付 YEE YEE_WEB 易宝网页支付 YEE_WAP 易宝移动网页支付 JD JD_WEB 京东网页支付 JD_WAP BD BD_WEB 百度网页支付 BD_APP 百度APP支付 BD_WAP 京东移动网页支付,(选填) |
billNo | 商户订单号, 32个字符内,数字和/或字母组合,确保在商户系统中唯一, (选填) |
refundNo | 商户退款单号, 格式为:退款日期(8位) + 流水号(3~24 位)。不可重复,且退款日期必须是当天日期。流水号可以接受数字或英文字符,建议使用数字,但不可接受“000” ,(选填) |
startTime | 起始时间, Date类型,(选填) |
endTime | 结束时间, Date类型, (选填) |
needDetail | 是否需要返回渠道详细信息,不返回可减少网络开销,(选填) |
needApproval | 是否是预退款,(选填) |
skip | 查询起始位置 默认为0。设置为10,表示忽略满足条件的前10条数据 , (选填) |
limit | 查询的条数, 默认为10,最大为50。设置为10,表示只查询满足条件的10条数据 |
返回的BCRefund集合包含字段参考退款部分的查询返回字段。
退款总数查询接收BCQueryParameter参数对象,该对象封装了发起退款总数查询所需的各个具体参数。
成功发起退款总数查询接口将会返回订单总数。
发起退款总数查询异常情况将抛出BCException, 开发者需要捕获此异常进行相应失败操作 开发者可根据异常消息判断异常的具体信息,异常信息的格式为"resultCode:xxx;resultMsg:xxx;errDetail:xxx"。
BCQueryParameter param = new BCQueryParameter();
try {
int count = BCPay.startQueryRefundCount(param);
pageContext.setAttribute("count", count);
} catch (BCException e) {
out.println(e.getMessage());
}
代码中的参数对象BCQueryParameter可设置查询条件参考退款查询的参数含义部分,并排除skip, limit, needDetail三个参数。
单笔退款查询接收订单的唯一标识。
成功发起单笔退款查询接口将会返回BCRefund对象。
发起单笔退款查询异常情况将抛出BCException, 开发者需要捕获此异常进行相应失败操作 开发者可根据异常消息判断异常的具体信息,异常信息的格式为"resultCode:xxx;resultMsg:xxx;errDetail:xxx"。
try {
BCRefund result = BCPay.startQueryRefundById(id);
pageContext.setAttribute("refund", result);
} catch (BCException e) {
out.println(e.getMessage());
}
返回的BCRefund包含字段参考退款部分的查询返回字段。
退款状态更新接收channel和refundNo参数,调用参数中,只有当channel是WX、YEE、KUAIQIAN或BD时,才需要并且必须调用退款状态更新接口,其他渠道的退款已经在退款接口中完成。
成功发起退款状态更新接口将会返回退款状态字符串(SUCCESS, PROCESSING, FAIL ...)。
发起退款状态更新异常情况将抛出BCException, 开发者需要捕获此异常进行相应失败操作 开发者可根据异常消息判断异常的具体信息,异常信息的格式为"resultCode:xxx;resultMsg:xxx;errDetail:xxx"。
try {
String result = BCPay.startRefundUpdate(channel, refund_no);
out.println(result);
} catch(BCException ex) {
out.println(ex.getMessage());
log.info(ex.getMessage());
}
代码中的各个参数含义如下:
key | 说明 |
---|---|
refundNo | 商户退款单号, 格式为:退款日期(8位) + 流水号(3~24 位)。不可重复,且退款日期必须是退款发起当日日期。流水号可以接受数字或英文字符,建议使用数字,但不可接受“000”。,(必填) |
channel | 渠道类型, 包含WX、YEE、KUAIQIAN和BD(必填) |
发起代付请求。BCTransferParameter对象包含了发起BC代付所需要的所有参数。 发起BC代付异常情况将抛出BCException, 开发者需要捕获此异常进行相应失败操作 开发者可根据异常消息判断异常的具体信息,异常信息的格式为"resultCode:xxx;resultMsg:xxx;errDetail:xxx"。
BCTransferParameter param = new BCTransferParameter();
param.setBillNo("1111111111");//设置订单号 8到32位数字和/或字母组合,请自行确保在商户系统中唯一,同一订单号不可重复提交,否则会造成订单重复
param.setTitle("subject");//设置标题 UTF8编码格式,32个字节内,最长支持16个汉字
param.setTotalFee(1);//设置下发订单总金额 必须是正整数,单位为分
param.setTradeSource("OUT_PC");//UTF8编码格式,目前只能填写OUT_PC
param.setBankCode("BOC");//设置银行缩写,BOC代表**银行
param.setBankAssociatedCode("111111");//设置银行联行行号,该值需要用户自己去查询
param.setBankFullName("**银行");//银行全称,不能缩写
param.setCardType("DE");//卡类型 DE代表借记卡,CR代表信用卡,其他值为非法
param.setAccountType("P");//账户类型 区分对公和对私 P代表私户,C代表公户,其他值为非法
param.setAccountNo("123456789");//收款方的银行卡号
param.setAccountName("beecloud");//收款方的姓名或者单位名
try {
BCPay.startBCTransfer(param);
}catch (Exception e) {
out.println(ex.getMessage());
log.info(ex.getMessage());
}
国内支付接口完全参考LIVE模式订单查询, 暂不支持WX_JSAPI 沙箱模式调起支付返回的支付要素(html、url、codeUrl)为BeeCloud提供的模拟支付要素
订单查询接口完全参考LIVE模式订单查询
订单总数查询接口完全参考LIVE模式订单总数查询
单笔订单查询接口完全参考LIVE模式单笔订单查询
其他接口暂不支持SANDBOX模式
项目文件夹demo为我们的样例项目,详细展示如何使用java sdk.
•关于支付宝的return_url
请参考demo中的 aliReturnUrl.jsp
•关于银联的return_url
请参考demo中的 unReturnUrl.jsp
•关于京东PC网页的return_url
请参考demo中的 jdWebReturnUrl.jsp
•关于京东移动网页的return_url
请参考demo中的 jdWapReturnUrl.jsp
•关于快钱的return_url
请参考demo中的 kqReturnUrl.jsp
•关于易宝PC网页的return_url
请参考demo中的 yeeWebReturnUrl.jsp
•关于易宝移动网页的return_url
请参考demo中的 yeeWapReturnUrl.jsp
•关于百度钱包的return_url
请参考demo中的 bdReturnUrl.jsp
•关于PAYPAL内支付的return_url
请参考demo中的 paypalReturnUrl.jsp
•关于weekhook的接收
请参考demo中的 webhook_receiver.jsp以及webhook_sandbox_receiver.jsp
文档请阅读 webhook
- 下载安装maven后,进入sdk文件夹,执行mvn test。
- 导入sdk至eclipse或者IDEA, 在src/test/java包下找到BCPayTest类,运行javaSDKTest()方法。
- 根据app_id找不到对应的APP/keyspace或者app_sign不正确,或者timestamp不是当前UTC,可能的原因:系统时间不准确 app_id和secret填写不正确,请以此排查如下:
1.appid和appSecret填写是否一致
2.校准系统时间 - 支付宝吊起支付返回调试错误,请回到请求来源地,重新发起请求。错误代码ILLEGAL_PARTNER,可能的原因:使用了测试账号[email protected]的支付宝支付参数。请使用自己申请的支付账号。
- SDK jar包导入项目时找不到依赖包或者报NoSuchMethodException异常等问题,可能的原因:相同jar包依赖不同导致的冲突,相同jar包版本不同导致的冲突,解决方法如下:
1.使用Maven配置依赖引入sdk, 删掉导致冲突的SDK的依赖包。 2.若不使用Maven配置依赖,分开导入无依赖的sdk包和sdk依赖的包(可从Release部分下载),删除导致冲突的sdk依赖包。
3.手动加入错误提示找不到的依赖包。
The MIT License (MIT).