Skip to content

phoebus0501/beecloud-java

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

69 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

BeeCloud Java SDK (Open Source)

pass MIT v2.0.0

本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>2.0.0</version>
</dependency>

工程名以及版本号需要保持更新。(更新可参考本项目的pom.xml,文件最顶端)

注册

三个步骤,2分钟轻松搞定:

  1. 注册开发者:猛击这里注册成为BeeCloud开发者。

  2. 注册应用:使用注册的账号登陆控制台后,点击"+创建App"创建新应用

  3. 在代码中注册:

BeeCloud.registerApp(appid, appsecret);

使用方法

具体使用请参考本目录下的demo项目

调用以下接口发起支付并将得到BCPayResult对象,BCPayResult对象包含两种状态,正确状态和错误状态,正确状态的BCPayResult的type类型字符串为OK, 对应值为0。错误状态调用getErrMsg()方法返回错误信息。调用getErrDetail()方法返回具体错误信息,开发者可任意显示,打印,或者进行日志。

正确状态调用getCodeUrl()方法返回二维码字符串,返回code url的格式为:weixin://wxpay/bizpayurl?sr=XXXXX。 请商户调用第三方库将返回的code url生成二维码图片。 该模式链接较短,生成的二维码打印到结账小票上的识别率较高。

bcPayResult = BCPay.startBCPay(PAY_CHANNEL.WX_NATIVE, 1, billNo, "买水", null, null, null , null, null);
if (bcPayResult.getType().ordinal() == 0) {
	System.out.println(bcPayResult.getCodeUrl());
} else {
	//handle the error message as you wish!
	out.println(bcPayResult.getErrMsg());
	out.println(bcPayResult.getErrDetail());
}

正确状态调用getWxJSAPIMap()方法返回jsapi map对象。

bcPayResult = BCPay.startBCPay(PAY_CHANNEL.WX_JSAPI, 1, billNo, "买水", null, null, "openid000000001", null, null);
if (bcPayResult.getType().ordinal() == 0) {
	System.out.println(bcPayResult.getWxJSAPIMap());
} else {
	//handle the error message as you wish!
	out.println(bcPayResult.getErrMsg());
	out.println(bcPayResult.getErrDetail());
}

正确状态调用getHtml()方法,如将html输出至页面,即可开始银联网页支付。

bcPayResult = BCPay.startBCPay(PAY_CHANNEL.UN_WEB, 1, billNo, "买水", null, returnUrl, null, null, null);
if (bcPayResult.getType().ordinal() == 0) {
	out.println(bcPayResult.getHtml());
} else {
	//handle the error message as you wish!
	out.println(bcPayResult.getErrMsg());
	out.println(bcPayResult.getErrDetail());
}

正确状态调用getHtml()方法或者getUrl()方法,getHtml()方法返回html,如将html输出至页面,即可开始支付宝网页支付。getUrl()方法返回支付宝跳转url,推荐使用html。

bcPayResult = BCPay.startBCPay(PAY_CHANNEL.ALI_WEB, 1, billNo, "农夫山泉", null, "http://beecloud.cn", null, null, null);
if (bcPayResult.getType().ordinal() == 0) {
	out.println(bcPayResult.getHtml());
	out.println(bcPayResult.getUrl());
} else {
	//handle the error message as you wish!
	out.println(bcPayResult.getErrMsg());
	out.println(bcPayResult.getErrDetail());
}

正确状态调用getHtml()方法或者getUrl()方法,getHtml()方法返回html,如将html输出至页面,即可开始扫描支付。getUrl()方法返回支付宝内嵌二维码地址。需使用<iframe>加载此url

bcPayResult = BCPay.startBCPay(PAY_CHANNEL.ALI_QRCODE, 1, billNo, "农夫山泉", null, "http://beecloud.cn", null, null, null);
if (bcPayResult.getType().ordinal() == 0) {
    //使用html示例
	out.println(bcPayResult.getHtml());
	//使用url示例
	out.println("<html><iframe width='420' height='330' name='url' frameborder='0' src='" + bcPayResult.getUrl() + "'></iframe</html>");
} else {
	//handle the error message as you wish!
	out.println(bcPayResult.getErrMsg());
	out.println(bcPayResult.getErrDetail());
}

