本SDK是根据BeeCloud Rest API 开发的 Android SDK。可以作为调用BeeCloud Rest API的示例或者直接用于生产。
- 添加依赖
- 对于通过添加
model
的方式(适用于gradle
,推荐直接使用Android Studio
) 引入sdk model
,在project
的settings.gradle
中include ':sdk'
,并在需要支付的model
(比如本项目中的demo
)build.gradle
中添加依赖compile project(':sdk')
。
- 对于需要以
jar
方式引入的情况
添加第三方的支付类,在beecloud-android\sdk\libs
目录下
gson-2.2.4.jar
为必须引入的jar,
zxing-3.2.0.jar
为生成二维码必须引入的jar,
微信支付需要引入libammsdk.jar
,
支付宝需要引入alipaysdk.jar
、alipayutdid.jar
、alipaysecsdk.jar
,
银联需要引入UPPayAssistEx.jar
、UPPayPluginEx.jar
,
最后添加beecloud android sdk
:beecloud-android\sdk\beecloud.jar
2.对于银联支付需要将银联插件beecloud-android\demo\src\main\assets\UPPayPluginEx.apk
引入你的工程assets
目录下
具体使用请参考项目中的
demo
请参考demo
中的ShoppingCartActivity.java
- 在主activity的onCreate函数中初始化BeeCloud账户中的AppID和AppSecret,例如
BeeCloud.setAppIdAndSecret("c5d1cba1-5e3f-4ba0-941d-9b0a371fe719", "39a7a518-9ac8-4a9e-87bc-7885f33cf18c");
>2. 如果用到微信支付,在用到微信支付的Activity的onCreate函数里调用以下函数,第二个参数需要换成你自己的微信AppID,例如 ```java BCPay.initWechatPay(ShoppingCartActivity.this, "wxf1aa465362b4c8f1"); ```
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
对于微信支付,需要添加
<activity
android:name="cn.beecloud.BCWechatPaymentActivity"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity-alias
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:targetActivity="cn.beecloud.BCWechatPaymentActivity" />
对于支付宝,需要添加
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden" />
对于银联,需要添加
<activity
android:name="cn.beecloud.BCUnionPaymentActivity"
android:configChanges="orientation|keyboardHidden"
android:excludeFromRecents="true"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode="adjustResize" />
请查看doc
中的API
,支付类BCPay
,参照demo
中ShoppingCartActivity
原型:
通过BCPay
的实例,以reqWXPaymentAsync
方法发起微信支付请求。
通过BCPay
的实例,以reqAliPaymentAsync
方法发起支付宝支付请求。
通过BCPay
的实例,以reqUnionPaymentAsync
方法发起银联支付请求。
参数依次为
billTitle 商品描述, UTF8编码格式, 32个字节内
billTotalFee 支付金额,以分为单位,必须是正整数
billNum 商户自定义订单号
optional 为扩展参数,可以传入任意数量的key/value对来补充对业务逻辑
callback 支付完成后的回调入口
在回调函数中将BCResult
转化成BCPayResult
之后做后续处理
调用:(以微信为例)
//定义回调
BCCallback bcCallback = new BCCallback() {
@Override
public void done(final BCResult bcResult) {
//此处根据业务需要处理支付结果
final BCPayResult bcPayResult = (BCPayResult)bcResult;
ShoppingCartActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
//对于JRE6的用户请参考demo中使用if else判断
switch (bcPayResult.getResult()) {
case BCPayResult.RESULT_SUCCESS:
Toast.makeText(ShoppingCartActivity.this, "用户支付成功", Toast.LENGTH_LONG).show();
break;
case BCPayResult.RESULT_CANCEL:
Toast.makeText(ShoppingCartActivity.this, "用户取消支付", Toast.LENGTH_LONG).show();
break;
case BCPayResult.RESULT_FAIL:
Toast.makeText(ShoppingCartActivity.this, "支付失败, 原因: " + bcPayResult.getErrMsg()
+ ", " + bcPayResult.getDetailInfo(), Toast.LENGTH_LONG).show();
}
}
});
}
};
//调用支付接口
Map<String, String> mapOptional = new HashMap<>();
String optionalKey = "testkey1"; //对key暂时不支持中文
String optionalValue = "测试value值1";
mapOptional.put(optionalKey, optionalValue);
//订单标题, 订单金额(分), 订单号, 扩展参数(可以null), 支付完成后回调入口
BCPay.getInstance(ShoppingCartActivity.this).reqWXPaymentAsync("微信支付测试", 1, UUID.randomUUID().toString().replace("-", ""), mapOptional, bcCallback);
请查看doc
中的API
,支付类BCPay
,参照demo
中GenQRCodeActivity
原型:
通过BCPay
的实例,以reqWXQRCodeAsync
方法请求生成微信支付二维码。
通过BCPay
的实例,以reqAliQRCodeAsync
方法请求生成支付宝内嵌支付二维码。
公用参数依次为
billTitle 商品描述, UTF8编码格式, 32个字节内
billTotalFee 支付金额,以分为单位,必须是正整数
billNum 商户自定义订单号
optional 为扩展参数,可以传入任意数量的key/value对来补充对业务逻辑
callback 支付完成后的回调入口
请求生成微信支付二维码的特有参数
genQRCode 是否生成QRCode Bitmap
如果为false,请自行根据getQrCodeRawContent返回的URL,使用BCPay.generateBitmap方法生成支付二维码,你也可以使用自己熟悉的二维码生成工具
qrCodeWidth 如果生成二维码(genQRCode为true), QRCode的宽度(以px为单位), null则使用默认参数360px
请求生成支付宝内嵌支付二维码的特有参数
returnUrl 支付成功后的同步跳转页面, 必填
qrPayMode 支付宝内嵌二维码类型null则支付宝生成默认类型, 不建议
"0": 订单码-简约前置模式, 对应 iframe 宽度不能小于 600px, 高度不能小于 300px
"1": 订单码-前置模式, 对应 iframe 宽度不能小于 300px, 高度不能小于 600px
"3": 订单码-迷你前置模式, 对应 iframe 宽度不能小于 75px, 高度不能小于 75px
在回调函数中将BCResult
转化成BCQRCodeResult
之后做后续处理
调用:(以微信为例)
BCPay.getInstance(GenQRCodeActivity.this).reqWXQRCodeAsync("微信二维码支付测试", //商品描述
1, //订单金额
UUID.randomUUID().toString().replace("-", ""), //订单流水号
mapOptional, //扩展参数,可以null
true, //是否生成二维码的bitmap,
//如果为false,请自行根据getQrCodeRawContent返回的结果
//使用BCPay.generateBitmap方法生成支付二维码
//你也可以使用自己熟悉的二维码生成工具
300, //二维码的尺寸, 以px为单位, 如果为null则默认为360
new BCCallback() { //回调入口
@Override
public void done(BCResult bcResult) {
final BCQRCodeResult bcqrCodeResult = (BCQRCodeResult) bcResult;
//resultCode为0表示请求成功
if (bcqrCodeResult.getResultCode() == 0) {
wxQRBitmap = bcqrCodeResult.getQrCodeBitmap();
Log.w(Tag, "weixin qrcode url: " + bcqrCodeResult.getQrCodeRawContent());
} else {
GenQRCodeActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(GenQRCodeActivity.this, "err code:" + bcqrCodeResult.getResultCode() +
"; err msg: " + bcqrCodeResult.getResultMsg() +
"; err detail: " + bcqrCodeResult.getErrDetail(), Toast.LENGTH_LONG).show();
}
});
}
}
});
- 查询支付订单
请查看doc
中的API
,支付类BCQuery
,参照demo
中BillListActivity
原型:
通过构造BCQuery
的实例,使用queryBillsAsync
方法发起支付查询,该方法仅channel
为必填参数,指代何种支付方式;在回调函数中将BCResult
转化成BCQueryOrderResult
之后做后续处理
调用:
//回调入口
final BCCallback bcCallback = new BCCallback() {
@Override
public void done(BCResult bcResult) {
//根据需求处理结果数据
final BCQueryOrderResult bcQueryResult = (BCQueryOrderResult) bcResult;
//resultCode为0表示请求成功
//count包含返回的订单个数
if (bcQueryResult.getResultCode() == 0) {
//订单列表
bills = bcQueryResult.getOrders();
Log.i(BillListActivity.TAG, "bill count: " + bcQueryResult.getCount());
} else {
bills = null;
BillListActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
//错误信息
Toast.makeText(BillListActivity.this, "err code:" + bcQueryResult.getResultCode() +
"; err msg: " + bcQueryResult.getResultMsg() +
"; err detail: " + bcQueryResult.getErrDetail(), Toast.LENGTH_LONG).show();
}
});
}
}
};
//发起查询请求
BCQuery.getInstance().queryBillsAsync(
BCReqParams.BCChannelTypes.UN_APP, //渠道
null, //订单号
startTime.getTime(), //订单生成时间
endTime.getTime(), //订单完成时间
2, //忽略满足条件的前2条数据
15, //最低返回满足条件的15条数据
bcCallback);
- 查询退款订单
请查看doc
中的API
,支付类BCQuery
,参照demo
中RefundOrdersActivity
原型:
通过构造BCQuery
的实例,使用queryRefundsAsync
方法发起支付查询,该方法仅channel
为必填参数,指代何种支付方式;在回调函数中将BCResult
转化成BCQueryOrderResult
之后做后续处理
调用:
同上,首先初始化回调入口BCCallback
BCQuery.getInstance().queryRefundsAsync(
BCReqParams.BCChannelTypes.UN, //渠道
null, //订单号
null, //商户退款流水号
startTime.getTime(), //退款订单生成时间
endTime.getTime(), //退款订单完成时间
1, //忽略满足条件的前1条数据
15, //只返回满足条件的15条数据
bcCallback);
- 查询订单退款状态
请查看doc
中的API
,支付类BCQuery
,参照demo
中RefundStatusActivity
原型:
通过构造BCQuery
的实例,使用queryRefundStatusAsync
方法发起支付查询,该方法所有参数都必填,channel
指代何种支付方式,目前由于第三方API的限制仅支持微信;在回调函数中将BCResult
转化成BCQueryRefundStatusResult
之后做后续处理
调用:
同上,首先初始化回调入口BCCallback
BCQuery.getInstance().queryRefundStatusAsync(
BCReqParams.BCChannelTypes.WX_APP, //目前仅支持微信
"20150520refund001", //退款单号
bcCallback); //回调入口
考虑到个人的开发习惯,本项目提供了Android Studio
和Eclipse ADT
两种工程的demo
,为了使demo顺利运行,请注意以下细节
- 对于使用
Android Studio
的开发人员,下载源码后可以将demo_eclipse
移除,Import Project
的时候选择beecloud-android
,sdk
为demo
的依赖model
,gradle
会自动关联。- 对于使用
Eclipse ADT
的开发人员,Import Project
的时候选择beecloud-android
下的demo_eclipse
,该demo
下面已经添加所有需要的jar
。
TODO
- 微信支付返回
一般错误
,可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等,请按如下方法依次排查
- 项目包名与在微信申请的开发包名是否一致
- 订单流水号是否包含横杠
-
,如果有请去除- 请尝试清除微信缓存,或者删除微信重新安装再试
- 项目签名与微信平台设置的签名是否一致,请到微信官网下载签名工具校验
我们非常欢迎大家来贡献代码,我们会向贡献者致以最诚挚的敬意。
一般可以通过在Github上提交Pull Request来贡献代码。
Pull Request要求
-
代码规范
-
代码格式化
-
必须添加测试! - 如果没有测试(单元测试、集成测试都可以),那么提交的补丁是不会通过的。
-
记得更新文档 - 保证
README.md
以及其他相关文档及时更新,和代码的变更保持一致性。 -
创建feature分支 - 最好不要从你的master分支提交 pull request。
-
一个feature提交一个pull请求 - 如果你的代码变更了多个操作,那就提交多个pull请求吧。
-
清晰的commit历史 - 保证你的pull请求的每次commit操作都是有意义的。如果你开发中需要执行多次的即时commit操作,那么请把它们放到一起再提交pull请求。
The MIT License (MIT).