【加精】手机话费充值API接口(PHP版)
电商周年庆,公司搞了一个关注微信公众号送小额话费的活动,送1元、2元、5元、10元、20元、50元等不同面值的。
为了实现话费充值服务,找了多家开通了话费接口服务,接入后测试。先是做接口整合的平台,PASS,等于我们多接一层,问题不可控。最后找了增值电信的服务商 互亿无线合作,门槛低,有详细的API开发文档可以参考,根据示例很快就搞定了。
分享给大家,希望后续做类似的话费充值功能可以用得到:
接口地址
1.单号码充值话费
请求(POST 或者GET)
|
类型 |
参数名称 |
参数值描述 |
|
参数 |
action |
recharge |
|
参数 |
username |
用户名(签名) |
|
参数 |
mobile |
手机号码(签名) |
|
参数 |
package |
套餐数额(签名) |
|
参数 |
orderid |
订单ID(签名) |
|
参数 |
timestamp |
时间戳(签名) 允许 10 分钟 统一以东 8 时间 |
|
参数 |
sign |
签名 |
返回值(JSON格式)
|
命名 |
类型 |
描述 |
|
code |
int |
代码(1为提交成功) |
|
message |
string |
消息描述 |
|
taskid |
string |
任务id,提交失败则没有 |
2.帐号余额查询
请求(POST 或者GET)
|
类型 |
参数名称 |
参数值描述 |
|
参数 |
action |
getbalance |
|
参数 |
username |
用户名(签名) |
|
参数 |
timestamp |
时间戳(签名) 允许 10 分钟 统一以东 8 时间 |
|
参数 |
sign |
签名 |
返回值(JSON格式)
|
命名 |
类型 |
描述 |
|
code |
int |
代码 |
|
message |
string |
消息描述 |
|
balance |
float |
剩余余额 |
3.充值状态查询
请求(POST 或者GET)
|
类型 |
参数名称 |
参数值描述 |
|
参数 |
action |
getreports |
|
参数 |
username |
用户名(签名) |
|
参数 |
count |
一次取数量(签名) |
|
参数 |
timestamp |
时间戳(签名) 允许 10 分钟 统一以东 8 时间 |
|
参数 |
sign |
签名 |
返回值(JSON格式)
|
命名 |
类型 |
描述 |
|
code |
int |
代码(1为提交成功) |
|
message |
string |
消息描述 |
|
reports+ |
array |
报告 |
|
taskid |
string |
任务id |
|
mobile |
string |
手机号码 |
|
state |
int |
状态(0失败, 1成功) |
|
message |
string |
消息 |
注意:状态获取后服务器则会删除状态
4.充值状态推送
请求(POST方式推送到配置的网址)
|
类型 |
参数名称 |
参数值描述 |
|
参数 |
taskid |
充值任务ID |
|
参数 |
mobile |
手机号码(签名) |
|
参数 |
state |
状态(签名) 1:成功 2:失败 |
|
参数 |
message |
消息(签名) |
|
参数 |
sign |
签名 |
注意:充值状态查询和充值状态推送两种方式只能选择其中一种
5. 获取话费包档位
请求(POST 或者GET)
|
类型 |
参数名称 |
参数值描述 |
|
参数 |
action |
getpackages |
|
参数 |
username |
用户名(签名) |
|
参数 |
timestamp |
时间戳(签名) |
|
参数 |
sign |
签名 |
返回值(JSON格式)
|
命名 |
类型 |
描述 |
|
code |
int |
代码 |
|
message |
string |
消息描述 |
|
packages+ |
float |
套餐 |
|
type |
string |
类型(cncm:中国移动 cncu:中国联通 cnct:中国电信) |
|
name |
string |
话费包 |
|
number |
int |
数值(用于充值请求) |
|
state |
int |
状态(1启用,0未启用) |
|
price |
int |
单价 |
6.状态码
|
数值 |
描述 |
|
0 |
未知错误 |
|
1 |
提交成功 |
|
1000 |
无此操作类型(action为空或不存在) |
|
1001 |
用户名为空 |
|
1002 |
用户名错误 |
|
1003 |
手机号码为空 |
|
1004 |
手机号码为空 |
|
1005 |
套餐不能为空 |
|
1006 |
时间戳不能为空 |
|
1007 |
不存在的套餐 |
|
1008 |
签名不能为空 |
|
1009 |
签名错误 |
|
1010 |
签名过期 |
|
1011 |
账号被冻结 |
|
1012 |
余额不足 |
|
1013 |
访问ip与备案ip不相同 |
|
1014 |
订单ID不能为空 |
|
1015 |
订单ID已存在 |
|
2001 |
不支持的手机号码 |
|
2002 |
手机号码已加入黑名单 |
|
2003 |
不支持的地区 |
|
3001 |
扣费失败 |
|
4001 |
系统内部故障 |
7. 签名说明
需要把apikey(登录系统获取)放到要签名的键值对中,按照asc排序键值对参数名排序,拼接键值对字符串(参数名小写),再用32位md5加密
注意:用户名请使用小写
如:
sign=md5(aaaa=aaaa&bbbb=bbbb&cccc=cccc&dddd=dddd)
PHP充值签名代码如下:
$sign = md5(sprintf(“apikey=%s&mobile=%s&orderid=%s&package=%s×tamp=%s&username=%s”,
$apikey,
$mobile,
$orderid,
$package,
date("YmdHis"),
$username));
GET方式地址如:
8.PHP充值代码DEMO
$basicUrl
=
"http://f.ihuyi.com/phone?action=recharge&%s";
$username =
'testname';
$apikey =
'testapikey';
$mobile =
'18801850000';
$package =
1;
$orderId =
'TEST_'.date("YmdHis").mt_rand(100, 1000);
$dataGet = array();
$dataGet['package'] =
$package;
$dataGet['username'] =
$username;
$dataGet['timestamp'] =
date("YmdHis");
$dataGet['mobile'] =
$mobile;
$dataGet['orderid'] =
$orderId;
$dataGet['sign'] =
md5(sprintf(“apikey=%s&mobile=%s&orderid=%s&package=%s×tamp=%s&username=%s”,
$apikey,
$mobile,
$orderid,
$package,
date("YmdHis"),
$username));
$dataReturn = array();
foreach ($dataGet as $key => $row) {
$dataReturn[] = sprintf("%s=%s", $key, $row);
}
$urlGet = sprintf($basicUrl,
implode("&", $dataReturn));
$ch
= \curl_init();
curl_setopt($ch, CURLOPT_URL, $urlGet);
//定义表单提交地址
curl_setopt($ch, CURLOPT_RETURNTRANSFER,
1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
//60秒
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_REFERER,
'http://' . $_SERVER['HTTP_HOST']);
curl_setopt($ch, CURLOPT_POST, 0);
$data = curl_exec($ch);
curl_close($ch);
$res = explode("\r\n\r\n", $data);
$dataRet = $res[1];
if ($dataRet['code'] == 1) {
//提交成功
$apiTaskid = $dataRet['taskid'];
} else {
//提交错误处理
//.....
}
【加精】手机话费充值API接口(PHP版)的更多相关文章
- 调用手机话费充值API的SDK编写思路
思路 通过将SDK方法中返回的数据划分为正常返回数据以及错误返回的数据两部分,让调用者更简单的对接口调用错误进行处理. 将SDK调用第三方服务接口的流程划分为: 数据准备,http请求,结果处理三部分 ...
- 必应API接口nodejs版
近期,在研究百度.必应.API等的url提交API时,发现有用Go语言做工具的大佬的分享 利用 API 自动向搜索引擎提交网址(Go语言版) - pyList. 其中提到bing API提交方法,并给 ...
- 手机话费充值和手机流量充值 API
最近正好需要用到手机充值和流量充值接口,网上找到的,记录并分享下. 聚合数据上面有手机充值的接口,也有流量充值的接口:注册以后可以使用它的OpenId和AppKey. 手机话费充值的接口:https: ...
- Spring Boot入门系列(二十一)如何优雅的设计 Restful API 接口版本号,实现 API 版本控制!
前面介绍了Spring Boot 如何快速实现Restful api 接口,并以人员信息为例,设计了一套操作人员信息的接口.不清楚的可以看之前的文章:https://www.cnblogs.com/z ...
- Asp.Net支付宝手机网站支付接口API之C#版
一.准备工作 1.使用企业支付宝签约手机网站支付 2.下载支付宝官方demo 文档地址:https://doc.open.alipay.com/doc2/detail?treeId=60&ar ...
- 浅谈使用 PHP 进行手机 APP 开发(API 接口开发)
做过 API 的人应该了解,其实开发 API 比开发 WEB 更简洁,但可能逻辑更复杂,因为 API 其实就是数据输出,不用呈现页面,所以也就不存在 MVC(API 只有 M 和 C),那么我们来探讨 ...
- 示例浅谈PHP与手机APP开发,即API接口开发
示例浅谈PHP与手机APP开发,即API接口开发 API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞 ...
- 浅谈PHP与手机APP开发即API接口开发
API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞生很多专门API服务的公司,如:聚合数据(http ...
- hbase rest api接口链接管理【golang语言版】
# go-hbase-resthbase rest api接口链接管理[golang语言版]关于hbase的rest接口的详细信息可以到官网查看[http://hbase.apache.org/boo ...
随机推荐
- MRC迁移ARC之__block
今日帮着同事把老项目从MRC迁移至ARC,大部分工作无非是删除release,[super dealloc]等方法,只要关闭了MRC编译选项后,编译器能自动帮你检查,block就有一些不一样了,发现许 ...
- 复习(1)【Maven】
终于开始复习旧知识了,有输入必然要有输出.输入和输出之间的内化过程尤为重要,在复习的同时,真正把学到的东西积淀下来,加深理解. Maven项目概念与配置 Maven是一个项目管理和综合工具.Maven ...
- 4541: [Hnoi2016]矿区
学习了一下平面图剖分的姿势,orz cbh 每次只要随便选择一条边,然后不停尽量向左转就行 #include <bits/stdc++.h> #define N 1300000 #defi ...
- 大型App要搞的几个系统
路由模块: 解耦各个业务,统一收敛页面跳转,动态决策跳转实现: 鉴权模块:收敛鉴权项目(比如登录.输入密码.短信验证.扫脸),后台动态控制鉴权项目: 收银台:收敛支付,统一到收银台: 开关 ...
- python基础八
面向对象的好处 更容易扩展.提高代码使用效率,使你的代码组织性更强, 更清晰,更适合复杂项目的开发 封装 把功能的实现细节封装起来,只暴露调用接口 继承 多态 接口的继承 定义 类 ===> ...
- 《PHP中的Math函数》笔记
① abs() 绝对值; ② ceil() 向上取整; ③ floor() 向下取整; ④ fmod() 返回除法的浮点数余数; ⑤ getrandmax() 显示随机数最大的可能值; ⑥ is_fi ...
- sort()基础知识总结+超简短的英文名排序写法
结合前些天学的箭头函数我想到一种非常简短的sort排序写法:(这可能是最短的英文名排序方法了) 贴出来大家一起探讨一下: [4,1,2,32].sort((x,y)=>x>y); //[1 ...
- php阳历转农历的类 谷歌到的
<?phpclass Lunar { var $MIN_YEAR = 1891; var $MAX_YEAR = 2100; var $lunarInfo = array( ...
- React学习笔记-5-初始化阶段介绍
初始化阶段可以使用的函数:getDefaultProps:只调用一次,实例之间共享引用.只有在组件的第一个实例被初始化的时候,才会调用他,然后react会把这个函数的返回结果保存起来,从第二个实例开始 ...
- ES6扫盲
原文阅读请点击此处 一.let和const { // let声明的变量只在let命令所在的代码块内有效 let a = 1; var b = 2; } console.log(a); // 报错: R ...