MemberWechatQrcodeService.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 17/2/23
  6. * Time: 上午11:21
  7. */
  8. namespace app\frontend\modules\member\services;
  9. use app\common\exceptions\MemberErrorMsgException;
  10. use app\common\helpers\Url;
  11. use app\frontend\modules\member\models\MemberUniqueModel;
  12. use app\frontend\modules\member\models\MemberWechatQrcodeModel;
  13. use app\common\services\Session;
  14. use app\frontend\models\Member;
  15. class MemberWechatQrcodeService extends MemberService
  16. {
  17. const LOGIN_TYPE = 5;
  18. const IS_PC_QRCODE = 1;
  19. private $config;
  20. public function __construct()
  21. {
  22. $this->config = '';
  23. if (!is_null(\app\common\modules\shop\ShopConfig::current()->get('wechat_qrcode_config'))) {
  24. $class = array_get(\app\common\modules\shop\ShopConfig::current()->get('wechat_qrcode_config'), 'class');
  25. $function = array_get(\app\common\modules\shop\ShopConfig::current()->get('wechat_qrcode_config'), 'function');
  26. $this->config = $class::$function();
  27. }
  28. return $this->config;
  29. }
  30. //验证是否能扫码登录
  31. public function checkLogin($is_pc_qrcode){
  32. $arr = array('status' => 0);
  33. if(empty($this->config)){
  34. $arr = ['status'=>1,'msg'=>'不支持扫码登录'];
  35. }else if($this->config['is_open'] == 0){
  36. $arr = ['status'=>1,'msg'=>'未开启扫码登录'];
  37. }else if($this->config['is_wechat_login'] == 1 && $is_pc_qrcode <> self::IS_PC_QRCODE){
  38. $arr = ['status'=>1,'msg'=>'必须使用微信扫码登录'];
  39. }
  40. return $arr;
  41. }
  42. public function login()
  43. {
  44. $check = $this->checkLogin(\YunShop::request()->is_pc_qrcode);
  45. if($check['status'] == 1) {
  46. exit("5001" . $check['msg']);
  47. }
  48. $yz_redirect = request()->yz_redirect;
  49. $uniacid = \YunShop::app()->uniacid;
  50. $mid = \app\common\models\Member::getMid();
  51. $code = \YunShop::request()->code;
  52. $request_url = $_SERVER['REQUEST_URI'] . "&is_pc_qrcode=" . \YunShop::request()->is_pc_qrcode . "&yz_redirect=" . $yz_redirect;
  53. $callback = ($_SERVER['REQUEST_SCHEME'] ? $_SERVER['REQUEST_SCHEME'] : 'http') . '://' . $_SERVER['HTTP_HOST'] . $request_url;
  54. // \Log::debug('--回调地址--',$callback);
  55. $state = 'yz-' . session_id();
  56. Session::set('wx_qrcode_state',$state);
  57. $wxurl = $this->_getAuthUrl($this->config['appid'],$callback,$state);
  58. if (!empty($code)) {
  59. $query = parse_url($callback,PHP_URL_QUERY);
  60. parse_str($query,$params);
  61. $redirect_url = $params['yz_redirect'];//重定向地址
  62. $token = $this->_getTokenUrl($this->config['appid'], $this->config['app_secret'], $code);
  63. // \Log::debug('token信息', $token);
  64. if (!empty($token) && is_array($token) && $token['errmsg'] == 'invalid code') {
  65. return show_json(0, array('msg'=>'请求错误'));
  66. }
  67. $user_info = $this->_getUserInfoUrl($token['access_token'], $token['openid']);
  68. \Log::debug('PC端扫码登录微信授权成功', $user_info);
  69. if (is_array($user_info) && !empty($user_info['errcode'])) {
  70. \Log::debug('---微信扫码登陆授权失败---', $user_info);
  71. throw new MemberErrorMsgException('微信扫码登陆授权失败');
  72. }
  73. $member_id = $this->memberLogin($user_info);
  74. Session::set('member_id', $member_id);
  75. self::redirectUrl($member_id,$uniacid,$mid,$redirect_url);
  76. } else {
  77. return show_json(9, array('url'=> $wxurl,'msg'=>'生成二维码链接成功'));
  78. }
  79. }
  80. /**
  81. * api
  82. * 生成微信扫码登录二维码
  83. * snsapi_userinfo
  84. * @param $appId
  85. * @param $url
  86. * @param $state
  87. * @return string
  88. */
  89. private function _getAuthUrl($appId, $url, $state)
  90. {
  91. return "https://open.weixin.qq.com/connect/qrconnect?appid=" . $appId ."&redirect_uri=" . urlencode($url) . "&response_type=code&scope=snsapi_login&state={$state}#wechat_redirect";
  92. }
  93. /**
  94. * 获取微信用户信息
  95. * @param $accesstoken
  96. * @param $openid
  97. * @return mixed
  98. */
  99. private function _getUserInfoUrl($accesstoken, $openid)
  100. {
  101. $url = "https://api.weixin.qq.com/sns/userinfo?access_token={$accesstoken}&openid={$openid}&lang=zh_CN";
  102. return $userinfo_url = \Curl::to($url)
  103. ->asJsonResponse(true)
  104. ->get();
  105. }
  106. /**
  107. * 获取token api
  108. *
  109. * @param $appId
  110. * @param $appSecret
  111. * @param $code
  112. * @return string
  113. */
  114. private function _getTokenUrl($appId, $appSecret, $code)
  115. {
  116. $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $appId . "&secret=" . $appSecret . "&code=" . $code . "&grant_type=authorization_code";
  117. return $tokenurl = \Curl::to($url)
  118. ->asJsonResponse(true)
  119. ->get();
  120. }
  121. /**
  122. * 会员关联表操作
  123. *
  124. * @param $uniacid
  125. * @param $member_id
  126. * @param $unionid
  127. */
  128. public function addMemberUnionid($uniacid, $member_id, $unionid)
  129. {
  130. MemberUniqueModel::replace(array(
  131. 'uniacid' => $uniacid,
  132. 'unionid' => $unionid,
  133. 'member_id' => $member_id,
  134. 'type' => self::LOGIN_TYPE
  135. ));
  136. }
  137. /**
  138. * @param $uid
  139. * @param $uniacid
  140. * @param $userinfo
  141. */
  142. public function addFansMember($uid, $uniacid, $userinfo)
  143. {
  144. $user = MemberWechatQrcodeModel::getUserInfo_memberid($uid);
  145. if (!empty($user)) {
  146. $this->updateMemberInfo($uid, $userinfo);
  147. } else {
  148. MemberWechatQrcodeModel::replace(array(
  149. 'uniacid' => $uniacid,
  150. 'member_id' => $uid,
  151. 'openid' => $userinfo['openid'],
  152. 'nickname' => $userinfo['nickname'],
  153. 'avatar' => $userinfo['headimgurl'],
  154. 'gender' => $userinfo['sex'],
  155. 'province' => '',
  156. 'country' => '',
  157. 'city' => '',
  158. ));
  159. }
  160. }
  161. /**
  162. *
  163. * @param $openid
  164. *
  165. * @return mixed
  166. */
  167. public function getFansModel($openid)
  168. {
  169. $model = MemberWechatQrcodeModel::getUserInfo($openid);
  170. if (!is_null($model)) {
  171. $model->uid = $model->member_id;
  172. }
  173. }
  174. /**
  175. * 验证登录状态
  176. *
  177. * @return bool
  178. */
  179. public function checkLogged($login = null)
  180. {
  181. return MemberService::isLogged();
  182. }
  183. /**
  184. * 扫码跳转到商城
  185. * @param $member_id
  186. * @param $uniacid
  187. * @param $mid
  188. */
  189. public function redirectUrl($member_id,$uniacid,$mid,$redirect_url){
  190. Session::set('member_id',$member_id);
  191. if($redirect_url){
  192. $url = base64_decode($redirect_url);
  193. }else{
  194. $url = Url::absoluteApp('member', ['i' => $uniacid, 'mid' => $mid]);//默认会员中心
  195. }
  196. $mobile = Member::where('uid', $member_id)->value('mobile');
  197. if(empty($mobile) && $this->config['pc_bind_mobile']){
  198. if(\YunShop::request()->pc){
  199. $url = 'https://' .$_SERVER['HTTP_HOST'] ."/plugins/shop_server/login?i={$uniacid}&from=phone";
  200. }else{
  201. $url = Url::absoluteApp('login', ['i' => $uniacid, 'from' => 'phone']); ;
  202. }
  203. }
  204. redirect($url)->send();//跳转到前端会员中心页面
  205. }
  206. public function addMemberInfo($uniacid, $userinfo)
  207. {
  208. $uid = parent::addMemberInfo($uniacid, $userinfo);
  209. \Log::debug('---wechat_qrcode_fans---', $uid);
  210. //添加wechat_qrcode_fans表
  211. $this->addFansMember($uid, $uniacid, $userinfo);
  212. return $uid;
  213. }
  214. }