本文以最基本的『计费能力2.0版』为例,利用开源的WoPlus.SDK为基础,简述接入WO+能力共享平台的开发过程。
一、准备工作(3分钟)
在进行技术接入之前,你需要先在http://open.wo.com.cn注册成为开发者,并创建应用。注册成为开发者的过程我就不说了,下面只谈创建应用的过程,以及如何获取几个技术接入需要的参数。
登录WO+能力平台,在『首页-开发者-我的APP-WEB服务端应用』,点击+号创建一个WEB应用。创建应用时,必须填写的字段如下图,其中应用名称将会出现在计费的短信中,并发送给用户,所以,请使用真实的应用名称。之后,别忘了选择API包,选择本例需要使用的『计费能力2.0版』。
如果在弹出的选择框中没找到这个能力,说明你还没有签约它,请在商城中找到这个能力并签约(签约该能力是免费的)。
之后,你能得到以下两个参数:AppKey(即App标识)和AppSecret(即App密钥)。
然后,你需要将应用提交审批,一旦通过,你就可以开始进入技术接入环节了。
二、开发环境
【必须】,本文讨论的接入均是以Java为例,所以,你应该具备Java的开发环境。
【必须】,WoPlus.SDK是基于Maven的项目,所以,你需要安装Maven环境。
【可选】,WoPlus.SDK是托管于OSChina的Git项目,所以,建议你安装Git环境。
访问 http://git.oschina.net/sharetop/,其中WoPlus.SDK.Java是一个使用HttpClient实现的开发包,而WoPlus.SDK.Spring则是用于Spring环境的开发包。你可以根据自己的项目选择合适的SDK。
本文以使用Spring的开发为例。获取WoPlus.SDK.Spring的源码后,使用Maven编译并install。
三、接入代码开发(5分钟)
现在进入正题,打开Eclipse,使用Maven创建一个基于Spring框架的WebApp。本例中创建的应用名称为:spring-web。
1)修改Maven的配置文件pom.xml,增加Spring的支持包(本文略,可参考SDK中的示例工程),并增加WoPlus.SDK.Spring的支持包。
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.4.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.4.3</version> </dependency> <dependency> <groupId>cn.chinaunicom.woplus.openapi.spring</groupId> <artifactId>open.spring</artifactId> <version>0.0.1</version> </dependency>
2)在Spring框架的applicationContext.xml中增加WoPlus.SDK的装配项。其中参数0为AppKey,而参数1为AppSecret。(以下这两个参数需根据你的应用实际修改)
<bean id=“woplusClient” class="cn.chinaunicom.woplus.openapi.spring.WoPlusClient"> <constructor-arg index="0" value="492edbd25e65c7fc6113544e86e9f0d87b9eaae9" /> <constructor-arg index=“1" value="53f7862c8951bb9f14f229daa8a3b88b06b947e1" /> </bean>
3)现在可以在代码中调用WO+的能力接口了。看看我们的示例代码,首先是Spring中的控制类DemoController,你需要使用自动装配的WoPlusClient,所有对WO+接口的访问都是通过这个类来实现的。
@Autowired WoPlusClient woplusClient; @RequestMapping( value=“/api/paymentcodesms", method=RequestMethod.GET, headers = {"Accept=application/json"}) public @ResponseBody WoPlusResponse paymentcodesms( HttpServletRequest request, @RequestParam("mobile")String mobile) {… …} @RequestMapping( value=“/api/apppayment", method=RequestMethod.GET, headers = {"Accept=application/json"}) public @ResponseBody WoPlusResponse apppayment( HttpServletRequest request, @RequestParam("mobile")String mobile, @RequestParam("vcode")String vcode) {… …}
『计费能力2.0版』是需要二次确认的,所以,我们构建两个URL请求,分别对应『获取验证码』和『确认扣费』两步。这个写法完全是Spring的标准代码,个中含义就不细说了。下面,才是见证奇迹的时刻。
先看第一个接口,获取验证码。根据API文档获取验证码需要的参数包括:待接收验证码的手机号(paymentUser),计费类型(paymentType)必须为0,订单号(outTradeNo),支付帐户类型(paymentAcount)必须为『001』,商品名称(subject)和扣费金额(totalFee)。其它可选项就不用填了。
务必注意各个参数的类型,数字或字符串。此外注意,这个接口不用签名。
@RequestMapping(/*见上段代码示例*/) public @ResponseBody WoPlusResponse paymentcodesms(/*见上段代码示例*/){ WoPlusResponse resp = new WoPlusResponse(); String api_url="https://open.wo.com.cn/openapi/rpc/paymentcodesms/v2.0"; HashMap<String,Object> params = new HashMap<String,Object>(); long num=new Random().nextLong(); params.put("paymentUser", mobile); params.put("paymentType", 0); params.put("outTradeNo",Long.toString(num)); params.put("paymentAcount", "001"); params.put("subject", "金币一堆"); params.put("totalFee", 0.01f); try { resp = woplusClient.post(api_url, params,false); if(resp.resultCode.equals("0")){ request.getSession().setAttribute("paymentcodesms_param", params); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return resp; }
代码很简单,api_url就是要访问的API接口地址,而params是一个HashMap,就是我们的参数集合。不管哪个接口,也不管参数如何变化,我们要做的事情就是设置正确的api_url并填写params中的各个参数。然后,用woplusClient中的post方法提交请求。
其中 resp = woplusClient.post(api_url,params,false)中的最后一个参数含义即是无须签名。并且,因为在确认支付时还需要这些参数,所以,我们一旦提交成功,将这些参数保存在session中,以备后用。
resp是一个WoPlusResponse实例,其中的resultCode封装了接口的响应码。我们可以根据这个响应码对接口调用结果进行处理。
接下来,我们再补充apppayment的函数体代码,这里要做的事情就是再构造相应的参数集合,并调用另一个计费接口『按次类支付接口』。
@RequestMapping(/*见上段代码示例*/) public @ResponseBody WoPlusResponse apppayment(/*见上段代码示例*/){ WoPlusResponse resp = new WoPlusResponse(); String api_url="https://open.wo.com.cn/openapi/rpc/apppayment/v2.0"; @SuppressWarnings("unchecked") HashMap<String,Object> params =(HashMap<String,Object>) (request.getSession().getAttribute("paymentcodesms_param")); if(!params.get("paymentUser").equals(mobile)) return resp; params.put("paymentcodesms",Long.decode(vcode).longValue()); params.put("timeStamp", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())); params.remove("paymentType"); try { resp = woplusClient.post(api_url, params); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return resp; }
代码与前一个函数类似,先从session中取出params参数集合,补充两个参数paymentcodesms和timeStamp,并移除paymentType参数。同样woplusClient的post方法,此时,需要签名,所以只有两个参数api_url和params(post方法缺省是带签名的)。
紧接着,我们再实现对DemoController的调用。我在示例中选择bootstrap作WEB样式,用jQuery作为前端脚本对Controller进行异步调用。
你完全可以选择其它技术方法来实现对DemoController的调用,因此,这方面我不细说了。基本的代码参考SDK包中的源码即可。
$(“#paymentcodesms").click(function(){ var mobileStr=$(“#mobile”).val(); $.ajax({ url:’api/paymentcodesms?mobile='+mobileStr, type:'get', contentType:”application/json;charset=utf-8", datatype:'json', success:function(data){ var str=JSON.stringify(data.content); $("#resultDesc").val(str); } }); }); $("#apppayment").click(function(){ var mobileStr=$("#mobile").val(); var vcode=$("#vcode").val(); $.ajax({ url:'api/apppayment?mobile='+mobileStr+"&vcode="+vcode, type:'get', contentType:"application/json;charset=utf-8", datatype:’json', success:function(data){ var str=JSON.stringify(data.content); $("#resultDesc").val(str); } });
到此,所有的代码开发即告完成。
四、调测(2分钟)
下面我们来看看执行效果,先启动WebApp应用,我们看到这样的页面:
输入你的手机号,点击『发送验证码』,你的手机会收到一个6位数字的验证码,在下面的框中填写验证码,点击『确认支付』,此时,你的手机会收到支付成功的通知短信,那么,恭喜你,你已成功接入WO+能力共享平台,并完成了一次话费小额支付操作。