我们可以打开微信购物里面的京东商城,用户未给该商城任何授权,但是在最后提交订单支付时确实可以顺利支付的,我们知道,微信支付是需要获取支付用户的openid,那么京东商城是如何在我们无感知的情况获取到我们的openid的呢?,今天小编就来说说关于前端h5如何用微信账号登录?下面更多详细答案一起来看看吧!
前端h5如何用微信账号登录
我们可以打开微信购物里面的京东商城,用户未给该商城任何授权,但是在最后提交订单支付时确实可以顺利支付的,我们知道,微信支付是需要获取支付用户的openid,那么京东商城是如何在我们无感知的情况获取到我们的openid的呢?
话不多少,我们直接上代码。
一、通过JS获取授权code
<script>
function getQueryString(name) {
var reg = new RegExp("(^|&)" name "=([^&]*)(&|$)", "i");
var r = location.search.substr(1).match(reg);
if (r != null)
return unescape(decodeURI(r[2]));
return null;
}
$(function () {
var access_code = getQueryString('code');
if (access_code == null) {
var fromurl = location.href;//获取授权code的回调地址,获取到code,直接返回到当前页
var url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=APP_ID&redirect_uri=' encodeURIComponent(fromurl) '&response_type=code&scope=snsapi_base&state=0#wechat_redirect';
location.href = url;
}else{
<span style="white-space:pre"> </span> $.ajax({
type:'get', url:ApiUrl '/index.php/Usersapi/authorize', async:false, cache:false, data:{code:access_code}, dataType:'JSON', success:function(result){ if (result!=null && result.hasOwnProperty('openid') && result.openid!=""){ alert(result.openid) } else { alert('微信身份识别失败 \n ' result); location.href=fromurl; } } }); } }) </script>
getQueryString()方法功能是获取URL链接上的参数
二、PHP后端处理
class UserapiController{
public function authorize(){
if (isset($_GET['code'])) {
$code = $_GET['code'];
$data = $this->getUserInfoBycode($code);
$openid = $data['openid'];
$ret['openid'] = $openid;
$this->ajaxReturn($ret,'JSON');
}
}
</pre><pre name="code" class="php">public function getUserInfoBycode($code){
$res = $this->http('https://api.weixin.qq.com/sns/oauth2/access_token', array('appid' => _APPID, 'secret' => _APPSECRET, 'code' => $code, 'grant_type' => 'authorization_code'), '', 'GET');
if ($res) {
return $res;
}
return false;
}
/**
* 发送HTTP请求方法,目前只支持CURL发送请求
* @param string $url 请求URL
* @param array $param GET参数数组
* @param array $data POST的数据,GET请求时该参数无效
* @param string $method 请求方法GET/POST
* @return array 响应数据
*/
public function http($url, $param, $data = '', $method = 'GET') {
$opts = array(
CURLOPT_TIMEOUT => 30,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
);
/* 根据请求类型设置特定参数 */
$opts[CURLOPT_URL] = $url . '?' . http_build_query($param);
if (strtoupper($method) == 'POST') {
$opts[CURLOPT_POST] = 1;
$opts[CURLOPT_POSTFIELDS] = $data;
if (is_string($data)) { //发送JSON数据
$opts[CURLOPT_HTTPHEADER] = array(
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($data),
);
}
}
/* 初始化并执行curl请求 */
$ch = curl_init();
curl_setopt_array($ch, $opts);
$data = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
//发生错误,抛出异常
if ($error)
throw new \Exception('请求发生错误:' . $error);
return json_encode($data);
}
}
通过上述方式,即可在用户无感知的情况下,获取到用户的openid,且不影响用户的微信支付流程。
,