最近需要在公司网站上做个手机充值功能,联系了好几个提供手机充值服务接口的商家最后选择了欧飞数卡,写了个欧飞的手机直充接口,可以支持全国移动,联通和电信手机的直充花费,现在公布我的代码给大家参考,希望可以帮助到有同样需求的朋友,也希望大家帮我挑下问题.
参考文档:OFCARD系统http接口协议(V5.3)
手机直充接口代码如下:(请参考代码注释进行修改)
<?
php
/*
* 欧飞接口v4.0服务控制
* 参考:OFCARD系统http接口协议(V5.3)
* 版本 :0.1
* 作者:http://www.heui.org
* 日期:20110219
*/
class
ofcard_service {
var
$gateway
;
//
手机直充网关地址
var
$param
;
//
查询参数
/*
*
* 从配置文件及入口文件中初始化变量
* @param string $cardnum 话费面值
* @param string $order_id 订单号
* @param string $game_userid 手机号
* @param string $userid SP编码
* @param string $userpws SP接入密码
* @param string $version 欧飞接口版本(固定值为:4.0)
* @todo 配置文件数组化
*/
function
ofcard_service(
$cardnum
,
$order_id
,
$game_userid
,
$userid
,
$userpws
,
$version
) {
$this
->
gateway
=
'
http://esales1.ofcard.com:8088/onlineorder.do
'
;
$this
->
param
=
array
();
$this
->
param[
'
userid
'
]
=
$userid
;
$this
->
param[
'
userpws
'
]
=
md5
(
$userpws
);
//
$this->param['cardid'] = '140101';
$this
->
param[
'
cardid
'
]
=
$this
->
get_cardid(
$game_userid
);
$this
->
param[
'
cardnum
'
]
=
$cardnum
/
50
;
$this
->
param[
'
sporder_id
'
]
=
$order_id
;
$this
->
param[
'
sporder_time
'
]
=
date
(
'
YmdHis
'
);
$this
->
param[
'
game_userid
'
]
=
$game_userid
;
$keystr
=
'
OFCARD
'
;
$this
->
param[
'
md5_str
'
]
=
strtoupper
(
md5
(
$this
->
param[
'
userid
'
]
.
$this
->
param[
'
userpws
'
]
.
$this
->
param[
'
cardid
'
]
.
$this
->
param[
'
cardnum
'
]
.
$this
->
param[
'
sporder_id
'
]
.
$this
->
param[
'
sporder_time
'
]
.
$game_userid
.
$keystr
) );
$this
->
param[
'
version
'
]
=
$version
;
}
/*
*
* 进行充值,使用snoopy提交
* @param Snoopy $snoopy
* @param ezSQL_mysql $db
* @param string $order_id
* @return 充值结果
* @todo snoopy 集成
*/
function
recharge(
$snoopy
,
$db
,
$order_id
) {
$snoopy
->
submit(
$this
->
gateway
,
$this
->
param);
//
下面数据库操作属于商家逻辑
$sql
=
"
UPDATE `recharge` SET `is_recharge` =
"
.
$this
->
get_xml_value(
"
game_state
"
,
$snoopy
->
results)
.
"
, `ofcard_trade_id` = '
"
.
$this
->
get_xml_value(
"
orderid
"
,
$snoopy
->
results)
.
"
', `purchase_price` = '
"
.
$this
->
get_xml_value(
"
ordercash
"
,
$snoopy
->
results)
.
"
' WHERE `order_id` =
"
.
$order_id
;
$db
->
query(
$sql
);
return
$this
->
get_xml_value(
"
game_state
"
,
$snoopy
->
results);
}
/*
*
* xml数据简单解析
* @param string $name
* @param string $xml
* @return string $ret
*/
function
get_xml_value(
$name
,
$xml
)
{
$ret
=
''
;
preg_match
(
"
|<
"
.
$name
.
"
>(.*)</
"
.
$name
.
"
>|U
"
,
$xml
,
$ret
);
return
$ret
[
1
];
}
/*
*
*
* 获取充值状态
* http://202.102.53.141:83/api/query.do?userid=xxxxx&spbillid=spxxxxxx
* @param string $userid SP编码
* @param string $spbillid 商户系统订单号
* @return 充值状态
*/
function
get_is_recharge(
$userid
,
$spbillid
){
$status_url
=
"
http://202.102.53.141:83/api/query.do?userid=
"
.
$userid
.
"
&spbillid=
"
.
$spbillid
;
return
file_get_contents
(
$status_url
);
}
/*
*
*
* 获取账户余额
* @param string $userid
* @param string $userpws
* @param string $version
* @return 账户余额
*/
function
get_leftcredit(
$userid
,
$userpws
,
$version
)
{
$url
=
"
http://esales1.ofcard.com:8088/queryuserinfo.do?userid=
"
.
$userid
.
"
&userpws=
"
.
md5
(
$userpws
)
.
"
&version=
"
.
$version
;
return
self
::
get_xml_value(
"
ret_leftcredit
"
,
file_get_contents
(
$url
));
}
/*
*
* 是否可以充值(未进行余额判断)
* @param string $phoneno
* @param string $price
* @param string $userid
* @return bool 是否可以充值
*/
function
is_recharge(
$phoneno
,
$price
,
$userid
) {
$url
=
"
http://esales1.ofcard.com:8088/telcheck.do?phoneno=
"
.
$phoneno
.
"
&price=
"
.
$price
.
"
&userid=
"
.
$userid
;
$ret
=
split
(
'
#
'
,
file_get_contents
(
$url
));
return
(
1
==
$ret
[
0
]);
}
/*
*
*
* 所需提货商品的编码
* (现全国移动联通快充直充编码为且仅为140101,电信手机编码为且仅为18)
* @param string $phoneno 手机号码
* @todo 常量加入配置文件
*/
function
get_cardid(
$phoneno
) {
$num
=
substr
(
$phoneno
,
0
,
3
);
$ChinaMobile
=
array
(
134
,
135
,
147
,
147
,
136
,
137
,
138
,
139
,
150
,
151
,
152
,
182
,
157
,
158
,
159
,
187
,
188
);
$ChinaUnicom
=
array
(
130
,
131
,
132
,
155
,
156
,
145
,
185
,
186
);
$ChinaTelecom
=
array
(
133
,
153
,
180
,
189
);
if
(
in_array
(
$num
,
$ChinaMobile
)
||
in_array
(
$num
,
$ChinaUnicom
)) {
return
'
140101
'
;
}
if
(
in_array
(
$num
,
$ChinaTelecom
)) {
return
'
18
'
;
}
}
}
手机直充接口使用如下:
$ofcard
=
new
ofcard_service(
$original_price
,
$dingdan
,
$mobile
,
$userid
,
$userpws
,
$version
);
$ofcard
->
recharge(
$snoopy
,
$db
,
$dingdan
);
代码更新请留意:欧飞手机充值源代码