思路

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

例子

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

手机话费充值API 官方文档

# encoding=utf-8
from urlparse import urljoin
from hashlib import md5
from datetime import datetime
from random import sample
import requests
import pytz class APIError(object):
def __init__(self, code, msg):
self.code = code
self.message = msg class JuhePhoneChargeApi(object): API_PREFIX = 'https://op.juhe.cn/ofpay/mobile/'
def __init__(self, openid, key, api_entry=None):
self._key = key
self._openid = openid
self._api_entry = api_entry or self.API_PREFIX def telcheck(self, phoneno, cardnum):
params = {'phoneno': phoneno, 'cardnum': cardnum}
return self._get(path='telcheck', params=params) def telquery(self, phoneno, cardnum):
params = {
'phoneno': phoneno,
'cardnum': cardnum,
}
return self._get(path='telquery', params=params) def onlineorder(self, phoneno, cardnum, orderid):
params = {
'phoneno': phoneno,
'cardnum': cardnum,
'orderid': orderid or self.create_orderid(),
}
params.update({'sign': self._create_sign(**params)}) return self._get(path='onlineorder', params=params) def ordersta(self, orderid):
params = {'orderid': orderid}
return self._get(path='orderid', params=params) def create_orderid(self):
return ''.join((
datetime.now(tz=pytz.timezone('Asia/Shanghai')).strftime('%Y%m%d%H%M%S%f'),
self._create_code(12))) def _process_response(self, rsp):
"""
对第三方接口返回数据做同一处理,
:param rsp:
:return: 接口正常返回值, 错误对象
"""
if rsp.status_code != 200:
return None, APIError(rsp.status_code, 'http error')
try:
content = rsp.json()
except:
return None, APIError(99999, 'invalid rsp')
if 'error_code' in content and content['error_code'] != 0:
return None, APIError(content['error_code'], content['reason']) return content['result'], None def _get(self, path, params=None):
if not params:
params = {} headers = {'Content-type': 'application/json'}
params.update({'key': self._key}) rsp = requests.get(urljoin(self._api_entry, path), params=params, headers=headers)
return self._process_response(rsp) def _create_sign(self, phoneno, cardnum, orderid=None):
obj_str = ''.join((
self._openid,
self._key,
phoneno,
str(cardnum),
orderid or self.create_orderid())) m = md5()
m.update(obj_str)
return m.hexdigest() def _create_code(self, number_len):
ELEMENT = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
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. [水]用vb写了个PCB

    这学期我们学操作系统,所以得写个PCB. 于是我借鉴了一下windows的PCB,写了这个 Imports System.Runtime.InteropServices ''' <summary ...

  2. 泛函编程(23)-泛函数据类型-Monad

    简单来说:Monad就是泛函编程中最概括通用的数据模型(高阶数据类型).它不但涵盖了所有基础类型(primitive types)的泛函行为及操作,而且任何高阶类或者自定义类一旦具备Monad特性就可 ...

  3. 【poj 2185】Milking Grid(字符串--KMP+问题分解)

    题意:给定一个由字符组成的矩阵,求出它的面积最小的覆盖矩阵.(感觉应该是可重叠的......* (・ω・)っ) 解法:KMP.行列互不影响,可以问题分解.先求出每一行的最小重复串,利用kmp中的nex ...

  4. 基于java的socket编程

    #开头的废话#学习java已经半个月了,原本在抠教材里面的字眼时,觉得教材好厚,要看完不知道要到猴年马月去了.突然在网上看到一个教程,里面老师说学编程语言书不用太细看,看个大概,知道里面讲些什么就好, ...

  5. TeamCity配置笔记

    1.编译sln 2.发布网站 3.重复代码检测 4.代码分析 5.单元测试&覆盖率测试 查看代码覆盖率 7.代码签入时自动触发编译 8.通知 1.在teamcity安装目录中找到TrayNot ...

  6. 对getElementsByTagName("*")获取全部元素的总结

    var all=document.getElementsByTagName("*")      //获取整个页面的标签元素 alert(all.length);           ...

  7. JavaScript indexOf() 方法和 lastIndexOf() 方法

    一,定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索 ...

  8. 实验三同学评论http://home.cnblogs.com/u/MyDring/

    47赖燕菲http://www.cnblogs.com/lyfzero/ :该同学实验整体思路较清晰,希望把完整代码发布出来. 48李小娜http://www.cnblogs.com/dmbs/ :该 ...

  9. 如何查询拥有执行某个Tcode权限所有人员

    方法很简单,如下 一:Tcode:S_BCE_68001400二:输入你想查询的Tcode,例如:SE38   打开如下图所示,然后执行即可   三:AUTH(关于权限的控制),打开如下图所示.上图“ ...

  10. English Training Material - 04

    Inviting What kinds of social activities in your city could be appropriate ways of entertaining visi ...