appphptoken
① 微信平台 php 示例 token验证失败
下载官方哪个开发包来试试,我用哪个包的Function都可以
② PHP如何通过Post请求发送Json数据
首先要把数据转换成json格式,再通过curl方法调用接口并传参数
代码如下:
$keyword=urlencode($_POST['keyword']);
$parameters=json_encode(array('keyWord'=>$keyword,'areaCode'=>'*'));
$post_data['appToken']="323ds7674354fds32fdsda60173";//随便写的
$post_data['parameters']=$parameters;
$url='http://serde.com/compadddvd/index';//随便写的
$ch=curl_init();
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data);//用post方法传送参数
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$response=curl_exec($ch);
curl_close($ch);
之后就返回数据即可。
③ 用thinkphp写一个app登录的接口 麻烦哪位大神给个事例
1、可以使用 REST模式 来开发 App 接口,首先建立一个公共控制器,再建其他控制器继承它即可。
2、确定好返回的数据内容格式及信息码;
<?php
// App接口公共控制器 AppController
namespace Api\Controller;
use Think\Controller\RestController;
class AppController extends RestController {
// 自动加载的东西
function _initialize() { }
// 验证 客户端 token
protected function checkAppToken($apptoken){
// 引入 function.php 中定义的检测 apptoken 的函数
if(checkingAppToken($apptoken)){
return true;
}else{
$data['code'] = '404';
$data['msg'] = 'apptoken无效';
$data['data'] = null;
$this -> response($data, 'json');
exit();
}
}
// 验证 用户 token
protected function checkUserToken($usertoken){
}
// 各种验证 ……
}
?>
复制代码
其他接口控制器继承 AppController
<?php
// 内容控制器 ContentsController
namespace Api\Controller;
class ContentsController extends AppController {
// 自动加载验证
function _initialize() {
parent::_initialize();
// 验证 客户端 token
$apptoken = I('post.apptoken');
parent::checkAppToken($apptoken);
// 验证 用户 token
$usertoken = I('post.usertoken');
parent::checkUserToken($usertoken);
// 各种需要验证的验证 ……
}
// 各种业务方法
public function index(){
// 返回数据
$this -> response($data, 'json');
exit();
}
}
?>
④ php 开发接口 怎么设计token比较合适
每登录一次返回给接口一个token,这个token会存储在单独的表里,每次APP关系到用户的操作都必须要携带token,根据token来解码出是哪个用户。这种方法也可以做其他设备登录踢出。一般都是这么个做法。token的生成类似cookie的密码加密,我是这么做的,当然有很多种方法,只要你能加密能解密就行。下面是phpcms里面的一个经典的方法,我一般拿来做cookie加密,制作token来使用。
<?php
/**
*字符串加密、解密函数
*
*@paramstring$txt字符串
*@paramstring$operationENCODE为加密,DECODE为解密,可选参数,默认为ENCODE,
*@paramstring$key密钥:数字、字母、下划线
*@paramstring$expiry过期时间
*@returnstring
*/
functionsys_auth($string,$operation='ENCODE',$key='',$expiry=0){
$ckey_length=4;
$key=md5($key!=''?$key:C('COOKIE_AUTH_KEY'));
$keya=md5(substr($key,0,16));
$keyb=md5(substr($key,16,16));
$keyc=$ckey_length?($operation=='DECODE'?substr($string,0,$ckey_length):substr(md5(microtime()),-$ckey_length)):'';
$cryptkey=$keya.md5($keya.$keyc);
$key_length=strlen($cryptkey);
$string=$operation=='DECODE'?base64_decode(strtr(substr($string,$ckey_length),'-_','+/')):sprintf('%010d',$expiry?$expiry+time():0).substr(md5($string.$keyb),0,16).$string;
$string_length=strlen($string);
$result='';
$box=range(0,255);
$rndkey=array();
for($i=0;$i<=255;$i++){
$rndkey[$i]=ord($cryptkey[$i%$key_length]);
}
for($j=$i=0;$i<256;$i++){
$j=($j+$box[$i]+$rndkey[$i])%256;
$tmp=$box[$i];
$box[$i]=$box[$j];
$box[$j]=$tmp;
}
for($a=$j=$i=0;$i<$string_length;$i++){
$a=($a+1)%256;
$j=($j+$box[$a])%256;
$tmp=$box[$a];
$box[$a]=$box[$j];
$box[$j]=$tmp;
$result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256]));
}
if($operation=='DECODE'){
if((substr($result,0,10)==0||substr($result,0,10)-time()>0)&&substr($result,10,16)==substr(md5(substr($result,26).$keyb),0,16)){
returnsubstr($result,26);
}else{
return'';
}
}else{
return$keyc.rtrim(strtr(base64_encode($result),'+/','-_'),'=');
}
}
?>
⑤ php如何把下面数组里的access_token赋值给其他变量
直接用foreach ($appshipping as $key => $value) {
每一次循环都在这里面写:
$Key分别是:type,accessToken,refreshToken,macKey,macAlgorithm.
取$value[$Key]即可
}循环即可。
⑥ 未认证订阅号怎么用PHP开发自定义菜单已经有服务器,服务器配置token也验证成功,也有appI
现在普通订阅号也可以制作自定义菜单
主要方式有2种
第一种,首先关闭开发者模式,再在账号管理里面有一个“自定义菜单”用他的界面来制作菜单
第二种,打开开发者模式,在自己的php代码里组装一个json请求,json的内容是菜单组成,再把这个json post到微信的自定义菜单的公网地址,这个接口需要accesstoken,但是accesstoken只要有appid和appsecret就可以换到,不需要认证
无需认证
⑦ php怎么获取钉钉员工授权信息
做过一个E应用,使用lumen框架,和你的思路是一样的,新用户点进去就自动授权注册应用,数据存到我们自己的数据库中,不依赖钉钉,我们还同步了部门信息,如果粘贴复制和下面的那个同学一样,看上去你也会觉得懵,方法都是封装好了的。
建议你这样试试看:
获取AccessToken:
后端通过corpid,corpsecret请求接口gettoken?corpid=id&corpsecret=secrect获取AccessToken
获取钉钉用户userid:
前端需要相应的处理,携带authCode请求,加上AccessToken这两个参数请求接口/user/getuserinfo?access_token=access_token&code=authCode这个
获取钉钉用户详情:
使用access_token和上一步的钉钉userid 请求接口 /user/get?access_token=ACCESS_TOKEN&userid=
插入钉钉用户的数据到你的 数据库中
我们这样做的:
/**
* 钉钉免登陆获获取用信息
* @param $authCode
* @param $url
* @return array
*/
static function outhLogin($authCode, $url)
{
if (empty($authCode) || empty($url)) {
return self::returnError('1101', self::$errorArray['1101']);
}
$accessToken = ComponentDingtalk::getPcAccessToken();
if ($accessToken['code']) {
self::logError(__CLASS__ . '->' . __FUNCTION__, '获取access_token失败');
return self::returnError('1102', self::$errorArray['1102']);
}
$dingUserId = ComponentDingtalk::getDingUserid($accessToken['data'], $authCode);
if ($dingUserId['code']) {
self::logError(__CLASS__ . '->' . __FUNCTION__, '用户userid获取失败(调用钉钉API)');
return self::returnError('1103', self::$errorArray['1103']);
}
$dinguserInfo = ComponentDingtalk::getDingUserInfo($accessToken['data'], $dingUserId['data']);
if ($dinguserInfo['code']) {
self::logError(__CLASS__ . '->' . __FUNCTION__, '用户信息获取失败(调用钉钉API)');
return self::returnError('1104', self::$errorArray['1004']);
}
$userInfo = $dinguserInfo['data'];
return self::transaction(function () use ($accessToken, $userInfo, $url) {
if (count($userInfo['department']) > 1) {
$departIdArr = [];
$departNameArr = [];
for ($i = 0, $iMax = count($userInfo['department']); $i < $iMax; $i++) {
$departInfo[$i] = ServerDepartment::getByDdDepartid($userInfo['department'][$i]);
$departIdArr[] = $departInfo[$i]['id'];
$departNameArr[] = $departInfo[$i]['name'];
}
$depart['id'] = implode(',', $departIdArr);
$depart['name'] = implode(',', $departNameArr);
} else {
$ddDepartmentId = implode(',', $userInfo['department']);
$depart = ServerDepartment::getByDdDepartid($ddDepartmentId);
}
//插入用户
$user = ServerEmployee::getByDdUserid($userInfo['userid']);
if ($user && $user['status'] == 2) {
return self::returnError('1105', self::$errorArray['1105']);
}
if (empty($user)) {
$roleId = 0;
$departId = $depart['id'];
$name = $userInfo['name'];
$mobile = $userInfo['mobile'];
$departName = $depart['name'];
$position = $userInfo['position'];
$ddUserid = $userInfo['userid'];
$ddStatus = $userInfo['active'] ? 1 : 2;
$ddInfo = json_encode($userInfo, JSON_UNESCAPED_UNICODE);
$tokenOverAt = (int)(time() + $_ENV['PROJECT_apiAppTokenOverTime']);
$token = self::_createToken($userInfo['userid'], $tokenOverAt);
$status = 1;
$userId = ServerEmployee::insert($roleId, $departId, $name, $mobile, $departName, $position, $ddUserid, $ddStatus, $ddInfo, $token, $tokenOverAt, $status);
if (!$userId) {
self::logError(__CLASS__ . '->' . __FUNCTION__, '用户初始化创建失败');
return self::returnError('1106', self::$errorArray['1106']);
}
}
$userId = $userId ?? $user['id'];
// 更新Token
$id = $userId;
$roleId = $user['roleId'];
$departId = $depart['id'];
$name = $userInfo['name'];
$mobile = $userInfo['mobile'];
$departName = $depart['name'];
$position = $userInfo['position'];
$ddUserid = $userInfo['userid'];
$ddStatus = $userInfo['active'] ? 1 : 2;
$ddInfo = json_encode($userInfo, JSON_UNESCAPED_UNICODE);
$tokenOverAt = (int)(time() + $_ENV['PROJECT_apiAppTokenOverTime']);
$token = self::_createToken($userInfo['userid'], $tokenOverAt);
$status = 1;
$updateParams = ServerEmployee::update($id, $roleId, $departId, $name, $mobile, $departName, $position, $ddUserid, $ddStatus, $ddInfo, $token, $tokenOverAt, $status);
if (!$updateParams) {
self::logError(__CLASS__ . '->' . __FUNCTION__, '用户信息更新失败' . json_encode($updateParams, JSON_UNESCAPED_UNICODE) . '/' . json_encode([$id, $roleId, $departId, $name, $mobile, $depart, $position, $ddUserid, $ddStatus, $ddInfo, $token, $tokenOverAt, $status]));
return self::returnError('1107', self::$errorArray['1107']);
}
// 前端的配置信息
// 获取jsTicket
$jsTicket = ComponentDingtalk::getPcJsTicket($accessToken['data']);
if ($jsTicket['code']) {
self::logError(__CLASS__ . '->' . __FUNCTION__, '获取jsTicket失败(调用钉钉API)');
return self::returnError('1111', self::$errorArray['1111']);
}
// 组装签名数据
$curUrl = $url;;
$nonceStr = uniqid('', true);
$agentId = $_ENV['PROJECT_ddInterfaceAgentID'];
$timeStamp = time();
$corpId = $_ENV['PROJECT_ddInterfaceCorpId'];
$signature = ComponentDingtalk::getSign($jsTicket['data'], $nonceStr, $timeStamp, $curUrl);
$config = array(
'url' => urldecode($curUrl),
'nonceStr' => $nonceStr,
'agentId' => $agentId,
'timeStamp' => $timeStamp,
'corpId' => $corpId,
'signature' => $signature
);
// 获取当前角色的权限
$roleInfo = ServerRole::getById($roleId);
// 当前用户的顶级部门(不含根部门)
$departInfo = ServerDepartment::getById($departId);
if ($departInfo['parentid'] == 1) { // 二级部门(总经办)
$departRootId = $departId;
$departRootName = $departName;
} else {
$sonDepart = ServerDepartment::getById($departInfo['parentid']);//分组
if ($sonDepart['parentid'] == 1) {
$departRootId = $sonDepart['id'];
$departRootName = $sonDepart['name'];
} else {
$grandsonDepart = ServerDepartment::getById($sonDepart['parentid']);//部门
if ($grandsonDepart['parentid'] == 1) {
$departRootId = $grandsonDepart['id'];
$departRootName = $grandsonDepart['name'];
} else {
$grandchildDepart = ServerDepartment::getById($grandsonDepart['parentid']);//分公司
$departRootId = $grandchildDepart['id'];
$departRootName = $grandchildDepart['name'];
}
}
}
$company = ServerDepartment::get(['parentid' => 0, 'dd_departid' => 1]);
return self::returnSuccess(array(
'id' => $userId,
'name' => $name,
'token' => $token,
'tokenOverAt' => $tokenOverAt,
'config' => $config,
'power' => $roleInfo['power'] ?? '',
'departId' => $departId,
'departName' => $departName,
'departRootId' => $departRootId,
'departRootName' => $departRootName,
'company' => $company['name'],
));
}, function (Exception $e) {
echo $e->getMessage();
self::logError(__CLASS__ . '->' . __FUNCTION__, $e->getMessage());
return self::returnError('1108', self::$errorArray['1108']);
});
}
⑧ php给app开发接口的token机制
破解确实是个问题,不过一般情况下,破解是需要时间的,你可以给token加一个过期时间,比如两个小时,一般情况下,两个小时是不足以破解一个密码的。加密算法的话,可以根据自己的习惯选择。