• 技术文章 >后端开发 >PHP问题

    php怎么实现话费充值

    藏色散人藏色散人2022-10-21 17:15:19原创317

    php实现话费充值的方法:1、开通话费充值接口;2、引入封装好的代码类;3、配置接口基本信息;4、提交话费充值订单;5、将状态信息推送给相应的URL;6、根据手机及面额查询是否支持充值;7、通过“if ($local_sign == $sign) {...}”方式进行业务逻辑处理即可。

    php入门到就业线上直播课:进入学习

    本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。

    php怎么实现话费充值?

    基于PHP的聚合话费充值接口示例

    一、接口申请开通

    本代码是基于聚合数据的话费充值API实现的话费充值功能,使用前需要:

    二、接口使用

    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

    推送参数:

    f45eee5240571a92f5a4a8b366c7c6b.jpg

    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怎么实现话费充值的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:话费充值 php
    上一篇:php use类找不到怎么办 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• php多重接口怎么实现• PHP如何实现推送NBA赛事结果• php如何实现人脸对比• php怎么实现实名认证
    1/1

    PHP中文网