php實現(xiàn)話費充值的方法:1、開通話費充值接口;2、引入封裝好的代碼類;3、配置接口基本信息;4、提交話費充值訂單;5、將狀態(tài)信息推送給相應(yīng)的URL;6、根據(jù)手機及面額查詢是否支持充值;7、通過“if ($local_sign == $sign) {…}”方式進(jìn)行業(yè)務(wù)邏輯處理即可。
php入門到就業(yè)線上直播課:進(jìn)入學(xué)習(xí)
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調(diào)試工具:點擊使用
本教程操作環(huán)境:windows7系統(tǒng)、PHP8.1版、Dell G3電腦。
php怎么實現(xiàn)話費充值?
基于PHP的聚合話費充值接口示例
一、接口申請開通
本代碼是基于聚合數(shù)據(jù)的話費充值A(chǔ)PI實現(xiàn)的話費充值功能,使用前需要:
-
通過
https://www.juhe.cn/docs/api/id/85?s=cpphpcn
申請開通話費接口服務(wù)。 -
與聚合簽訂相關(guān)服務(wù)合同后,才能正式使用。前期您也可以申請開通測試環(huán)境,進(jìn)行對接測試。
-
詳細(xì)的接口說明,可參考聚合官方文檔。
二、接口使用
2.1、引入封裝好的代碼類
include "JuheHuaFei.class.php";
2.2、配置一些必須的參數(shù)
// 接口基本信息配置 $env = 1; // 接口環(huán)境類型,1:正式環(huán)境接口 2:測試環(huán)境接口 $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') { // 訂單提交成功,根據(jù)實際業(yè)務(wù)邏輯進(jìn)行處理 echo "訂單提交成功,訂單號:" . $submitOrderResult['result']['sporder_id']; print_r($submitOrderResult); } else { // 提交返回碼error_code非正常狀態(tài),依據(jù)官方文檔錯誤碼說明,進(jìn)行邏輯處理 // 比如:10014,系統(tǒng)異常 / 208516,重復(fù)的訂單號 等,需要進(jìn)行二次查詢/人工確認(rèn)處理,不要直接失敗處理,避免造成不必要的損失 print_r($submitOrderResult); } } else { // 可能網(wǎng)絡(luò)異常等問題,未獲得正確響應(yīng)結(jié)果,建議進(jìn)行二次查單/人工確認(rèn),不要直接失敗處理,避免造成不必要的損失 // 依據(jù)自己的業(yè)務(wù)邏輯進(jìn)行處理 echo "請求異常,請確認(rèn)"; }
請求結(jié)果:
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、訂單狀態(tài)查詢
除主動查詢訂單狀態(tài),你還可以向聚合提供狀態(tài)回調(diào)通知URL,訂單狀態(tài)有變化,聚合將會主動將狀態(tài)信息推送給相應(yīng)的URL。
// 話費訂單充值狀態(tài)查詢 $orderId = '111111111'; // 需要查詢的訂單號,即提交訂單時傳遞的orderId $orderStatusResult = $juheHuaFei->queryOrderStatus($orderId); if ($orderStatusResult) { // 打印返回結(jié)果 print_r($orderStatusResult); // 根據(jù)實際業(yè)務(wù)邏輯進(jìn)行處理 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') { //訂單受理失敗,可能是如運營商維護(hù)、賬戶余額不足等情況 echo "訂單受理失敗"; } } else { //查詢狀態(tài)失敗,可能訂單號不存在等情況 echo "查詢失敗:" . $orderStatusResult['reason'] . "(" . $orderStatusResult['error_code'] . ")"; } } else { // 可能網(wǎng)絡(luò)異常等問題,未獲得正確響應(yīng)結(jié)果,建議進(jìn)行二次查詢 // 依據(jù)自己的業(yè)務(wù)邏輯進(jìn)行處理 echo "請求異常,請確認(rèn)"; }
返回結(jié)果:
Array ( [reason] => 查詢成功 [result] => Array ( [uordercash] => 1.060 [sporder_id] => J2011251629516xxxxxxxxxx [game_state] => 9 ) [error_code] => 0 )
2.5、根據(jù)手機及面額查詢是否支持充值
主要通過號段進(jìn)行判斷是否支持充值,實際業(yè)務(wù)中可以不使用本小接口。
// 根據(jù)手機號碼及面額查詢是否支持充值 $mobile = '1342966xxxx'; // 手機號碼 $perValue = '10'; // 話費面值 $telCheckResult = $juheHuaFei->telCheck($mobile, $perValue); if ($telCheckResult) { if($telCheckResult['error_code'] == '0'){ //說明支持充值,可以繼續(xù)充值操作,以下可以根據(jù)實際需求修改 echo "OK"; }else{ //暫不支持充值,以下可以根據(jù)實際需求修改 echo "對不起,該面額暫不支持充值"; } } else { // 可能網(wǎng)絡(luò)異常等問題,未獲得正確響應(yīng)結(jié)果,建議進(jìn)行二次查詢 // 依據(jù)自己的業(yè)務(wù)邏輯進(jìn)行處理 echo "請求異常,請確認(rèn)"; }
2.6、根據(jù)手機和面額獲取商品信息
實際業(yè)務(wù)中可以不使用本小接口。
// 根據(jù)手機號碼和面額獲取商品信息 $mobile = '1342966xxxx'; // 手機號碼 $perValue = '10'; // 話費面值 $telQueryResult = $juheHuaFei->telQuery($mobile, $perValue); if ($telQueryResult) { if($telQueryResult['error_code'] == '0'){ // 查詢成功,可以根據(jù)實際邏輯修改 print_r($telQueryResult); }else{ // 查詢失敗,可以根據(jù)實際邏輯修改 print_r($telQueryResult); } } else { // 可能網(wǎng)絡(luò)異常等問題,未獲得正確響應(yīng)結(jié)果,建議進(jìn)行二次查詢 // 依據(jù)自己的業(yè)務(wù)邏輯進(jìn)行處理 echo "請求異常,請確認(rèn)"; }
返回結(jié)果:
Array ( [reason] => 查詢成功 [result] => Array ( [cardid] => 10880 [cardname] => 浙江移動話費10元 [inprice] => 10.2 [game_area] => 浙江杭州移動 ) [error_code] => 0 )
2.7、訂單狀態(tài)通知
推送URL地址:自行提供給聚合進(jìn)行配置 (為了更安全,你也可以將聚合推送服務(wù)器的IP進(jìn)行加白名單處理)
推送方式:POST
推送參數(shù):
PHP接收異步通知(回調(diào))參考代碼:
/** * 接受話費加油卡流量充值業(yè)務(wù) 異步通知參數(shù) 參考示例 */ $appkey = "b842820xxxxxxxxxxxxxxxxxx"; //您申請的數(shù)據(jù)的APIKey $sporder_id = addslashes($_POST['sporder_id']); //聚合訂單號 $orderid = addslashes($_POST['orderid']); //商戶的單號 $sta = addslashes($_POST['sta']); //充值狀態(tài) $sign = addslashes($_POST['sign']); //校驗值 $local_sign = md5($appkey.$sporder_id.$orderid); //本地sign校驗值 if ($local_sign == $sign) { if ($sta == '1') { //充值成功,根據(jù)自身業(yè)務(wù)邏輯進(jìn)行后續(xù)處理 } elseif ($sta =='9') { //充值失敗,根據(jù)自身業(yè)務(wù)邏輯進(jìn)行后續(xù)處理 } }
2.8、JuheHuaFei.class.php
JuheHuaFei.class.php 完整代碼
<?php //---------------------------------- // 聚合數(shù)據(jù)-手機話費充值A(chǔ)PI調(diào)用類--示例代碼 // 官方接口文檔:https://www.juhe.cn/docs/api/id/85 //---------------------------------- class JuheHuaFei { private $appkey; private $openid; // 提交訂單接口URL private $submitUrl; // 訂單狀態(tài)查詢接口URL private $orderStatusUrl; // 檢測手機號碼是否能充值URL private $telCheckUrl; // 根據(jù)手機號和面值查詢商品URL private $telQueryUrl; /** * JuheHuaFei constructor. * @param [string] $appkey [接口密鑰] * @param [string] $openid [賬號openid] * @param [int] [$env 接口環(huán)境類型 1:正式環(huán)境 2:測試環(huán)境] */ public function __construct($appkey, $openid, $env = 1) { $this->appkey = $appkey; // 申請到的話費接口請求key $this->openid = $openid; // OpenID在聚合個人中心查詢 if ($env == 1) { // 正式環(huán)境,接口地址 $this->submitUrl = 'http://op.juhe.cn/ofpay/mobile/onlineorder'; // 提交訂單接口URL $this->orderStatusUrl = 'http://op.juhe.cn/ofpay/mobile/ordersta'; // 訂單狀態(tài)查詢接口URL $this->telCheckUrl = 'http://op.juhe.cn/ofpay/mobile/telcheck'; // 檢測手機號碼是否能充值URL $this->telQueryUrl = 'http://op.juhe.cn/ofpay/mobile/telquery'; // 根據(jù)手機號和面值查詢商品URL } else { // 測試環(huán)境,接口地址 $this->submitUrl = 'http://test-v.juhe.cn/ofpay/mobile/onlineorder'; // 提交訂單接口URL $this->orderStatusUrl = 'http://test-v.juhe.cn/ofpay/mobile/ordersta'; // 訂單狀態(tài)查詢接口URL $this->telCheckUrl = 'http://test-v.juhe.cn/ofpay/mobile/telcheck'; // 檢測手機號碼是否能充值URL $this->telQueryUrl = 'http://test-v.juhe.cn/ofpay/mobile/telquery'; // 根據(jù)手機號和面值查詢商品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); } /** * 查詢訂單的充值狀態(tài) * @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); } /** * 根據(jù)手機號碼及面額查詢是否支持充值 * @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); } /** * 根據(jù)手機號碼和面額獲取商品信息 * @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內(nèi)容轉(zhuǎn)為數(shù)據(jù),并返回 * @param string $content [內(nèi)容] * @return array */ public function _returnArray($content) { return json_decode($content, true); } /** * 請求接口返回內(nèi)容 * @param string $url [請求的URL地址] * @param string $params [請求的參數(shù)] * @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; } }
推薦學(xué)習(xí):《PHP視頻教程》