在网页放置微信小程序码,通过扫码在微信小程序端完成注册,同时需要获取微信用户的标识,用来拒绝已经注册过的用户,该怎么实现?
小程序端提交后将数据上传到MySQL,网页需要有提示样式,可以用什么办法?
首先,这个扫码进入小程序后,应该是显示一个直接授权获取用户openid的功能,然后读取数据库判断openid是否存在,存在则读取用户信息将信息发送给服务器端php application全局保存。
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!<?php
namespace App\Http\Controllers\WeRun;
use App\Http\Controllers\Controller as BaseController;
use App\Http\Controllers\PHP\WXBizDataCrypt;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redis;
class RunController extends BaseController
{
protected $crontab;
protected $user;
protected $appid="wxa2d68e****32ec56"; //小程序Appid
protected $appsecret="cc3e33e924677********fb168813426"; //小程序秘钥
public function __construct()
{
}
public function onlogin(Request $request){
$code=$request->all('code');
if (!empty($code)){
$sessionKey=$this->GetSession("wxa2d68e****32ec56", "cc3e33e924677********fb168813426",$code['code']);
$arr=json_decode($sessionKey,true);
if (!empty($sessionKey))
{
//三种方法
//1.
//$_SESSION[$code['code']]=$arr['session_key'];
//2.
//session()->put($code['code'],$arr['session_key']);
//$sess=session()->get($code['code']);
//3.
Redis::setex('code:'.$code['code'],3600,$arr['session_key']);
$user=Redis::get('code:'.$code['code']);
$data=[
'msg'=>'登录成功',
'info'=>$user
];
return json_encode($data);
}
}
}
public function GetSession($appid,$appsecret,$code){
$url= "https://api.weixin.qq.com/sns/jscode2session?appid=".$appid."&secret=".$appsecret."&js_code=".$code."&grant_type=authorization_code";
$arr = $this->http_curl($url);
if (!empty($arr))
{
return json_encode($arr);
}
return null;
}
protected function http_curl($url, $arr = '', $type = 'get', $res = 'json')
{
$ch = curl_init();
//设置curl的参数
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if ($type == 'post') {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arr);
}
//采集
$output = curl_exec($ch);
if ($res == 'json') {
if ($err = curl_errno($ch)) {
//要在关闭之前获得curl_errno
curl_close($ch);
//请求失败,返回错误信息
return $err;
} else {
//请求成功
return json_decode($output, true);
}
}
}
/**
* @param Request $request
* @return string
* 微信获取加密的用户步数
*/
public function Decrypt(Request $request){
$rqt = $request->all();
$appid="wxa2d68ed24d32ec56";
$sessionKey = Redis::get('code:'.$rqt["code"]); //取出OnLogin的sessionKey
$rawData = $this->AES_decrypt($appid,$rqt['encryptedData'], $sessionKey, $rqt['iv']);
if (!empty($rawData)){
return json_encode($rawData);
}
return json_encode("解密失败");
}
/**
* @param $appid
* @param $encryptedData
* @param $sessionKey
* @param $iv
* @return string
* 解密算法
*/
public function AES_decrypt($appid,$encryptedData,$sessionKey,$iv){
$datacrypt=new WXBizDataCrypt($appid,$sessionKey);
$errCode = $datacrypt->decryptData($encryptedData, $iv, $data );
if ($errCode == 0) {
$arr_s=json_decode($data,true);
$arr=$arr_s['stepInfoList'];
$array=[];
if($arr){
foreach ($arr as $k=>$v){
$array[date("Y-m-d H:i:s",$v['timestamp'])]=$v['step'];
}
}
return $array;
} else {
return json_encode($errCode);
}
}
}
//引入一个官方的PHP语言解密代码(里面有demo。看了就懂)
//https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html
在快写完的时候,PHP报解密的类找不到,但是我的命名空间没有问题,解决方法: composer dump-autoload