思路

  1. 通过将SDK方法中返回的数据划分为正常返回数据以及错误返回的数据两部分,让调用者更简单的对接口调用错误进行处理。
  2. 将SDK调用第三方服务接口的流程划分为: 数据准备,http请求,结果处理三部分,以重用代码。

例子

以聚合数据手机话费充值SDK编写为例

手机话费充值API 官方文档

  1. # encoding=utf-8
  2. from urlparse import urljoin
  3. from hashlib import md5
  4. from datetime import datetime
  5. from random import sample
  6. import requests
  7. import pytz
  8.  
  9. class APIError(object):
  10. def __init__(self, code, msg):
  11. self.code = code
  12. self.message = msg
  13.  
  14. class JuhePhoneChargeApi(object):
  15.  
  16. API_PREFIX = 'https://op.juhe.cn/ofpay/mobile/'
  17. def __init__(self, openid, key, api_entry=None):
  18. self._key = key
  19. self._openid = openid
  20. self._api_entry = api_entry or self.API_PREFIX
  21.  
  22. def telcheck(self, phoneno, cardnum):
  23. params = {'phoneno': phoneno, 'cardnum': cardnum}
  24. return self._get(path='telcheck', params=params)
  25.  
  26. def telquery(self, phoneno, cardnum):
  27. params = {
  28. 'phoneno': phoneno,
  29. 'cardnum': cardnum,
  30. }
  31. return self._get(path='telquery', params=params)
  32.  
  33. def onlineorder(self, phoneno, cardnum, orderid):
  34. params = {
  35. 'phoneno': phoneno,
  36. 'cardnum': cardnum,
  37. 'orderid': orderid or self.create_orderid(),
  38. }
  39. params.update({'sign': self._create_sign(**params)})
  40.  
  41. return self._get(path='onlineorder', params=params)
  42.  
  43. def ordersta(self, orderid):
  44. params = {'orderid': orderid}
  45. return self._get(path='orderid', params=params)
  46.  
  47. def create_orderid(self):
  48. return ''.join((
  49. datetime.now(tz=pytz.timezone('Asia/Shanghai')).strftime('%Y%m%d%H%M%S%f'),
  50. self._create_code(12)))
  51.  
  52. def _process_response(self, rsp):
  53. """
  54. 对第三方接口返回数据做同一处理,
  55. :param rsp:
  56. :return: 接口正常返回值, 错误对象
  57. """
  58. if rsp.status_code != 200:
  59. return None, APIError(rsp.status_code, 'http error')
  60. try:
  61. content = rsp.json()
  62. except:
  63. return None, APIError(99999, 'invalid rsp')
  64. if 'error_code' in content and content['error_code'] != 0:
  65. return None, APIError(content['error_code'], content['reason'])
  66.  
  67. return content['result'], None
  68.  
  69. def _get(self, path, params=None):
  70. if not params:
  71. params = {}
  72.  
  73. headers = {'Content-type': 'application/json'}
  74. params.update({'key': self._key})
  75.  
  76. rsp = requests.get(urljoin(self._api_entry, path), params=params, headers=headers)
  77. return self._process_response(rsp)
  78.  
  79. def _create_sign(self, phoneno, cardnum, orderid=None):
  80. obj_str = ''.join((
  81. self._openid,
  82. self._key,
  83. phoneno,
  84. str(cardnum),
  85. orderid or self.create_orderid()))
  86.  
  87. m = md5()
  88. m.update(obj_str)
  89. return m.hexdigest()
  90.  
  91. def _create_code(self, number_len):
  92. ELEMENT = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
  93. return ''.join(sample(ELEMENT, number_len))

  

文/Ljian1992(简书作者)
原文链接:http://www.jianshu.com/p/08f783dea4d9
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

