-
Notifications
You must be signed in to change notification settings - Fork 0
home
这份开源代码是班布聚合平台对接的工具包 http://www.asbamboo.com/page/developer 。
需求: SDK使用 JAVA SE 1.8 开发
- 这个SDK处理了班布聚合平台对接的签名生成与认证。
- 实现了四个接口的对接:
- 以及notify通知的签名校验与序列化处理
你可以参考 https://github.com/asbamboo/java-sdk-demo 的实现来使用这个SDK。
只有在配置信息正确的情况下,才能使SDK实现班布聚合平台接口对接。
asbamboo.java.sdk.Configure 是这个SDK的配置信息类。你的程序运行时,首先需要初始化这个类中的成员变量。
API_URL: 接口请求的url, 默认请求平台的开发环境https://developer.asbamboo.com/api. 因此当你的程序需要正式发布时配置信息应该被修改为正式环境的url。 (重要) API_APP_KEY: 平台系统内创建的应用的app_key (重要,必须配置) API_SECRET: 与API_APP_KEY对应的app_secret (重要,必须配置) API_FORMAT: 响应内容格式,目前仅支持json。默认值json。 API_VERSION: API接口版本,目前仅支持v1.0,默认值v1.0。 HTTP_REQUEST_TIMEOUT: api接口请求超时的时长(单位是毫秒),默认值30000 PROJECT_LOG_PATH: SDK打印的日志信息,默认值为System.getProperty("user.dir").concat(File.separator).concat("var").concat(File.separator).concat("project.log"),如果将它设置为null,则不打印日志。
SDK为每个接口编写了对应的request类和response类,request类用于设置请求参数,response类用于解析响应值。
每个接口都有一个request请求类:
- 该类位于 package asbamboo.java.sdk.model
- 类名为接口名(api_name)去掉点,每个单词首字母大写+Request后缀。如接口trade.pay的类名为TradePayRequest。
- 设置请求参数的方法为前缀set+字段名(去掉下划线并且首字母用大写)。如trade.pay接口设置channel参数, tradePayRequest.setChannel("ALIPAY_QRCD");
- 接口的公共参数不需要设置,SDK会自动为request设置公共参数,并且自动生成签名Sign字段。
- 大部分接口在业务参数设置完成后调用request.post()方法请求接口,request.post()方法返回一个 response 。
- 当通过表单提交的方式请求接口,页面会发生跳转(如api_name=trade.pay,channel=ALIPAY_PC)。此时请求请求的方式有点特殊,需要使用request.submit()方法,submit方法请求后没有reponse响应,需要通过notify_url或者return_url接收notify消息,处理响应结果。
- 无论是request.post()还是request.submit()都需要使用try{...}catch(Exception e){...}处理
request.post()方法,返回一个reponse响应值解析类:
- 该类位于 package asbamboo.java.sdk.model
- 类名为接口名(api_name)去掉点,每个单词首字母大写+Response后缀。如接口trade.pay的类名为TradePayResponse。
- 接收到响应值进行逻辑处理时,首先需要看reponse.getIsSuccess()是否为true。如果等于false那么本次请求是没有成功的。
- 当response.getIsSuccess()方法得到false时,response.getMessage()方法可以得到错误消息。
- response.getHttpCode()方法,获取本次请求的响应http code。
- response.getHttpBody()方法,获取本次请求的响应值(未经过解析的)。
- response.getHttpHeaders()方法,获取本次请求的响应Http header消息,返回值类型 Map<String, List<String>>。
- response.getDecodedData()方法,获取本次请求的响应值(经过解析的后的 HashMap<String, Object>)。
- response.getDataCode()方法,获取本次请求的响应值中的code参数。
- 获取响应值中的某个字段的方法为前缀get+字段名(去掉下划线并且首字母用大写)。如trade.pay接口设置channel参数, tradePayRequest.getChannel(),该方法返回一个 String 类型的响应值。特别的,如果响应的http code不是200,那么调用get方法可能会发生异常。
SDK提供了为notify通知响应结果解析的类,notify通知是接口请求时通过参数notify_url或者return_url接收的响应结果。
- notify类位于package asbamboo.java.sdk.notify下
- 类名为接口名(api_name)去掉点,每个单词首字母大写+Notify后缀。如接口trade.pay的Notify类名为TradePayNotify。
- 获取响应值中的某个字段的方法为前缀get+字段名(去掉下划线并且首字母用大写)。如trade.pay接口设置channel参数, tradePayRequest.getChannel(),该方法返回一个 String 类型的响应值。
- 每个每个notify类都有一个checkSign()方法。你的程序逻辑必须事前判断notify.checkSign是否等于true,确定这是由 api.asbamboo.com 给你推送的消息。
比如你使用TradePayNotify的代码,应该像这样:
TradePayNotify notify = new TradePayNotify(request); if(notify.checkSign()){ // ... // notify.getIntradeNo(); //聚合系统内的订单号 // notify.getChannel(); //支付渠道 // ... }
asbamboo.java.sdk.Sign 类提供了三个签名生成的方法:
- Sign.generate(HashMap<String, Object> data) 用于接口请求时生成sign参数
- 参数data是 HashMap<String, Object>
- 方法的响应值是签名字符串 String 类型
- 方法会抛出异常Exception
- Sign.genrateByResponse(HashMap<String, Object> response) 用于校验接口响应值签名Sign
- 参数response,是接口响应值经过asbamboo.java.sdk.decode(接口响应值)以后得到的HashMap<String, Object>
- 方法的响应值是签名字符串 String 类型
- 方法会抛出异常Exception
- Sign.genrateByNotify(HttpServletRequest request) 用于校验Notify通知的签名Sign
HttpServletRequest request 是notify接收的的request
方法的响应值是签名字符串 String 类型
方法会抛出异常Exception
当 notify_url 是一个带有 query string 的 url, 时需要调用Sign.genrateByNotify(HttpServletRequest request, List<String> ex_parameters),将query string部分的key通过ex_parameters传入方法,表示该参数不参数签名。如https://your_notify?your_query_type=your_query_value,需要这样请求
List<String> ex_parameters = new ArrayList<String>(); ex_parameters.add("your_query_type"); Sign.genrateByNotify(request, ex_parameters);
- SDK 中包含的接口: