线上效果图:
操作如下:
在\fecshop_win\addons\fecmall\fecyo\lib\wxapp\文件夹放入微信官方的Demo,三个php文件
在fecshop\fecshop_wxapp\fecyo\pages\login\login.wxml文件的47行加上:
<button type="primary" class="save-btn" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber" >{{language.read_form_weixin}}</button>
在fecshop\fecshop_wxapp\fecyo\pages\login\login.js文件
18行:去除默认手机号。
102行:只要将下面的代码替换掉从102行开始执行的函数即可。主要是增加保存session_key,顺带修复无伤大雅的小Bug,即:失败重复请求由7次改为作者备注的5次,
success: function (res) {
wx.hideLoading();
app.saveReponseHeader(res);
//console.log(res);
if (res.data.code == '1100025') { // 没有相关用户,需要绑定
that.setData({
loadAccount: 2,
userinfo:res.data.data,
});
//wx.setStorageSync('userinfo',userinfo);
return
}
if (res.data.code == '200') { // 登陆成功,进行跳转
wx.navigateBack({
delta: 1
});
//that.globalData.uid = res.data.data.uid;
//wx.navigateTo({
// url: "/pages/my/my"
//})
} else { // 其他的失败情况,重新进行登陆操作,最大5次
// 如果获取微信数据失败,则重复获取,最大5次
var reRequestCount = that.data.reRequestCount;
that.setData({
reRequestCount: reRequestCount + 1,
});
if (reRequestCount < 4) {//此逻辑是第五次执行后才跳过
// wx.showModal({
// title: "提示",
// content: "微信登录失败,重试中",
// showCancel: false
// });
that.wxLogin();
} else {
wx.showModal({
title: "提示",
content: "微信登录失败",
showCancel: false
});
}
that.setData({
loadAccount: 3,
});
return;
}
}
在文件末尾 }) 前面加上:
getPhoneNumber(e) {
var that = this,
session_key=that.data.userinfo.session_key,
encryptedData=e.detail.encryptedData,
iv=e.detail.iv,
openid=that.data.userinfo.openid;
if (e.detail.errMsg == 'getPhoneNumber:ok') {
wx.checkSession({
success:function(){
that.deciyption(session_key,encryptedData,iv,openid);
},
fail:function(){
that.wxLogin();
that.deciyption(this.data.userinfo.session_key,encryptedData,iv,openid);
}
})
}
},
deciyption(session_key,encryptedData,iv,openid){
var that = this;
wx.request({
url: app.globalData.urls + "/customer/login/bindaccount2", // "/user/wxapp/login",
header: app.getPostRequestHeader(),
method: 'POST',
data: {
session_key: session_key,
encryptedData: encryptedData,
iv: iv,
openid: openid,
},
success: function (res) {
wx.hideLoading();
app.saveReponseHeader(res);
//console.log(res);
if (res.data.code == '1100026') { // 无法通过微信api获取信息
wx.showModal({
title: "提示",
content: "无法从Session中获取微信Openid,请重新绑定",
showCancel: false
});
that.wxLogin();
return;
} else if (res.data.code == '1100027') { // 登陆成功,进行跳转
wx.showModal({
title: "提示",
content: "您已经有绑定的账户",
showCancel: false
});
return;
} else if (res.data.code == '1100007') { // 没有相关用户,需要绑定
wx.showModal({
title: "提示",
content: "注册账户失败: " + res.data.data.errors,
showCancel: false
});
} else if (res.data.code == '1100029') { // 没有相关用户,需要绑定
wx.showModal({
title: "提示",
content: "该邮箱已经存在,请点击`已有账户`,输入邮箱密码进行账户绑定",
showCancel: false
});
} else if (res.data.code == '1100028') { // 没有相关用户,需要绑定
wx.showModal({
title: "提示",
content: "用户的账户密码不正确,请重新输入",
showCancel: false
});
} else if (res.data.code == '200') { // 没有相关用户,需要绑定
//wx.navigateTo({
// url: "/pages/my/my"
//})
wx.navigateBack({
delta: 1
});
} else {
wx.showModal({
title: "提示",
content: "绑定失败,请重新绑定",
showCancel: false
});
that.wxLogin();
}
}
});
},
在文件:\fecshop\fecshop_win\addons\fecmall\fecyo\app\appserver\modules\Customer\controllers\LoginController.php
在文件末尾 } 前加上下面代码:
// 绑定账户
public function actionBindaccount2()
{
$encryptedData = Yii::$app->request->post('encryptedData');
$iv = Yii::$app->request->post('iv');
$wx_session_key = Yii::$app->request->post('session_key');
$wx_openid = Yii::$app->request->post('openid');
if (!$wx_openid || !$wx_session_key || !$encryptedData || !$iv) {
$code = Yii::$service->helper->appserver->no_account_openid_and_session_key;
$data = [ ];
$responseData = Yii::$service->helper->appserver->getResponseData($code, $data);
return $responseData;
}
if (Yii::$service->customer->getByWxOpenid($wx_openid)) {
// 已经存在绑定的用户,绑定失败
$code = Yii::$service->helper->appserver->account_has_account_openid;
$data = [ ];
$responseData = Yii::$service->helper->appserver->getResponseData($code, $data);
return $responseData;
}
$resultData = $this->PhoneIpn($encryptedData,$iv,$wx_session_key);
if (is_array($resultData)) {
$phone = $resultData['phoneNumber'];
}
if (!$phone) {
$code = Yii::$service->helper->appserver->account_register_fail;
$data = $resultData;//[ ];
$responseData = Yii::$service->helper->appserver->getResponseData($code, $data);
return $responseData;
}
$param = [
'phone' => $phone,
'openid' => $wx_openid,
'session_key' => $wx_session_key,
];
$access_token = Yii::$service->customer->phoneRegisterAndGetLoginAccessToken($param);
if (!$access_token) {
$code = Yii::$service->helper->appserver->account_register_fail;
$data = [
'errors' => Yii::$service->helper->errors->get(),
];
$responseData = Yii::$service->helper->appserver->getResponseData($code, $data);
return $responseData;
}
$code = Yii::$service->helper->appserver->status_success;
$data = [ ];
$responseData = Yii::$service->helper->appserver->getResponseData($code, $data);
return $responseData;
}
public function PhoneIpn($encryptedData,$iv,$sessionKey)
{
$wxBizDataCrypt = Yii::getAlias('@fecyo/lib/wxapp/wxBizDataCrypt.php');
require_once($wxBizDataCrypt);
$pc = new \WXBizDataCrypt(Yii::$app->store->get('payment_wxpay', 'wechat_micro_app_id' ),$sessionKey);
$decryptData = ""; //解密后的明文
$errCode = $pc->decryptData($encryptedData, $iv, $decryptData);
if ($errCode == 0) {
return json_decode($decryptData,true);
} else {
return $errCode;
}
}
在61行左右,有个小瑕疵顺便说下:
$phone = $wxCode = Yii::$app->request->post('phone');
$captcha = $wxCode = Yii::$app->request->post('captcha');
改为:
$phone = Yii::$app->request->post('phone');
$captcha = Yii::$app->request->post('captcha');
框架作者如果要改,那就顺便把文件:
fecshop\fecshop_win\vendor\fancyecommerce\fecshop\app\appserver\modules\Customer\controllers\LoginController.php
207行 到 209行的也改下:
$isBindNew = $wxCode = Yii::$app->request->post('isBindNew');
$email = $wxCode = Yii::$app->request->post('email');
$password = $wxCode = Yii::$app->request->post('password');
同一文件的288行左右,将空数组改为含有session_key和openid信息的数组:
// 如果$openid 没有 对应的customer,则需要先绑定或者创建相应的账户
if (!$customer) {
$code = Yii::$service->helper->appserver->account_wx_get_customer_by_openid_fail;
$data = [];
$responseData = Yii::$service->helper->appserver->getResponseData($code, $data);
return $responseData;
}
改为:
// 如果$openid 没有 对应的customer,则需要先绑定或者创建相应的账户
if (!$customer) {
$code = Yii::$service->helper->appserver->account_wx_get_customer_by_openid_fail;
$data = $wxUserInfo;
$responseData = Yii::$service->helper->appserver->getResponseData($code, $data);
return $responseData;
}
在文件:fecshop\fecshop_win\addons\fecmall\fecyo\services\Customer.php
218行:
$session_key = $param['openid'];
Bug修复改为:
$session_key = $param['session_key'];
在文件:\fecshop\fecshop_win\vendor\fancyecommerce\fec\helpers\CApi.php
53行加入,这样本地开发才能获取openID。
if (stripos ( $url, "https://api.weixin.qq.com" ) !== false) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//绕过ssl验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
本文由 Chen 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。
可自由转载、引用,但需署名作者且注明文章出处。