442384644@qq.com 4 роки тому
батько
коміт
cc31e05629
100 змінених файлів з 511 додано та 99 видалено
  1. 2 2
      crmeb/app/services/pc/LoginServices.php
  2. 22 23
      crmeb/app/services/user/UserServices.php
  3. 18 11
      crmeb/app/services/wechat/WechatServices.php
  4. 17 2
      crmeb/app/services/wechat/WechatUserServices.php
  5. 1 1
      crmeb/crmeb/services/Mini3rdProgramService.php
  6. 1 1
      crmeb/crmeb/services/WechatOpenService.php
  7. 13 1
      crmeb/crmeb/services/WechatService.php
  8. 46 0
      crmeb/crmeb/services/easywechat/Application.php
  9. 282 0
      crmeb/crmeb/services/easywechat/oauth2/wechat/WechatOauth.php
  10. 51 0
      crmeb/crmeb/services/easywechat/oauth2/wechat/WechatOauth2Provider.php
  11. 1 1
      crmeb/public/index.html
  12. 13 0
      crmeb/public/static/js/chunk-vendors.b7cab945.js
  13. 0 13
      crmeb/public/static/js/chunk-vendors.fd05f392.js
  14. 1 0
      crmeb/public/static/js/index.32c09daf.js
  15. 0 1
      crmeb/public/static/js/index.9482f767.js
  16. 1 0
      crmeb/public/static/js/pages-activity-bargain-index.37c4d0d3.js
  17. 0 1
      crmeb/public/static/js/pages-activity-bargain-index.df522947.js
  18. 1 0
      crmeb/public/static/js/pages-activity-goods_bargain-index.5758140d.js
  19. 0 1
      crmeb/public/static/js/pages-activity-goods_bargain-index.9b7ccf32.js
  20. 0 1
      crmeb/public/static/js/pages-activity-goods_bargain_details-index.52438a66.js
  21. 1 0
      crmeb/public/static/js/pages-activity-goods_bargain_details-index.84c32ef9.js
  22. 1 1
      crmeb/public/static/js/pages-activity-goods_bargain_details-index~pages-activity-lottery-grids-index~pages-activity-poster-~59f8c0c8.d3587983.js
  23. 1 0
      crmeb/public/static/js/pages-activity-goods_bargain_details-index~pages-goods_details-index~pages-news_details-index~pages-~d556e4a9.3559ff83.js
  24. 0 1
      crmeb/public/static/js/pages-activity-goods_bargain_details-index~pages-goods_details-index~pages-news_details-index~pages-~d556e4a9.c6515345.js
  25. 0 1
      crmeb/public/static/js/pages-activity-goods_combination-index.76499e34.js
  26. 1 0
      crmeb/public/static/js/pages-activity-goods_combination-index.991df445.js
  27. 1 0
      crmeb/public/static/js/pages-activity-goods_combination_details-index.493cb223.js
  28. 0 1
      crmeb/public/static/js/pages-activity-goods_combination_details-index.a5ee3c23.js
  29. 0 1
      crmeb/public/static/js/pages-activity-goods_combination_details-index~pages-activity-goods_combination_status-index~pages-a~b3ca01d9.5ddaa6bc.js
  30. 1 0
      crmeb/public/static/js/pages-activity-goods_combination_details-index~pages-activity-goods_seckill_details-index~pages-acti~9fd5f6c0.05e9e40d.js
  31. 0 1
      crmeb/public/static/js/pages-activity-goods_combination_details-index~pages-activity-goods_seckill_details-index~pages-acti~9fd5f6c0.1a09a0c2.js
  32. 0 1
      crmeb/public/static/js/pages-activity-goods_combination_status-index.6399a9aa.js
  33. 1 0
      crmeb/public/static/js/pages-activity-goods_combination_status-index.c37a01a3.js
  34. 1 0
      crmeb/public/static/js/pages-activity-goods_seckill-index.9b30e225.js
  35. 0 1
      crmeb/public/static/js/pages-activity-goods_seckill-index.d2c21541.js
  36. 0 1
      crmeb/public/static/js/pages-activity-goods_seckill_details-index.cfd3a0ce.js
  37. 1 0
      crmeb/public/static/js/pages-activity-goods_seckill_details-index.ff017a2c.js
  38. 0 1
      crmeb/public/static/js/pages-activity-lottery-grids-index.c1cfd395.js
  39. 1 0
      crmeb/public/static/js/pages-activity-lottery-grids-index.c719a8be.js
  40. 0 1
      crmeb/public/static/js/pages-activity-lottery-grids-index~pages-order_pay_status-index~pages-order_pay_status-payLottery~pa~4af4e820.69ff628b.js
  41. 1 0
      crmeb/public/static/js/pages-activity-lottery-grids-index~pages-order_pay_status-index~pages-order_pay_status-payLottery~pa~4af4e820.6f010ff0.js
  42. 0 1
      crmeb/public/static/js/pages-activity-lottery-grids-record.65d55021.js
  43. 1 0
      crmeb/public/static/js/pages-activity-lottery-grids-record.f77fab82.js
  44. 1 1
      crmeb/public/static/js/pages-activity-lottery-grids-record~pages-activity-presell_details-index~pages-goods_details-index~p~0dc3edf2.b3fafd5e.js
  45. 1 0
      crmeb/public/static/js/pages-activity-poster-poster-index.8923dd67.js
  46. 0 1
      crmeb/public/static/js/pages-activity-poster-poster-index.f0448250.js
  47. 0 1
      crmeb/public/static/js/pages-activity-presell-index.02068e9f.js
  48. 1 0
      crmeb/public/static/js/pages-activity-presell-index.d82f9b81.js
  49. 1 0
      crmeb/public/static/js/pages-activity-presell_details-index.15c7049a.js
  50. 0 1
      crmeb/public/static/js/pages-activity-presell_details-index.52e23816.js
  51. 1 0
      crmeb/public/static/js/pages-activity-presell_details-index~pages-goods_details-index.a5e2148c.js
  52. 0 1
      crmeb/public/static/js/pages-admin-order_cancellation-index.8f838265.js
  53. 1 0
      crmeb/public/static/js/pages-admin-order_cancellation-index.d66b5491.js
  54. 0 1
      crmeb/public/static/js/pages-annex-offline_pay-index.68f055f5.js
  55. 1 0
      crmeb/public/static/js/pages-annex-offline_pay-index.ac77a31a.js
  56. 1 0
      crmeb/public/static/js/pages-annex-offline_result-index.08d4e5fb.js
  57. 0 1
      crmeb/public/static/js/pages-annex-offline_result-index.e4a9f875.js
  58. 0 1
      crmeb/public/static/js/pages-annex-web_view-index.17af7125.js
  59. 1 0
      crmeb/public/static/js/pages-annex-web_view-index.6cd0a1a6.js
  60. 1 0
      crmeb/public/static/js/pages-auth-index.1c2408a2.js
  61. 0 1
      crmeb/public/static/js/pages-auth-index.4d33604c.js
  62. 0 1
      crmeb/public/static/js/pages-columnGoods-HotNewGoods-feedback.cd351ed4.js
  63. 1 0
      crmeb/public/static/js/pages-columnGoods-HotNewGoods-feedback.f0b4c0b8.js
  64. 0 1
      crmeb/public/static/js/pages-columnGoods-HotNewGoods-index.5433b1ea.js
  65. 1 0
      crmeb/public/static/js/pages-columnGoods-HotNewGoods-index.9ebb15da.js
  66. 0 1
      crmeb/public/static/js/pages-customer_list-chat.4964d5d2.js
  67. 1 0
      crmeb/public/static/js/pages-customer_list-chat.d6df98df.js
  68. 0 1
      crmeb/public/static/js/pages-customer_list-index.9e687056.js
  69. 1 0
      crmeb/public/static/js/pages-customer_list-index.ccf96a6e.js
  70. 1 0
      crmeb/public/static/js/pages-goods_cate-goods_cate.99c1f407.js
  71. 0 1
      crmeb/public/static/js/pages-goods_cate-goods_cate.ed486463.js
  72. 0 1
      crmeb/public/static/js/pages-goods_details-index.b94681d5.js
  73. 1 0
      crmeb/public/static/js/pages-goods_details-index.c3ac1293.js
  74. 1 0
      crmeb/public/static/js/pages-goods_list-index.613e47d6.js
  75. 0 1
      crmeb/public/static/js/pages-goods_list-index.9f43ff0f.js
  76. 0 1
      crmeb/public/static/js/pages-goods_list-index~pages-points_mall-integral_goods_list.02478ea9.js
  77. 1 0
      crmeb/public/static/js/pages-goods_list-index~pages-points_mall-integral_goods_list.fe3e4789.js
  78. 0 1
      crmeb/public/static/js/pages-goods_search-index.38cdef2c.js
  79. 1 0
      crmeb/public/static/js/pages-goods_search-index.883f84f2.js
  80. 0 1
      crmeb/public/static/js/pages-index-index.37871fba.js
  81. 1 0
      crmeb/public/static/js/pages-index-index.bddf71f1.js
  82. 1 0
      crmeb/public/static/js/pages-live_list-index.2a20e2b8.js
  83. 0 1
      crmeb/public/static/js/pages-live_list-index.60554f23.js
  84. 1 0
      crmeb/public/static/js/pages-news_details-index.28b73856.js
  85. 0 1
      crmeb/public/static/js/pages-news_details-index.c5d7d74b.js
  86. 1 0
      crmeb/public/static/js/pages-news_list-index.df21eec7.js
  87. 0 1
      crmeb/public/static/js/pages-news_list-index.f1f16712.js
  88. 0 1
      crmeb/public/static/js/pages-order_addcart-order_addcart.23cf5aef.js
  89. 1 0
      crmeb/public/static/js/pages-order_addcart-order_addcart.b9bd1fbe.js
  90. 1 0
      crmeb/public/static/js/pages-order_pay_status-index.6fe78013.js
  91. 0 1
      crmeb/public/static/js/pages-order_pay_status-index.fff4059a.js
  92. 1 0
      crmeb/public/static/js/pages-order_pay_status-payLottery.accbc5f6.js
  93. 0 1
      crmeb/public/static/js/pages-order_pay_status-payLottery.eb30f6fa.js
  94. 1 0
      crmeb/public/static/js/pages-points_mall-exchange_record.5a607353.js
  95. 0 1
      crmeb/public/static/js/pages-points_mall-exchange_record.786a7420.js
  96. 1 0
      crmeb/public/static/js/pages-points_mall-index.952721fb.js
  97. 0 1
      crmeb/public/static/js/pages-points_mall-index.d76afaef.js
  98. 1 0
      crmeb/public/static/js/pages-points_mall-integral_goods_details.16ce9650.js
  99. 0 1
      crmeb/public/static/js/pages-points_mall-integral_goods_details.26d75bc6.js
  100. 0 0
      crmeb/public/static/js/pages-points_mall-integral_goods_list.1fdfa4a5.js