调用手机话费充值API的SDK编写思路的更多相关文章

  1. cordov vue项目中调用手机原生api

    cordova不仅可以把vue项目打包成app,还可以让vue借助cordova调用手机原生的api 比如拍照 比如图片上传 比如定位 比如扫描二维码 比如支付等等 Vue Cordova教程-Vue ...

  2. api测试用例(编写思路)

    在API的自动化测试维度中,测试维度分为两个维度,一个是单独的对API的验证,客户端发送一个请求后,服务端得到客户端的请求并且响应回复给客户端: 另外一个维度是基于业务场景的测试,基于业务场景的也就是 ...

  3. 调用手机在线API获取手机号码归属地信息

    手机在线(www.showji.com)始创于2001年,发展至今已拥有国内最准确.号段容量最大的手机号码归属地数据库系统, 目前号段容量将近33万条,每月保持两次以上规模数据更新,合作伙伴包括:百度 ...

  4. 【加精】手机话费充值API接口(PHP版)

    电商周年庆,公司搞了一个关注微信公众号送小额话费的活动,送1元.2元.5元.10元.20元.50元等不同面值的. 为了实现话费充值服务,找了多家开通了话费接口服务,接入后测试.先是做接口整合的平台,P ...

  5. Unity3d之音效播放和调用手机震动

    http://blog.csdn.net/sunshine_1984/article/details/12943979 今天研究了下Unity3d音效播放相关内容,整理下实现细节. 1,添加音效文件到 ...

  6. 手机话费充值和手机流量充值 API

    最近正好需要用到手机充值和流量充值接口,网上找到的,记录并分享下. 聚合数据上面有手机充值的接口,也有流量充值的接口:注册以后可以使用它的OpenId和AppKey. 手机话费充值的接口:https: ...

  7. 微信小程序开发(十三)安卓手机调用wx.getConnectedWifi API失败

    安卓手机调用wx.getConnectedWifi API失败,返回的错误码是12000.需要先startWifi 接口: wx.startWifi({ success(res) { console. ...

  8. App 组件化/模块化之路——使用SDK的思路进行模块化设计接口

    在不久之前分享一篇<App 组件化/模块化之路——如何封装网络请求框架>文章介绍了我在项目中封装网络请求框架的思路.开发一个 App 会涉及到很多网络请求 API ,例如登录注册接口.用户 ...

  9. CAS SSO对手机应用支持的一种思路

    原文地址: http://architecture3.riaos.com/?p=3095368 手机和桌面应用访问CAS,我们不能直接使用CAS提供的web api.不过CAS提供了一个插件,叫CAS ...

随机推荐

  1. C# Web Forms - Using jQuery FullCalendar

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> ...

  2. Java、Hibernate(JPA)注解大全

    1.@Entity(name=”EntityName”) 必须,name为可选,对应数据库中一的个表 2.@Table(name=””,catalog=””,schema=””) 可选,通常和@Ent ...

  3. ahjesus C# 4.0 Parallel 并行运算

    Parallel.For - for 循环的并行运算 Parallel.ForEach - foreach 循环的并行运算 Parallel.Invoke - 并行调用多个任务 Task - 任务,基 ...

  4. 小白初学ABP框架,着实累啊

    这几天在学习ABP相关的知识AutoMapper ,AngularJS,Less,DI(dependencyInjection),EntityFramework code first以及相关NuGet ...

  5. React入门--------JSX

    React学习网站 React官方英文网站:http://reactjs.cn/react/docs/top-level-api.html React官方中文网站:http://www.css88.c ...

  6. 【使用 DOM】使用事件

    1. 使用简单事件处理器 可以用几种不同的方式处理事件.最直接的方式是用事件属性创建一个简单事件处理器(simple event handler).元素为它们支持的每一种事件都定义了一个事件属性.举个 ...

  7. 存放事务码及其描述的TABLE是TSTC、TSTCT。

    存放事务码及其描述的TABLE是TSTC.TSTCT.

  8. andriod 获得drawable下所有图片

    package com.example.yanlei.my1; import android.app.AlertDialog; import android.content.Context; impo ...

  9. Java解析XML三种常用方法

    1.使用DOM方式解析: package com.wzh.dom; import java.util.Iterator; import javax.xml.parsers.DocumentBuilde ...

  10. iOS菜单滚动联动内容区域功能实现

    平时开发APP中关于此功能还是比较经常碰到,本实例借用三个开源的插件,并对其中一个进行修改调整实现出想要的效果:本文重点介绍修改的内容跟三个插件的运用,这三个插件还可以各自扩展到其它项目的运用: 效果 ...