正确状态调用getHtml()方法或者getUrl()方法,getHtml()方法返回html,如将html输出至页面,即可开始支付。getUrl()方法返回支付宝跳转url,推荐使用html。

bcPayResult = BCPay.startBCPay(PAY_CHANNEL.ALI_WAP, 1, billNo, "买水", null, null, null, null, null);
if (bcPayResult.getType().ordinal() == 0) {
	out.println(bcPayResult.getHtml());
}
else {
	//handle the error message as you wish!
	out.println(bcPayResult.getErrMsg());
	out.println(bcPayResult.getErrDetail());
}

代码中的各个参数含义如下:

key 说明
channel 渠道类型, 根据不同场景选择不同的支付方式,包含:
WX_NATIVE 微信公众号二维码支付
WX_JSAPI 微信公众号支付
ALI_WEB 支付宝网页支付
ALI_QRCODE 支付宝内嵌二维码支付
ALI_WAP 支付宝移动网页支付 支付宝内嵌二维码支付
UN_WEB 银联网页支付, (必填)
totalFee 订单总金额, 只能为整数,单位为分,例如 1,(必填)
billNo 商户订单号, 32个字符内,数字和/或字母组合,确保在商户系统中唯一, 例如(201506101035040000001),(必填)
title 订单标题, 32个字节内,最长支持16个汉字,(必填)
optional 附加数据, 用户自定义的参数,将会在webhook通知中原样返回,该字段主要用于商户携带订单的自定义数据,(选填)
returnUrl 同步返回页面 , 支付渠道处理完请求后,当前页面自动跳转到商户网站里指定页面的http路径。当 channel 参数为 ALI_WEB 或 ALI_QRCODE 或 UN_WEB时为必填,(选填)
openId 微信公众号支付(WX_JSAPI)必填,(选填)
showUrl 商品展示地址,需以http://开头的完整路径,例如:http://www.商户网址.com/myorder,(选填)
qrPayMode 二维码类型,二维码类型含义MODE_BRIEF_FRONT: 订单码-简约前置模式, 对应 iframe 宽度不能小于 600px, 高度不能小于 300px
MODE_FRONT: 订单码-前置模式, 对应 iframe 宽度不能小于 300px, 高度不能小于 600px
MODE_MINI_FRONT: 订单码-迷你前置模式, 对应 iframe 宽度不能小于 75px, 高度不能小于 75px ,(选填)
return BCPayResult对象, 根据type决定返回内容

调用以下接口发起退款并将得到BCPayResult对象,BCPayResult对象包含两种状态,正确状态和错误状态,正确状态的BCPayResult的type类型字符串为OK, 对应值为0。错误状态调用getErrMsg()方法返回错误信息。调用getErrDetail()方法返回具体错误信息,开发者可任意显示,打印,或者进行日志。。

正确状态调用getSucessMsg()方法获知微信退款调用成功。

BCPayResult result = BCPay.startBCRefund(PAY_CHANNEL.WX, "201507170000", billNo, 2, null);;
if (bcPayResult.getType().ordinal() == 0) {
    //返回"退款成功!" 
	out.println(bcPayResult.getSucessMsg());
} else {
	//handle the error message as you wish!
	out.println(bcPayResult.getResult());
	out.println(bcPayResult.getErrDetail());
}

正确状态调用getUrl()方法返回url并跳转输入邮箱地址和密码完成退款。

BCPayResult result = BCPay.startBCRefund(PAY_CHANNEL.ALI, "201507170000", billNo, 1, null);;
if (bcPayResult.getType().ordinal() == 0) {
	response.redirect(bcPayResult.getUrl());
} else {
	//handle the error message as you wish!
	out.println(bcPayResult.getResult());
	out.println(bcPayResult.getErrDetail());
}

正确状态调用getSucessMsg()方法获知银联退款的返回结果。

BCPayResult result = BCPay.startBCRefund(PAY_CHANNEL.UN, "201507170000", billNo, 1, null);;
if (bcPayResult.getType().ordinal() == 0) {
	response.redirect(bcPayResult.getSucessMsg());
} else {
	//handle the error message as you wish!
	out.println(bcPayResult.getResult());
	out.println(bcPayResult.getErrDetail());
}

代码中的各个参数含义如下:

