Apple.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <?php
  2. namespace addons\shopro\service\third\apple;
  3. use app\common\library\Auth;
  4. use addons\shopro\service\user\UserAuth;
  5. use app\admin\model\shopro\ThirdOauth;
  6. class Apple
  7. {
  8. public function __construct()
  9. {
  10. }
  11. /**
  12. * AppleId登陆
  13. *
  14. * @return array
  15. */
  16. public function login($payload)
  17. {
  18. $identityToken = $payload['identityToken'];
  19. $openId = $payload['openId'];
  20. $appleSignInPayload = \AppleSignIn\ASDecoder::getAppleSignInPayload($identityToken);
  21. $isValid = $appleSignInPayload->verifyUser($openId);
  22. if (!$isValid) return false;
  23. $nickname = '';
  24. if (!empty($payload['fullName'])) {
  25. $hasFamilyName = !empty($payload['fullName']['familyName']);
  26. $nickname = ($hasFamilyName ? $payload['fullName']['familyName'] : '') . ($hasFamilyName ? ' ' : '') . $payload['fullName']['giveName'];
  27. }
  28. $appleUser = [
  29. 'openid' => $openId,
  30. 'nickname' => $nickname,
  31. 'avatar' => ''
  32. ];
  33. $oauthInfo = $this->createOrUpdateOauthInfo($appleUser);
  34. if (!$oauthInfo->user_id) {
  35. $this->registerOrBindUser($oauthInfo);
  36. }
  37. $auth = Auth::instance();
  38. $ret = $auth->direct($oauthInfo->user_id);
  39. if ($ret) {
  40. $oauthInfo->login_num += 1;
  41. set_token_in_header($auth->getToken());
  42. return true;
  43. } else {
  44. $oauthInfo->user_id = 0;
  45. $oauthInfo->save();
  46. return false;
  47. }
  48. }
  49. /**
  50. * 创建/更新用户认证信息
  51. *
  52. * @return think\Model
  53. */
  54. private function createOrUpdateOauthInfo($appleUser)
  55. {
  56. $oauthInfo = ThirdOauth::where([
  57. 'openid' => $appleUser['openid'],
  58. 'provider' => 'apple',
  59. 'platform' => 'App'
  60. ])->find();
  61. if (!$oauthInfo) { // 创建新的third_oauth条目
  62. $appleUser['provider'] = 'apple';
  63. $appleUser['platform'] = 'App';
  64. ThirdOauth::create($appleUser);
  65. $oauthInfo = ThirdOauth::where([
  66. 'openid' => $appleUser['openid'],
  67. 'provider' => 'apple',
  68. 'platform' => 'App'
  69. ])->find();
  70. }
  71. if ($oauthInfo) { // 更新授权信息
  72. $oauthInfo->save($appleUser);
  73. }
  74. return $oauthInfo;
  75. }
  76. /**
  77. * 注册/绑定用户
  78. *
  79. * @return think\Model
  80. */
  81. private function registerOrBindUser($oauthInfo, $user_id = 0)
  82. {
  83. if ($oauthInfo->user_id) {
  84. error_stop('该账号已绑定其他用户');
  85. }
  86. if ($user_id === 0) { // 注册新用户
  87. $user = (new UserAuth())->register([
  88. 'nickname' => $oauthInfo->nickname,
  89. 'avatar' => $oauthInfo->avatar,
  90. ]);
  91. $user_id = $user->id;
  92. }
  93. $oauthInfo->user_id = $user_id;
  94. return $oauthInfo->save();
  95. }
  96. }