PHP請(qǐng)求微信接口獲取用戶電話號(hào)功能示例
前言情景劇
業(yè)務(wù)場(chǎng)景是為了在用戶登錄的時(shí)候判斷其是否已經(jīng)成功注冊(cè),沒有成功注冊(cè)的話就將獲取到的openid和session_key加密后作為token傳給前端,然后讓前臺(tái)通過(guò)組件獲得code之后連著token一起傳給后端,后端拿著code再去請(qǐng)求微信接口獲取到用戶的電話號(hào)碼,以此完成注冊(cè)。
實(shí)現(xiàn)過(guò)程中的問(wèn)題
結(jié)合微信官方手冊(cè):phonenumber.getPhoneNumber | 微信開放文檔 (qq.com)
怪我沒好好看手冊(cè),中間發(fā)生了hin多的插曲。比如報(bào)錯(cuò)返回:
require POST method hint errcode: 43002
一查文檔告訴我:這個(gè)請(qǐng)求需要用post請(qǐng)求!可是,我明明是用的post請(qǐng)求啊~~~
后面通過(guò)面向百度編程,在找了5678個(gè)公共發(fā)起post請(qǐng)求的方法之后,終于有一個(gè)post請(qǐng)求沒問(wèn)題,但又遇到了一個(gè)問(wèn)題,他返回: [0,null]
這里的原因是比較讓我耗費(fèi)時(shí)間的:這個(gè)接口的請(qǐng)求,必須在用戶處于登錄的條件下,并且必須在互聯(lián)網(wǎng)能夠訪問(wèn)到的公共網(wǎng)站上(也就是得在我的項(xiàng)目配置好的域名下去請(qǐng)求,才能夠返回值!)我在本地試了好久,氣煞我也!
如果你后面寫好了對(duì)返回值的判斷的話會(huì)報(bào)錯(cuò):
Trying to access array offset on value of type null 。
就是告訴你不能嘗試將 null,bool,int,float 或 resource 類型的值用作數(shù)組 ( 例如 $null[“key”] ) 會(huì)產(chǎn)生一個(gè)通知。
遇到的這個(gè)問(wèn)題我是萬(wàn)萬(wàn)妹想到,搞了整整一下午,最后在公司大佬的幫助下半個(gè)小時(shí)幫我解決了問(wèn)題。ps:第一個(gè)參數(shù)access_token那是輕輕松松(有問(wèn)題可以看看和我的代碼哪里不同)
廢話不多say,上代碼!
common.php中
/** * 發(fā)送curl get * @param string $url * @return mixed */ function curl_get($url) { $oCurl = curl_init(); if (stripos($url, "https://") !== FALSE) { curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1 } if (defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')) { curl_setopt($oCurl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); } curl_setopt($oCurl, CURLOPT_URL, $url); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if (intval($aStatus["http_code"]) == 200) { return $sContent; } else { return false; } } if (!function_exists('http_post_json')){ //這一行是判斷公共方法有無(wú)這個(gè)方法,避免重名~ /** * PHP發(fā)送Json對(duì)象數(shù)據(jù) * @param $url string * @param $jsonStr string * @param string[] $headers * @return array */ function http_post_json(string $url, string $jsonStr, array $headers = array( 'Content-Type: application/json; charset=utf-8', )): array { $headers[] = 'Content-Length: ' . strlen($jsonStr); $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return array($httpCode, $response); } }
調(diào)用接口代碼:(有空可以自己封裝一下~)
/**必須先進(jìn)入登錄狀態(tài),然后拿到phone的code去請(qǐng)求然后拿到access_code,請(qǐng)求phone的接口 */ $appid = getConfig('appid_y'); //填寫自己的appid,小程序中看 $secret = getConfig('secret_y'); //填自己的secret,公眾平臺(tái)看 $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret"; $access_token = json_decode(curl_get($url),true); if(isset($access_token['errcode'])) return ['errcode'=>$access_token['errcode'],'msg'=>'請(qǐng)求失敗','data'=>$access_token]; $access_token = $access_token['access_token']; //獲取到了access_token //請(qǐng)求電話號(hào)使用方法只能在公網(wǎng)能訪問(wèn)的目錄下進(jìn)行,本地進(jìn)行沒有返回值 $url = 'https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token='.$access_token; $json_code = json_encode(['code'=>$param['code']]); $headers = [ 'Accept: application/json', 'User-Agent: */*', 'Content-Type: application/json; charset=utf-8', ]; $phone = http_post_json($url,$json_code,$headers); $phone[1] = json_decode($phone[1],true); if(empty($phone[1])||$phone[1]['errcode']!=0) throw new Exception('系統(tǒng)獲取手機(jī)號(hào)失敗'); $phoneNumber = $phone[1]['phone_info']['phoneNumber']; /**拿到電話號(hào)碼end */
另外,thinkphp5獲取微信授權(quán)用戶手機(jī)號(hào)的相關(guān)實(shí)現(xiàn)方法,可參考前面一篇:http://www.dbjr.com.cn/article/229956.htm
- 微信小程序開發(fā)之獲取用戶手機(jī)號(hào)碼(php接口解密)
- ThinkPHP框架實(shí)現(xiàn)的微信支付接口開發(fā)完整示例
- php獲取微信基礎(chǔ)接口憑證Access_token
- PHP封裝的微信公眾平臺(tái)接口開發(fā)操作類完整示例
- thinkPHP微信分享接口JSSDK用法實(shí)例
- 詳解使用php調(diào)用微信接口上傳永久素材
- PHP實(shí)現(xiàn)微信JS-SDK接口選擇相冊(cè)及拍照并上傳的方法
- php微信高級(jí)接口調(diào)用方法(自定義菜單接口、客服接口、二維碼)
- PHP配合微信小程序?qū)崿F(xiàn)獲取手機(jī)號(hào)碼詳解
- 微信小程序結(jié)合ThinkPHP5授權(quán)登陸后獲取手機(jī)號(hào)
相關(guān)文章
PHP簡(jiǎn)單實(shí)現(xiàn)數(shù)字分頁(yè)功能示例
這篇文章主要介紹了PHP簡(jiǎn)單實(shí)現(xiàn)數(shù)字分頁(yè)功能,結(jié)合實(shí)例形式分析了php數(shù)字分頁(yè)相關(guān)的數(shù)學(xué)運(yùn)算與字符串操作相關(guān)技巧,需要的朋友可以參考下2016-08-08php實(shí)現(xiàn)用手機(jī)關(guān)閉計(jì)算機(jī)(電腦)的方法
這篇文章主要介紹了php實(shí)現(xiàn)用手機(jī)關(guān)閉計(jì)算機(jī)(電腦)的方法,涉及php使用system方法調(diào)用系統(tǒng)命令的相關(guān)技巧,需要的朋友可以參考下2015-04-04WordPress開發(fā)中的get_post_custom()函數(shù)使用解析
這篇文章主要介紹了WordPress開發(fā)中的get_post_custom()函數(shù)使用解析,get_post_custom()函數(shù)用于獲取自定義字段,需要的朋友可以參考下2016-01-01php 無(wú)限級(jí)分類,超級(jí)簡(jiǎn)單的無(wú)限級(jí)分類,支持輸出樹狀圖
php 無(wú)限級(jí)分類,超級(jí)簡(jiǎn)單的無(wú)限級(jí)分類,支持輸出樹狀圖,代碼來(lái)自網(wǎng)絡(luò), 只是自己用了挺長(zhǎng)時(shí)間特地拿出來(lái)分享給大家2014-06-06個(gè)人站長(zhǎng)制做網(wǎng)頁(yè)常用的php代碼
個(gè)人站長(zhǎng)制做網(wǎng)頁(yè)常用的php代碼...2007-03-03PHP系列學(xué)習(xí)之日期函數(shù)使用介紹
PHP有非常豐富的庫(kù)資源,便于開發(fā)者很容易的處理一些業(yè)務(wù)。由于我們?cè)陧?xiàng)目中與日期接觸最多,所以今天就從日期函數(shù)入手學(xué)習(xí)2012-08-08php獲取ip的三個(gè)屬性區(qū)別介紹(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
獲取用戶IP地址的三個(gè)屬性的區(qū)別HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR,需要的朋友可以參考下2012-09-09