key 说明
channel 渠道类型, 根据不同场景选择不同的支付方式,包含:
WX 微信
ALI 支付宝
UN 银联,(必填)
refundNo 商户退款单号 , 格式为:退款日期(8位) + 流水号(3~24 位)。不可重复,且退款日期必须是当天日期。流水号可以接受数字或英文字符,建议使用数字,但不可接受“000”,例如:201506101035040000001 (必填)
billNo 商户订单号, 32个字符内,数字和/或字母组合,确保在商户系统中唯一,(必填)
refundFee 退款金额,只能为整数,单位为分,例如1,(必填)
optional 附加数据 用户自定义的参数,将会在webhook通知中原样返回,该字段主要用于商户携带订单的自定义数据,例如{"key1":"value1","key2":"value2",...}, (选填)
return BCPayResult, 根据type决定返回内容

调用以下接口发起订单查询并将得到BCQueryResult对象,BCQueryResult对象包含两种状态,正确状态和错误状态,正确状态的BCPayResult的type类型字符串为OK, 对应值为0。错误状态调用getErrMsg()方法返回错误信息。调用getErrDetail()方法返回具体错误信息,开发者可任意显示,打印,或者进行日志。调用参数中,channel参数包含以下取值: WX、WX_NATIVE、WX_JSAPI、ALI、ALI_APP、ALI_WEB、ALI_QRCODE、ALI_WAP、UN、UN_APP、UN_WEB。其中WX、ALI、UN是其他子渠道的父渠道,返回的是各种子渠道返回结果的并集。

正确状态调用bcQueryResult.getBcOrders()方法返回订单(BCOrderBean)的list集合。调用者可任意遍历,显示这个订单的list对象。

bcQueryResult = BCPay.startQueryBill(channel, null, null, null, null, null);
if (bcQueryResult.getType().ordinal() == 0) {
    //handle the order list as you wish.
	pageContext.setAttribute("bills", bcQueryResult.getBcOrders());
} else {
	out.println(bcQueryResult.getErrMsg());
	out.println(bcQueryResult.getErrDetail());
}

代码中的各个参数含义如下:

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 银联网页支付,(必填)
billNo 商户订单号,
startTime 起始时间, Date类型,(选填)
endTime 结束时间, Date类型, (选填)
skip 查询起始位置 默认为0。设置为10,表示忽略满足条件的前10条数据 , (选填)
limit 查询的条数, 默认为10,最大为50。设置为10,表示只查询满足条件的10条数据
return BCQueryResult, 根据type决定返回内容

调用以下接口发起退款查询并将得到BCQueryResult对象,BCQueryResult对象包含两种状态,正确状态和错误状态,正确状态的BCPayResult的type类型字符串为OK, 对应值为0。错误状态调用getErrMsg()方法返回错误信息。调用getErrDetail()方法返回具体错误信息,开发者可任意显示,打印,或者进行日志。调用参数中,channel参数包含以下取值: WX、WX_NATIVE、WX_JSAPI、ALI、ALI_APP、ALI_WEB、ALI_QRCODE、ALI_WAP、UN、UN_APP、UN_WEB。其中WX、ALI、UN是其他子渠道的父渠道,返回的是各种子渠道返回结果的并集。

正确状态调用bcQueryResult.getBcRefundList()方法返回退款记录(BCRefundBean)的list集合。调用者可任意遍历,显示这个退款记录的list对象。

bcQueryResult = BCPay.startQueryRefund(PAY_CHANNEL.UN, null, null, null, null, null, null);
if (bcQueryResult.getType().ordinal() == 0) {
	pageContext.setAttribute("refundList", bcQueryResult.getBcRefundList());
} else {
	out.println(bcQueryResult.getErrMsg());
	out.println(bcQueryResult.getErrDetail());
}

代码中的各个参数含义如下:

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 银联网页支付,(必填)
billNo 商户订单号, 32个字符内,数字和/或字母组合,确保在商户系统中唯一, (选填)
refundNo 商户退款单号, 格式为:退款日期(8位) + 流水号(3~24 位)。不可重复,且退款日期必须是当天日期。流水号可以接受数字或英文字符,建议使用数字,但不可接受“000” ,(选填)
startTime 起始时间, Date类型,(选填)
endTime 结束时间, Date类型, (选填)
skip 查询起始位置 默认为0。设置为10,表示忽略满足条件的前10条数据 , (选填)
limit 查询的条数, 默认为10,最大为50。设置为10,表示只查询满足条件的10条数据
return BCQueryResult, 根据type决定返回内容

