QrcodeStatService.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <?php
  2. namespace addons\Wechat\services;
  3. use Yii;
  4. use Exception;
  5. use common\helpers\ArrayHelper;
  6. use common\components\Service;
  7. use common\enums\AccessTokenGroupEnum;
  8. use common\enums\MemberTypeEnum;
  9. use addons\Wechat\common\models\Qrcode;
  10. use addons\Wechat\common\models\QrcodeStat;
  11. use addons\Wechat\common\enums\QrcodeStatTypeEnum;
  12. use addons\Wechat\common\enums\WechatEnum;
  13. /**
  14. * Class QrcodeStatService
  15. * @package addons\Wechat\services
  16. * @author jianyan74 <751393839@qq.com>
  17. */
  18. class QrcodeStatService extends Service
  19. {
  20. /**
  21. * 判断二维码扫描事件
  22. *
  23. * @param array $message 微信消息
  24. * @return bool|mixed
  25. */
  26. public function scan($message)
  27. {
  28. // 关注事件
  29. if ($message['Event'] == WechatEnum::EVENT_SUBSCRIBE && !empty($message['Ticket'])) {
  30. if ($qrCode = Yii::$app->wechatService->qrcode->findByWhere(['ticket' => trim($message['Ticket'])])) {
  31. $this->create($qrCode, $message['FromUserName'], QrcodeStatTypeEnum::ATTENTION);
  32. return $qrCode['keyword'];
  33. }
  34. }
  35. if (!isset($message['EventKey'])) {
  36. return false;
  37. }
  38. // 扫描事件
  39. $where = ['scene_str' => $message['EventKey']];
  40. if (is_numeric($message['EventKey'])) {
  41. $where = ['scene_id' => $message['EventKey']];
  42. }
  43. if ($qrCode = Yii::$app->wechatService->qrcode->findByWhere($where)) {
  44. Qrcode::updateAllCounters(['scan_num' => 1], ['id' => $qrCode['id']]);
  45. $this->create($qrCode, $message['FromUserName'], QrcodeStatTypeEnum::SCAN);
  46. // 触发绑定/登录
  47. if (
  48. !empty($qrCode['extend']) &&
  49. !empty($qrCode['extend']['type'])
  50. ) {
  51. $member = Yii::$app->services->member->findById($qrCode['extend']['member_id']);
  52. $remind = [
  53. 'time' => date('Y-m-d H:i:s'),
  54. 'member' => !empty($member) ? $member : []
  55. ];
  56. // 修改openid
  57. Qrcode::updateAll([
  58. 'extend' => ArrayHelper::merge($qrCode['extend'], [
  59. 'openid' => $message['FromUserName']
  60. ])
  61. ], ['id' => $qrCode['id']]);
  62. switch ($qrCode['extend']['type']) {
  63. // 绑定
  64. case 'binding' :
  65. if (
  66. !empty($oldOauth = Yii::$app->services->memberAuth->findOauthClient(AccessTokenGroupEnum::WECHAT_MP, $message['FromUserName'], $member->type)) &&
  67. !empty($oldMember = $oldOauth->member)
  68. ) {
  69. throw new Exception('绑定失败, 您已绑定账号 ' . $oldMember->username . ', 请先解绑', 200);
  70. }
  71. if (empty(Yii::$app->services->memberAuth->findByMemberIdOauthClient(AccessTokenGroupEnum::WECHAT_MP, $member->id))) {
  72. Yii::$app->services->memberAuth->create([
  73. 'member_id' => $member->id,
  74. 'member_type' => $member->type,
  75. 'merchant_id' => $member->merchant_id,
  76. 'store_id' => $member->store_id,
  77. 'nickname' => $member->username,
  78. 'oauth_client' => AccessTokenGroupEnum::WECHAT_MP,
  79. 'oauth_client_user_id' => $message['FromUserName'],
  80. ]);
  81. throw new Exception(ArrayHelper::recursionGetVal($qrCode['extend']['remind']['success'], $remind), 200);
  82. }
  83. throw new Exception(ArrayHelper::recursionGetVal($qrCode['extend']['remind']['error'], $remind), 200);
  84. break;
  85. // 总后台登录
  86. case 'login' :
  87. $auth = Yii::$app->services->memberAuth->findOauthClient(AccessTokenGroupEnum::WECHAT_MP, $message['FromUserName'], MemberTypeEnum::MANAGER);
  88. if ($auth) {
  89. throw new Exception(ArrayHelper::recursionGetVal($qrCode['extend']['remind']['success'], $remind), 200);
  90. }
  91. throw new Exception(ArrayHelper::recursionGetVal($qrCode['extend']['remind']['error'], $remind), 200);
  92. break;
  93. // 总后台登录
  94. case 'merchantLogin' :
  95. $auth = Yii::$app->services->memberAuth->findOauthClient(AccessTokenGroupEnum::WECHAT_MP, $message['FromUserName'], MemberTypeEnum::MERCHANT);
  96. if ($auth) {
  97. throw new Exception(ArrayHelper::recursionGetVal($qrCode['extend']['remind']['success'], $remind), 200);
  98. }
  99. throw new Exception(ArrayHelper::recursionGetVal($qrCode['extend']['remind']['error'], $remind), 200);
  100. break;
  101. }
  102. }
  103. return $qrCode['keyword'];
  104. }
  105. return false;
  106. }
  107. /**
  108. * 插入扫描记录
  109. *
  110. * @param Qrcode $qrCode
  111. * @param $openid
  112. * @param $type
  113. */
  114. public function create($qrCode, $openid, $type)
  115. {
  116. $model = new QrcodeStat();
  117. $model->attributes = ArrayHelper::toArray($qrCode);
  118. $model->qrcord_id = $qrCode->id;
  119. $model->openid = $openid;
  120. $model->type = $type;
  121. !$model->save() && $this->error($model);
  122. }
  123. }
粤ICP备19079148号