本教程操作环境:windows7系统、php8.1版、dell g3电脑。
php怎么实现话费充值?
基于php的聚合话费充值接口示例
一、接口申请开通
本代码是基于聚合数据的话费充值api实现的话费充值功能,使用前需要:
通过https://www.juhe.cn/docs/api/id/85?s=cpphpcn申请开通话费接口服务。
与聚合签订相关服务合同后,才能正式使用。前期您也可以申请开通测试环境,进行对接测试。
详细的接口说明,可参考聚合官方文档。
二、接口使用
2.1、引入封装好的代码类
include "juhehuafei.class.php";
2.2、配置一些必须的参数
// 接口基本信息配置$env = 1; // 接口环境类型,1:正式环境接口 2:测试环境接口$appkey = 'b842820xxxxxxxxxxxxxxxxxx'; //从聚合申请的话费充值接口key$openid = 'jhb0d92d94ce6axxxxxxxxxxx'; //注册聚合账号就会分配的openid,在个人中心可以查看// 初始化$juhehuafei = new juhehuafei($appkey, $openid, $env);
2.3、提交话费充值订单
// 提交话费充值订单$orderid = '111111111'; //自己定义一个订单号,需要保证唯一$mobile = '189xxxxxxxx'; // 需要充值的手机号码$pervalue = '1'; // 话费面值,可以选择的面额1、2、5、10、20、30、50、100、300$submitorderresult = $juhehuafei->submitorder($mobile, $pervalue, $orderid);if ($submitorderresult) { if ($submitorderresult['error_code'] == '0') { // 订单提交成功,根据实际业务逻辑进行处理 echo "订单提交成功,订单号:" . $submitorderresult['result']['sporder_id']; print_r($submitorderresult); } else { // 提交返回码error_code非正常状态,依据官方文档错误码说明,进行逻辑处理 // 比如:10014,系统异常 / 208516,重复的订单号 等,需要进行二次查询/人工确认处理,不要直接失败处理,避免造成不必要的损失 print_r($submitorderresult); }} else { // 可能网络异常等问题,未获得正确响应结果,建议进行二次查单/人工确认,不要直接失败处理,避免造成不必要的损失 // 依据自己的业务逻辑进行处理 echo "请求异常,请确认";}
请求结果:
array( [reason] => 订单提交成功,等待充值 [result] => array ( [cardid] => 10423 [cardnum] => 1 [ordercash] => 1.06 [cardname] => 江苏电信话费1元 [sporder_id] => j201125162114667xxxxxxxx [uorderid] => 111111111 [game_userid] => 189xxxxxxxx [game_state] => 0 ) [error_code] => 0)
2.4、订单状态查询
除主动查询订单状态,你还可以向聚合提供状态回调通知url,订单状态有变化,聚合将会主动将状态信息推送给相应的url。
// 话费订单充值状态查询$orderid = '111111111'; // 需要查询的订单号,即提交订单时传递的orderid$orderstatusresult = $juhehuafei->queryorderstatus($orderid);if ($orderstatusresult) { // 打印返回结果 print_r($orderstatusresult); // 根据实际业务逻辑进行处理 if ($orderstatusresult['error_code'] == '0') { //查询成功 if ($orderstatusresult['result']['game_state'] == '1') { // 订单充值成功了 echo "订单充值成功"; } elseif ($orderstatusresult['result']['game_state'] == '9') { // 订单充值失败 echo "订单充值失败"; } elseif ($orderstatusresult['result']['game_state'] == '0') { // 订单充值中 echo "订单充值中"; } elseif ($orderstatusresult['result']['game_state'] == '-1') { //订单受理失败,可能是如运营商维护、账户余额不足等情况 echo "订单受理失败"; } } else { //查询状态失败,可能订单号不存在等情况 echo "查询失败:" . $orderstatusresult['reason'] . "(" . $orderstatusresult['error_code'] . ")"; }} else { // 可能网络异常等问题,未获得正确响应结果,建议进行二次查询 // 依据自己的业务逻辑进行处理 echo "请求异常,请确认";}
返回结果:
array( [reason] => 查询成功 [result] => array ( [uordercash] => 1.060 [sporder_id] => j2011251629516xxxxxxxxxx [game_state] => 9 ) [error_code] => 0)
2.5、根据手机及面额查询是否支持充值
主要通过号段进行判断是否支持充值,实际业务中可以不使用本小接口。
// 根据手机号码及面额查询是否支持充值$mobile = '1342966xxxx'; // 手机号码$pervalue = '10'; // 话费面值$telcheckresult = $juhehuafei->telcheck($mobile, $pervalue);if ($telcheckresult) { if($telcheckresult['error_code'] == '0'){ //说明支持充值,可以继续充值操作,以下可以根据实际需求修改 echo "ok"; }else{ //暂不支持充值,以下可以根据实际需求修改 echo "对不起,该面额暂不支持充值"; }} else { // 可能网络异常等问题,未获得正确响应结果,建议进行二次查询 // 依据自己的业务逻辑进行处理 echo "请求异常,请确认";}
2.6、根据手机和面额获取商品信息
实际业务中可以不使用本小接口。
// 根据手机号码和面额获取商品信息$mobile = '1342966xxxx'; // 手机号码$pervalue = '10'; // 话费面值$telqueryresult = $juhehuafei->telquery($mobile, $pervalue);if ($telqueryresult) { if($telqueryresult['error_code'] == '0'){ // 查询成功,可以根据实际逻辑修改 print_r($telqueryresult); }else{ // 查询失败,可以根据实际逻辑修改 print_r($telqueryresult); }} else { // 可能网络异常等问题,未获得正确响应结果,建议进行二次查询 // 依据自己的业务逻辑进行处理 echo "请求异常,请确认";}
返回结果:
array( [reason] => 查询成功 [result] => array ( [cardid] => 10880 [cardname] => 浙江移动话费10元 [inprice] => 10.2 [game_area] => 浙江杭州移动 ) [error_code] => 0)
2.7、订单状态通知
推送url地址:自行提供给聚合进行配置 (为了更安全,你也可以将聚合推送服务器的ip进行加白名单处理)
推送方式:post
推送参数:
php接收异步通知(回调)参考代码:
/** * 接受话费\加油卡\流量充值业务 异步通知参数 参考示例 */$appkey = "b842820xxxxxxxxxxxxxxxxxx"; //您申请的数据的apikey $sporder_id = addslashes($_post['sporder_id']); //聚合订单号$orderid = addslashes($_post['orderid']); //商户的单号$sta = addslashes($_post['sta']); //充值状态$sign = addslashes($_post['sign']); //校验值 $local_sign = md5($appkey.$sporder_id.$orderid); //本地sign校验值 if ($local_sign == $sign) { if ($sta == '1') { //充值成功,根据自身业务逻辑进行后续处理 } elseif ($sta =='9') { //充值失败,根据自身业务逻辑进行后续处理 }}
2.8、juhehuafei.class.php
juhehuafei.class.php 完整代码
<?php//----------------------------------// 聚合数据-手机话费充值api调用类--示例代码// 官方接口文档:https://www.juhe.cn/docs/api/id/85//----------------------------------class juhehuafei{ private $appkey; private $openid; // 提交订单接口url private $submiturl; // 订单状态查询接口url private $orderstatusurl; // 检测手机号码是否能充值url private $telcheckurl; // 根据手机号和面值查询商品url private $telqueryurl; /** * juhehuafei constructor. * @param [string] $appkey [接口密钥] * @param [string] $openid [账号openid] * @param [int] [$env 接口环境类型 1:正式环境 2:测试环境] */ public function __construct($appkey, $openid, $env = 1) { $this->appkey = $appkey; // 申请到的话费接口请求key $this->openid = $openid; // openid在聚合个人中心查询 if ($env == 1) { // 正式环境,接口地址 $this->submiturl = 'http://op.juhe.cn/ofpay/mobile/onlineorder'; // 提交订单接口url $this->orderstatusurl = 'http://op.juhe.cn/ofpay/mobile/ordersta'; // 订单状态查询接口url $this->telcheckurl = 'http://op.juhe.cn/ofpay/mobile/telcheck'; // 检测手机号码是否能充值url $this->telqueryurl = 'http://op.juhe.cn/ofpay/mobile/telquery'; // 根据手机号和面值查询商品url } else { // 测试环境,接口地址 $this->submiturl = 'http://test-v.juhe.cn/ofpay/mobile/onlineorder'; // 提交订单接口url $this->orderstatusurl = 'http://test-v.juhe.cn/ofpay/mobile/ordersta'; // 订单状态查询接口url $this->telcheckurl = 'http://test-v.juhe.cn/ofpay/mobile/telcheck'; // 检测手机号码是否能充值url $this->telqueryurl = 'http://test-v.juhe.cn/ofpay/mobile/telquery'; // 根据手机号和面值查询商品url } } /** * 提交话费充值订单 * @param [string] $mobile [手机号码] * @param [int] $pervalue [充值面额] * @param [string] $orderid [自定义单号] * @return [array] */ public function submitorder($mobile, $pervalue, $orderid) { $sign = md5($this->openid . $this->appkey . $mobile . $pervalue . $orderid);// 校验值计算 $params = array( 'key' => $this->appkey, 'phoneno' => $mobile, 'cardnum' => $pervalue, 'orderid' => $orderid, 'sign' => $sign ); $content = $this->juhehttprequest($this->submiturl, $params, 1); return $this->_returnarray($content); } /** * 查询订单的充值状态 * @param [string] $orderid [自定义单号] * @return [array] */ public function queryorderstatus($orderid) { $params = 'key=' . $this->appkey . '&orderid=' . $orderid; $content = $this->juhehttprequest($this->orderstatusurl, $params); return $this->_returnarray($content); } /** * 根据手机号码及面额查询是否支持充值 * @param string $mobile [手机号码] * @param int $pervalue [充值金额] * @return boolean */ public function telcheck($mobile, $pervalue) { $params = 'key=' . $this->appkey . '&phoneno=' . $mobile . '&cardnum=' . $pervalue; $content = $this->juhehttprequest($this->telcheckurl, $params); return $this->_returnarray($content); } /** * 根据手机号码和面额获取商品信息 * @param string $mobile [手机号码] * @param int $pervalue [充值金额] * @return array */ public function telquery($mobile, $pervalue) { $params = 'key=' . $this->appkey . '&phoneno=' . $mobile . '&cardnum=' . $pervalue; $content = $this->juhehttprequest($this->telqueryurl, $params); return $this->_returnarray($content); } /** * 将json内容转为数据,并返回 * @param string $content [内容] * @return array */ public function _returnarray($content) { return json_decode($content, true); } /** * 请求接口返回内容 * @param string $url [请求的url地址] * @param string $params [请求的参数] * @param int $ipost [是否采用post形式] * @return string */ public function juhehttprequest($url, $params = false, $ispost = 0) { $httpinfo = array(); $ch = curl_init(); curl_setopt($ch, curlopt_http_version, curl_http_version_1_1); curl_setopt($ch, curlopt_useragent, 'juhedata'); curl_setopt($ch, curlopt_connecttimeout, 5); curl_setopt($ch, curlopt_timeout, 30); curl_setopt($ch, curlopt_returntransfer, true); if ($ispost) { curl_setopt($ch, curlopt_post, true); curl_setopt($ch, curlopt_postfields, $params); curl_setopt($ch, curlopt_url, $url); } else { if ($params) { curl_setopt($ch, curlopt_url, $url . '?' . $params); } else { curl_setopt($ch, curlopt_url, $url); } } $response = curl_exec($ch); if ($response === false) { //echo "curl error: " . curl_error($ch); return false; } $httpcode = curl_getinfo($ch, curlinfo_http_code); $httpinfo = array_merge($httpinfo, curl_getinfo($ch)); curl_close($ch); return $response; }}
推荐学习:《php视频教程》
以上就是php怎么实现话费充值的详细内容。