调用以下接口发起微信退款状态查询并将得到BCQueryStatusResult对象,BCQueryStatusResult对象包含两种状态,正确状态和错误状态,正确状态的BCQueryStatusResult的type类型字符串为OK, 对应值为0。错误状态调用getErrMsg()方法返回错误信息。调用getErrDetail()方法返回具体错误信息,开发者可任意显示,打印,或者进行日志。调用参数中,channel参数包含以下取值: WX、WX_NATIVE、WX_JSAPI、ALI、ALI_APP、ALI_WEB、ALI_QRCODE、UN、UN_APP、UN_WEB。其中WX、ALI、UN是其他子渠道的父渠道,返回的是各种子渠道返回结果的并集。

正确状态调用getRefundStatus()方法返回微信退款状态(Success, Processing, Fail ...)。调用者可任意处理这个值。

BCQueryStatusResult result = BCPay.startWeChatRefundStatusQuery(refund_no);
if (result.getType().ordinal() == 0 ) {
	out.println(result.getRefundStatus());
} else {
	out.println(result.getErrMsg());
	out.println(result.getErrDetail());
}

代码中的各个参数含义如下:

key 说明
refundNo 商户退款单号, 格式为:退款日期(8位) + 流水号(3~24 位)。不可重复,且退款日期必须是退款发起当日日期。流水号可以接受数字或英文字符,建议使用数字,但不可接受“000”。,(必填)

Demo

项目文件夹demo为我们的样例项目,详细展示如何使用java sdk. •关于支付宝的return_url

请参考demo中的 return_url.jsp •关于银联的return_url

请参考demo中的 front_url.jsp •关于weekhook的接收

请参考demo中的 notify_url.jsp 文档请阅读 webhook

测试

TODO

常见问题

  • 网页在手机上如何使用微信支付?
    1.由于微信的限制,现在手机网页只能在微信APP内实现使用微信支付,即微信公众号支付(WX_JSAPI)
    2.WX_JSAPI支付配置相对复杂,请参考微信文档
    3.示例代码,调用js方法callpay()即可使用
function onBridgeReady(){
   WeixinJSBridge.invoke(
       'getBrandWCPayRequest', {
           //以下参数的值由BCPayByChannel方法返回来的数据填入即可
           "appId" : "wx2421b1c4370ec43b",          
           "timeStamp":" 1395712654",              
           "nonceStr" : "e61463f8efa94090b1f366cccfbbb444",
           "package" : "prepay_id=u802345jgfjsdfgsdg888",  
           "signType" : "MD5",     
           "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" 
       },
       function(res){     
           if(res.err_msg == "get_brand_wcpay_request:ok" ) {}     // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。 
       }
   ); 
}
function callpay()
{
    if (typeof WeixinJSBridge == "undefined"){
        if( document.addEventListener ){
            document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
        }else if (document.attachEvent){
            document.attachEvent('WeixinJSBridgeReady', jsApiCall); 
            document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
        }
    }else{
        jsApiCall();
    }
}

代码贡献

我们非常欢迎大家来贡献代码,我们会向贡献者致以最诚挚的敬意。

一般可以通过在Github上提交Pull Request来贡献代码。

Pull Request要求

•代码规范

•代码格式化

•必须添加测试! - 如果没有测试(单元测试、集成测试都可以),那么提交的补丁是不会通过的。

•记得更新文档 - 保证 README.md 以及其他相关文档及时更新,和代码的变更保持一致性。

•创建feature分支 - 最好不要从你的master分支提交 pull request。

•一个feature提交一个pull请求 - 如果你的代码变更了多个操作,那就提交多个pull请求吧。

•清晰的commit历史 - 保证你的pull请求的每次commit操作都是有意义的。如果你开发中需要执行多次的即时commit操作,那么请把它们放到一起再提交pull请求。

联系我们

•如果有什么问题,可以到 321545822 BeeCloud开发者大联盟QQ群提问

•更详细的文档,见源代码的注释以及官方文档

•如果发现了bug,欢迎提交issue

•如果有新的需求,欢x迎提交issue

代码许可

The MIT License (MIT).