+ 2 - 2
crmeb/app/services/pc/LoginServices.php

@@ -109,8 +109,8 @@ class LoginServices extends BaseServices
             throw new ValidateException('unionid不存在');
         }
         if (!isset($wechatInfo['nickname'])) {
-            $wechatInfo = WechatAuthService::getUserInfo($wechatInfo['openid']);
-            if (!$wechatInfo['subscribe'] && !isset($wechatInfo['nickname']))
+            $wechatInfo = WechatAuthService::oauth2Service()->getUserInfo($wechatInfo['openid'])->toArray();
+            if (!isset($wechatInfo['nickname']))
                 throw new ValidateException('授权失败');
             if (isset($wechatInfo['tagid_list']))
                 $wechatInfo['tagid_list'] = implode(',', $wechatInfo['tagid_list']);

+ 22 - 23
crmeb/app/services/user/UserServices.php

@@ -1779,34 +1779,33 @@ class UserServices extends BaseServices
         foreach ($noBeOpenids as $openid) {
             try {
                 $info = WechatService::getUserInfo($openid);
+                $info = is_object($info) ? $info->toArray() : $info;
             } catch (\Throwable $e) {
                 $info = [];
             }
             if (!$info) continue;
-            if ($info['subscribe'] == 1) {
-                $data['nickname'] = $info['nickname'] ?? '';
-                $data['headimgurl'] = $info['headimgurl'] ?? '';
-                $userInfoData = $this->setUserInfo($data);
-                if (!$userInfoData) {
-                    throw new AdminException('用户信息储存失败!');
-                }
-                $data['uid'] = $userInfoData['uid'];
-                $data['subscribe'] = $info['subscribe'];
-                $data['unionid'] = $info['unionid'] ?? '';
-                $data['openid'] = $info['openid'] ?? '';
-                $data['sex'] = $info['sex'] ?? 0;
-                $data['language'] = $info['language'] ?? '';
-                $data['city'] = $info['city'] ?? '';
-                $data['province'] = $info['province'] ?? '';
-                $data['country'] = $info['country'] ?? '';
-                $data['subscribe_time'] = $info['subscribe_time'] ?? '';
-                $data['groupid'] = $info['groupid'] ?? 0;
-                $data['remark'] = $info['remark'] ?? '';
-                $data['tagid_list'] = isset($info['tagid_list']) && $info['tagid_list'] ? implode(',', $info['tagid_list']) : '';
-                $data['add_time'] = $time;
-                $data['is_complete'] = 1;
-                $dataAll[] = $data;
+            $data['nickname'] = $info['nickname'] ?? '';
+            $data['headimgurl'] = $info['headimgurl'] ?? '';
+            $userInfoData = $this->setUserInfo($data);
+            if (!$userInfoData) {
+                throw new AdminException('用户信息储存失败!');
             }
+            $data['uid'] = $userInfoData['uid'];
+            $data['subscribe'] = $info['subscribe'] ?? 1;
+            $data['unionid'] = $info['unionid'] ?? '';
+            $data['openid'] = $info['openid'] ?? '';
+            $data['sex'] = $info['sex'] ?? 0;
+            $data['language'] = $info['language'] ?? '';
+            $data['city'] = $info['city'] ?? '';
+            $data['province'] = $info['province'] ?? '';
+            $data['country'] = $info['country'] ?? '';
+            $data['subscribe_time'] = $info['subscribe_time'] ?? '';
+            $data['groupid'] = $info['groupid'] ?? 0;
+            $data['remark'] = $info['remark'] ?? '';
+            $data['tagid_list'] = isset($info['tagid_list']) && $info['tagid_list'] ? implode(',', $info['tagid_list']) : '';
+            $data['add_time'] = $time;
+            $data['is_complete'] = 1;
+            $dataAll[] = $data;
         }
         if ($dataAll) {
             /** @var WechatUserServices $wechatUser */

+ 18 - 11
crmeb/app/services/wechat/WechatServices.php

@@ -79,13 +79,13 @@ class WechatServices extends BaseServices
     public function auth($spreadId, $login_type)
     {
         try {
-            $wechatInfo = WechatAuthService::oauthService()->user()->getOriginal();
+            $wechatInfo = WechatAuthService::oauth2Service()->oauth();
         } catch (\Exception $e) {
             throw new ValidateException('授权失败' . $e->getMessage() . 'line' . $e->getLine());
         }
         if (!isset($wechatInfo['nickname'])) {
-            $wechatInfo = WechatAuthService::getUserInfo($wechatInfo['openid']);
-            if (!$wechatInfo['subscribe'] && !isset($wechatInfo['nickname']))
+            $wechatInfo = WechatAuthService::oauth2Service()->getUserInfo($wechatInfo['openid'])->toArray();
+            if (!isset($wechatInfo['nickname']))
                 throw new ValidateException('授权失败');
             if (isset($wechatInfo['tagid_list']))
                 $wechatInfo['tagid_list'] = implode(',', $wechatInfo['tagid_list']);
@@ -129,13 +129,13 @@ class WechatServices extends BaseServices
     public function newAuth($spreadId, $login_type)
     {
         try {
-            $wechatInfo = WechatAuthService::oauthService()->user()->getOriginal();
+            $wechatInfo = WechatAuthService::oauth2Service()->oauth();
         } catch (\Exception $e) {
             throw new ValidateException('授权失败' . $e->getMessage() . 'line' . $e->getLine());
         }
         if (!isset($wechatInfo['nickname'])) {
-            $wechatInfo = WechatAuthService::getUserInfo($wechatInfo['openid']);
-            if (!$wechatInfo['subscribe'] && !isset($wechatInfo['nickname']))
+            $wechatInfo = WechatAuthService::oauth2Service()->getUserInfo($wechatInfo['openid'])->toArray();
+            if (!isset($wechatInfo['nickname']))
                 throw new ValidateException('授权失败');
             if (isset($wechatInfo['tagid_list']))
                 $wechatInfo['tagid_list'] = implode(',', $wechatInfo['tagid_list']);
@@ -210,8 +210,8 @@ class WechatServices extends BaseServices
      */
     public function silenceAuth($spread)
     {
-        $wechatInfoConfig = WechatAuthService::oauthService()->user()->getOriginal();
-        $wechatInfo = WechatAuthService::getUserInfo($wechatInfoConfig['openid'])->toArray();
+        $wechatInfoConfig = WechatAuthService::oauth2Service()->oauth();
+        $wechatInfo = WechatAuthService::oauth2Service()->getUserInfo($wechatInfoConfig['openid'])->toArray();
         $openid = $wechatInfoConfig['openid'];
         /** @var WechatUserServices $wechatUserServices */
         $wechatUserServices = app()->make(WechatUserServices::class);
@@ -258,9 +258,16 @@ class WechatServices extends BaseServices
      */
     public function silenceAuthNoLogin($spread)
     {
-        $wechatInfoConfig = WechatAuthService::oauthService()->user()->getOriginal();
-        $wechatInfo = WechatAuthService::getUserInfo($wechatInfoConfig['openid'])->toArray();
+        $wechatInfoConfig = WechatAuthService::oauth2Service()->oauth();
         $openid = $wechatInfoConfig['openid'];
+        try {
+            $wechatInfo = WechatAuthService::oauth2Service()->getUserInfo($wechatInfoConfig['openid'])->toArray();
+        } catch (\Throwable $e) {
+            $createData = [$openid, [], $spread, '', 'wechat'];
+            $userInfoKey = md5($openid . '_' . time() . '_wechat');
+            Cache::setTokenBucket($userInfoKey, $createData, 7200);
+            return ['auth_login' => 1, 'key' => $userInfoKey];
+        }
         /** @var WechatUserServices $wechatUserServices */
         $wechatUserServices = app()->make(WechatUserServices::class);
         $user = $wechatUserServices->getAuthUserInfo($openid, 'wechat');
@@ -328,7 +335,7 @@ class WechatServices extends BaseServices
     public function isSubscribe(int $uid)
     {
         if ($uid) {
-            $subscribe = $this->dao->value(['uid' => $uid], 'subscribe') ? true : false;
+            $subscribe = (bool)$this->dao->value(['uid' => $uid], 'subscribe');
         } else {
             $subscribe = true;
         }

+ 17 - 2
crmeb/app/services/wechat/WechatUserServices.php

@@ -123,8 +123,17 @@ class WechatUserServices extends BaseServices
     public function updateUser($openid)
     {
         $userInfo = WechatService::getUserInfo($openid);
-        $userInfo['tagid_list'] = implode(',', $userInfo['tagid_list']);
-        if (!$this->dao->update($openid, $userInfo->toArray(), 'openid'))
+        $userInfo = is_object($userInfo) ? $userInfo->toArray() : $userInfo;
+        if (isset($userInfo['nickname']) && $userInfo['nickname']) {
+            $userInfo['nickname'] = filter_emoji($userInfo['nickname']);
+        } else {
+            mt_srand();
+            $userInfo['nickname'] = 'wx' . rand(100000, 999999);
+        }
+        if (isset($userInfo['tagid_list'])) {
+            $userInfo['tagid_list'] = implode(',', $userInfo['tagid_list']);
+        }
+        if (!$this->dao->update($openid, $userInfo, 'openid'))
             throw new AdminException('更新失败');
         return true;
     }
@@ -137,6 +146,12 @@ class WechatUserServices extends BaseServices
     public function setNewUser($openid)
     {
         $userInfo = WechatService::getUserInfo($openid);
+        if (isset($userInfo['nickname']) && $userInfo['nickname']) {
+            $userInfo['nickname'] = filter_emoji($userInfo['nickname']);
+        } else {
+            mt_srand();
+            $userInfo['nickname'] = 'wx' . rand(100000, 999999);
+        }
         if (!isset($userInfo['subscribe']) || !$userInfo['subscribe'] || !isset($userInfo['openid']))
             throw new ValidateException('请关注公众号!');
         $userInfo = $userInfo->toArray();

+ 1 - 1
crmeb/crmeb/services/Mini3rdProgramService.php

@@ -13,7 +13,7 @@ namespace crmeb\services;
 
 use app\services\pay\PayNotifyServices;
 use crmeb\exceptions\ApiException;
-use EasyWeChat\Foundation\Application;
+use crmeb\services\easywechat\Application;
 use think\exception\ValidateException;
 use crmeb\utils\Hook;
 use think\Response;

+ 1 - 1
crmeb/crmeb/services/WechatOpenService.php

@@ -11,7 +11,7 @@
 
 namespace crmeb\services;
 
-use EasyWeChat\Foundation\Application;
+use crmeb\services\easywechat\Application;
 
 class WechatOpenService
 {

+ 13 - 1
crmeb/crmeb/services/WechatService.php

@@ -17,7 +17,7 @@ use app\services\wechat\WechatReplyServices;
 use crmeb\exceptions\AdminException;
 use app\services\pay\PayNotifyServices;
 use crmeb\utils\ApiErrorCode;
-use EasyWeChat\Foundation\Application;
+use crmeb\services\easywechat\Application;
 use EasyWeChat\Message\Article;
 use EasyWeChat\Message\Image;
 use EasyWeChat\Message\Material;
@@ -27,6 +27,7 @@ use EasyWeChat\Message\Video;
 use EasyWeChat\Message\Voice;
 use EasyWeChat\Payment\Order;
 use EasyWeChat\Server\Guard;
+use Symfony\Component\HttpFoundation\Request;
 use think\exception\ValidateException;
 use think\Response;
 use crmeb\utils\Hook;
@@ -242,6 +243,17 @@ class WechatService
         return self::application()->oauth;
     }
 
+    /**
+     * 网页授权
+     * @return easywechat\oauth2\wechat\WechatOauth2Provider
+     */
+    public static function oauth2Service()
+    {
+        $request = app()->request;
+        self::application()->oauth2->setRequest(new Request($request->get(), $request->post(), [], [], [], $request->server(), $request->getContent()));
+        return self::application()->oauth2;
+    }
+
     /**
      * 模板消息接口
      * @return \EasyWeChat\Notice\Notice

+ 46 - 0
crmeb/crmeb/services/easywechat/Application.php

@@ -0,0 +1,46 @@
+<?php
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+namespace crmeb\services\easywechat;
+
+
+use crmeb\services\easywechat\oauth2\wechat\WechatOauth2Provider;
+use crmeb\services\easywechat\wechatlive\ProgramProvider as LiveProgramProvider;
+
+
+/**
+ * Class Application
+ * @package crmeb\services\easywechat
+ * @property LiveProgramProvider $wechat_live
+ * @property WechatOauth2Provider $oauth2
+ */
+class Application extends \EasyWeChat\Foundation\Application
+{
+
+    /**
+     * @var string[]
+     */
+    protected $providersNew = [
+        LiveProgramProvider::class,
+        WechatOauth2Provider::class
+    ];
+
+    /**
+     * Application constructor.
+     * @param $config
+     */
+    public function __construct($config)
+    {
+        $this->providers = array_merge($this->providers, $this->providersNew);
+        parent::__construct($config);
+    }
+
+}

+ 282 - 0
crmeb/crmeb/services/easywechat/oauth2/wechat/WechatOauth.php

@@ -0,0 +1,282 @@
+<?php
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+namespace crmeb\services\easywechat\oauth2\wechat;
+
+use Doctrine\Common\Cache\Cache;
+use Doctrine\Common\Cache\FilesystemCache;
+use EasyWeChat\Core\AbstractAPI;
+use EasyWeChat\Core\AccessToken;
+use EasyWeChat\Core\Exceptions\HttpException;
+use EasyWeChat\Core\Http;
+use EasyWeChat\Support\Collection;
+use GuzzleHttp\Psr7\Uri;
+use Psr\Http\Message\RequestInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Class WechatOauth
+ * @package crmeb\services\easywechat\oauth\wechat
+ */
+class WechatOauth extends AbstractAPI
+{
+    /**
+     * 通过code获取网页授权access_token
+     */
+    const API_OAUTH_ACCESS_TOKEN = 'https://api.weixin.qq.com/sns/oauth2/access_token';
+
+    /**
+     * 检验授权凭证(access_token)是否有效
+     */
+    const API_OAUTH_CHECK_TOKEN = 'https://api.weixin.qq.com/sns/auth';
+
+    /**
+     * 刷新access_token
+     */
+    const API_OAUTH_REFRESH_TOKEN = 'https://api.weixin.qq.com/sns/oauth2/refresh_token';
+
+    /**
+     * 获取用户信息
+     */
+    const API_OAUTH_GET_USER_INFO = 'https://api.weixin.qq.com/sns/userinfo';
+
+
+    /**
+     * App ID.
+     *
+     * @var string
+     */
+    protected $appId;
+
+    /**
+     * App secret.
+     *
+     * @var string
+     */
+    protected $secret;
+
+    /**
+     * Cache.
+     *
+     * @var Cache
+     */
+    protected $cache;
+
+    protected $openid;
+
+    /**
+     * @var Request
+     */
+    protected $request;
+
+    /**
+     * Query name.
+     *
+     * @var string
+     */
+    protected $queryName = 'access_token';
+
+    /**
+     * Response Json key name.
+     *
+     * @var string
+     */
+    protected $tokenJsonKey = 'access_token';
+
+
+    /**
+     * Response Json key name.
+     *
+     * @var string
+     */
+    protected $refreshTokenJsonKey = 'refresh_token';
+
+    /**
+     * Cache key prefix.
+     *
+     * @var string
+     */
+    protected $prefix = 'easywechat.common.oauth.access_token.';
+
+    /**
+     * WechatOauth constructor.
+     * @param AccessToken $accessToken
+     * @param $appId
+     * @param $appSecret
+     */
+    public function __construct(AccessToken $accessToken, $appId, $appSecret)
+    {
+        parent::__construct($accessToken);
+        $this->appId = $appId;
+        $this->secret = $appSecret;
+    }
+
+    /**
+     * @param Request $request
+     * @return $this
+     */
+    public function setRequest(Request $request)
+    {
+        $this->request = $request;
+
+        return $this;
+    }
+
+    /**
+     * 获取code
+     * @return mixed
+     */
+    public function getCode()
+    {
+        return $this->request->get('code');
+    }
+
+    /**
+     * 授权获取token
+     * @param string $code
+     * @return false|mixed
+     * @throws HttpException
+     */
+    public function oauth(string $code = '')
+    {
+        $params = [
+            'appid' => $this->appId,
+            'secret' => $this->secret,
+            'code' => $code ?: $this->getCode(),
+            'grant_type' => 'authorization_code',
+        ];
+
+        $http = new Http();
+
+        $token = $http->parseJSON($http->get(self::API_OAUTH_ACCESS_TOKEN, $params));
+
+        if (empty($token[$this->tokenJsonKey])) {
+            throw new HttpException('Request AccessToken fail. response: ' . json_encode($token, JSON_UNESCAPED_UNICODE));
+        }
+        $this->setCache($token);
+
+        return $token;
+    }
+
+    /**
+     * 刷新token
+     * @param string $refresh_token
+     * @return false|mixed
+     * @throws HttpException
+     */
+    public function refreshToken(string $refresh_token)
+    {
+        $params = [
+            'appid' => $this->appId,
+            'refresh_token' => $refresh_token,
+            'grant_type' => 'refresh_token',
+        ];
+
+        $http = new Http();
+
+        $token = $http->parseJSON($http->get(self::API_OAUTH_REFRESH_TOKEN, $params));
+
+        if (empty($token[$this->tokenJsonKey])) {
+            throw new HttpException('Request AccessToken fail. response: ' . json_encode($token, JSON_UNESCAPED_UNICODE));
+        }
+        $this->setCache($token);
+
+        return $token;
+    }
+
+    /**
+     * 获取用户信息
+     * @param $openId
+     * @param string $lang
+     * @return Collection|null
+     * @throws HttpException
+     */
+    public function getUserInfo($openId, $lang = 'zh_CN')
+    {
+        $params = [
+            'openid' => $openId,
+            'lang' => $lang,
+        ];
+        $this->openid = $openId;
+        return $this->parseJSON('get', [self::API_OAUTH_GET_USER_INFO, $params]);
+    }
+
+    /**
+     * 获取token
+     * @param false $forceRefresh
+     * @return bool|mixed|string
+     * @throws HttpException
+     */
+    public function getToken($forceRefresh = false)
+    {
+        $cacheKey = $this->prefix;
+        $cached = $this->getCache()->fetch($cacheKey . $this->tokenJsonKey . $this->openid);
+
+        if ($forceRefresh || !$cached) {
+            $refreshCached = $this->getCache()->fetch($cacheKey . $this->refreshTokenJsonKey . $this->openid);
+            if ($refreshCached) {
+                $token = $this->refreshToken($refreshCached);
+
+                return $token[$this->tokenJsonKey];
+            }
+            return '';
+        }
+
+        return $cached;
+    }
+
+    /**
+     * 保存token信息
+     * @param $token
+     * @return bool
+     */
+    public function setCache($token)
+    {
+        $cacheKey = $this->prefix;
+        // XXX: T_T... 7200 - 1500
+        $this->getCache()->save($cacheKey . $this->tokenJsonKey . $token['openid'], $token[$this->tokenJsonKey], $token['expires_in'] - 1500);
+        $this->getCache()->save($cacheKey . $this->refreshTokenJsonKey . $token['openid'], $token[$this->refreshTokenJsonKey], 30 * 24 * 3600);
+        return true;
+    }
+
+    /**
+     * Return the cache manager.
+     *
+     * @return \Doctrine\Common\Cache\Cache
+     */
+    public function getCache()
+    {
+        return $this->cache ?: $this->cache = new FilesystemCache(sys_get_temp_dir());
+    }
+
+    /**
+     * Attache access token to request query.
+     *
+     * @return \Closure
+     */
+    protected function accessTokenMiddleware()
+    {
+        return function (callable $handler) {
+            return function (RequestInterface $request, array $options) use ($handler) {
+                $token = $this->getToken();
+                if (!$token) {
+                    return $handler($request, $options);
+                }
+
+                $request = $request->withUri(Uri::withQueryValue($request->getUri(), $this->queryName, $token));
+
+                return $handler($request, $options);
+            };
+        };
+    }
+
+
+}

+ 51 - 0
crmeb/crmeb/services/easywechat/oauth2/wechat/WechatOauth2Provider.php

@@ -0,0 +1,51 @@
+<?php
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+namespace crmeb\services\easywechat\oauth2\wechat;
+
+
+use crmeb\services\SystemConfigService;
+use Pimple\Container;
+use Pimple\ServiceProviderInterface;
+use think\facade\Request;
+
+/**
+ * 微信网页授权
+ * Class WechatOauthProvider
+ * @package crmeb\services\easywechat\oauth\wechat
+ * @method oauth(string $code = '') code授权获取acces_token openid
+ * @method getUserInfo($openId, $lang = 'zh_CN') openid 获取用户信息
+ * @method  setRequest(Request $request) 设置request对象
+ */
+class WechatOauth2Provider implements ServiceProviderInterface
+{
+
+    /**
+     *
+     * @param Container $pimple
+     */
+    public function register(Container $pimple)
+    {
+        $request = app('request');
+        $wechat = SystemConfigService::more(['wechat_appid', 'wechat_app_appid', 'wechat_app_appsecret', 'wechat_appsecret']);
+        if ($request->isApp()) {
+            $appId = isset($wechat['wechat_app_appid']) ? trim($wechat['wechat_app_appid']) : '';
+            $appsecret = isset($wechat['wechat_app_appsecret']) ? trim($wechat['wechat_app_appsecret']) : '';
+        } else {
+            $appId = isset($wechat['wechat_appid']) ? trim($wechat['wechat_appid']) : '';
+            $appsecret = isset($wechat['wechat_appsecret']) ? trim($wechat['wechat_appsecret']) : '';
+        }
+
+        $pimple['oauth2'] = function ($pimple) use ($appId, $appsecret) {
+            return new WechatOauth($pimple['access_token'], $appId, $appsecret);
+        };
+    }
+}

Різницю між файлами не показано, бо вона завелика
+ 1 - 1
crmeb/public/index.html


Різницю між файлами не показано, бо вона завелика
+ 13 - 0
crmeb/public/static/js/chunk-vendors.b7cab945.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 13
crmeb/public/static/js/chunk-vendors.fd05f392.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/index.32c09daf.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/index.9482f767.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-bargain-index.37c4d0d3.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-bargain-index.df522947.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-goods_bargain-index.5758140d.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-goods_bargain-index.9b7ccf32.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-goods_bargain_details-index.52438a66.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-goods_bargain_details-index.84c32ef9.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 1
crmeb/public/static/js/pages-activity-goods_bargain_details-index~pages-activity-lottery-grids-index~pages-activity-poster-~59f8c0c8.d3587983.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-goods_bargain_details-index~pages-goods_details-index~pages-news_details-index~pages-~d556e4a9.3559ff83.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-goods_bargain_details-index~pages-goods_details-index~pages-news_details-index~pages-~d556e4a9.c6515345.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-goods_combination-index.76499e34.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-goods_combination-index.991df445.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-goods_combination_details-index.493cb223.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-goods_combination_details-index.a5ee3c23.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-goods_combination_details-index~pages-activity-goods_combination_status-index~pages-a~b3ca01d9.5ddaa6bc.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-goods_combination_details-index~pages-activity-goods_seckill_details-index~pages-acti~9fd5f6c0.05e9e40d.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-goods_combination_details-index~pages-activity-goods_seckill_details-index~pages-acti~9fd5f6c0.1a09a0c2.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-goods_combination_status-index.6399a9aa.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-goods_combination_status-index.c37a01a3.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-goods_seckill-index.9b30e225.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-goods_seckill-index.d2c21541.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-goods_seckill_details-index.cfd3a0ce.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-goods_seckill_details-index.ff017a2c.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-lottery-grids-index.c1cfd395.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-lottery-grids-index.c719a8be.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-lottery-grids-index~pages-order_pay_status-index~pages-order_pay_status-payLottery~pa~4af4e820.69ff628b.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-lottery-grids-index~pages-order_pay_status-index~pages-order_pay_status-payLottery~pa~4af4e820.6f010ff0.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-lottery-grids-record.65d55021.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-lottery-grids-record.f77fab82.js


+ 1 - 1
crmeb/public/static/js/pages-activity-lottery-grids-record~pages-activity-presell_details-index~pages-goods_details-index~p~0dc3edf2.b3fafd5e.js

@@ -1,4 +1,4 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["pages-activity-lottery-grids-record~pages-activity-presell_details-index~pages-goods_details-index~p~0dc3edf2"],{fd65:function(t,e,n){n("a4d3"),n("e01a"),n("d28b"),n("944a"),n("4160"),n("d81d"),n("fb6a"),n("0c47"),n("23dc"),n("3410"),n("131a"),n("d3b7"),n("25f0"),n("3ca3"),n("159b"),n("ddb0"),
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["pages-activity-lottery-grids-record~pages-activity-presell_details-index~pages-goods_details-index~p~0dc3edf2"],{"912e":function(t,e,n){n("a4d3"),n("e01a"),n("d28b"),n("944a"),n("4160"),n("d81d"),n("fb6a"),n("0c47"),n("23dc"),n("3410"),n("131a"),n("d3b7"),n("25f0"),n("3ca3"),n("159b"),n("ddb0"),
 /*!
  * clipboard.js v2.0.6
  * https://clipboardjs.com/

Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-poster-poster-index.8923dd67.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-poster-poster-index.f0448250.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-presell-index.02068e9f.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-presell-index.d82f9b81.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-presell_details-index.15c7049a.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-activity-presell_details-index.52e23816.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-activity-presell_details-index~pages-goods_details-index.a5e2148c.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-admin-order_cancellation-index.8f838265.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-admin-order_cancellation-index.d66b5491.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-annex-offline_pay-index.68f055f5.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-annex-offline_pay-index.ac77a31a.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-annex-offline_result-index.08d4e5fb.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-annex-offline_result-index.e4a9f875.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-annex-web_view-index.17af7125.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-annex-web_view-index.6cd0a1a6.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-auth-index.1c2408a2.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-auth-index.4d33604c.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-columnGoods-HotNewGoods-feedback.cd351ed4.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-columnGoods-HotNewGoods-feedback.f0b4c0b8.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-columnGoods-HotNewGoods-index.5433b1ea.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-columnGoods-HotNewGoods-index.9ebb15da.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-customer_list-chat.4964d5d2.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-customer_list-chat.d6df98df.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-customer_list-index.9e687056.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-customer_list-index.ccf96a6e.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-goods_cate-goods_cate.99c1f407.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-goods_cate-goods_cate.ed486463.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-goods_details-index.b94681d5.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-goods_details-index.c3ac1293.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-goods_list-index.613e47d6.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-goods_list-index.9f43ff0f.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-goods_list-index~pages-points_mall-integral_goods_list.02478ea9.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-goods_list-index~pages-points_mall-integral_goods_list.fe3e4789.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-goods_search-index.38cdef2c.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-goods_search-index.883f84f2.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-index-index.37871fba.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-index-index.bddf71f1.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-live_list-index.2a20e2b8.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-live_list-index.60554f23.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-news_details-index.28b73856.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-news_details-index.c5d7d74b.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-news_list-index.df21eec7.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-news_list-index.f1f16712.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-order_addcart-order_addcart.23cf5aef.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-order_addcart-order_addcart.b9bd1fbe.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-order_pay_status-index.6fe78013.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-order_pay_status-index.fff4059a.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-order_pay_status-payLottery.accbc5f6.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-order_pay_status-payLottery.eb30f6fa.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-points_mall-exchange_record.5a607353.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-points_mall-exchange_record.786a7420.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-points_mall-index.952721fb.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-points_mall-index.d76afaef.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
crmeb/public/static/js/pages-points_mall-integral_goods_details.16ce9650.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1
crmeb/public/static/js/pages-points_mall-integral_goods_details.26d75bc6.js


+ 0 - 0
crmeb/public/static/js/pages-points_mall-integral_goods_list.1fdfa4a5.js


Деякі файли не було показано, через те що забагато файлів було змінено