diff --git a/packages/core/src/connectors/wechat/index.test.ts b/packages/core/src/connectors/wechat/index.test.ts index dfbc313d6..abe61cb10 100644 --- a/packages/core/src/connectors/wechat/index.test.ts +++ b/packages/core/src/connectors/wechat/index.test.ts @@ -43,7 +43,7 @@ describe('getAccessToken', () => { nock(accessTokenEndpointUrl.origin) .get(accessTokenEndpointUrl.pathname) .query(parameters) - .reply(0, { + .reply(200, { access_token: 'access_token', openid: 'openid', }); @@ -56,7 +56,7 @@ describe('getAccessToken', () => { nock(accessTokenEndpointUrl.origin) .get(accessTokenEndpointUrl.pathname) .query(parameters) - .reply(0, {}); + .reply(200, {}); await expect(getAccessToken('code')).rejects.toMatchError( new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid) ); @@ -98,10 +98,7 @@ describe('getUserInfo', () => { }); it('throws SocialAccessTokenInvalid error if remote response code is 40001', async () => { - nock(userInfoEndpointUrl.origin) - .get(userInfoEndpointUrl.pathname) - .query(parameters) - .reply(40_001); + nock(userInfoEndpointUrl.origin).get(userInfoEndpointUrl.pathname).query(parameters).reply(401); await expect( getUserInfo({ accessToken: 'accessToken', openid: 'openid' }) ).rejects.toMatchError(new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid)); @@ -116,7 +113,7 @@ describe('getUserInfo', () => { nock(userInfoEndpointUrl.origin) .get(userInfoEndpointUrl.pathname) .query(parameters) - .reply(0, { errcode: 40_003, errmsg: 'invalid openid' }); + .reply(200, { errcode: 40_003, errmsg: 'invalid openid' }); await expect( getUserInfo({ accessToken: 'accessToken', openid: 'openid' }) ).rejects.toMatchError(new Error('invalid openid')); diff --git a/packages/core/src/connectors/wechat/index.ts b/packages/core/src/connectors/wechat/index.ts index f117f68cb..47107b167 100644 --- a/packages/core/src/connectors/wechat/index.ts +++ b/packages/core/src/connectors/wechat/index.ts @@ -74,24 +74,32 @@ export const getAuthorizationUri: GetAuthorizationUri = async (redirectUri, stat export const getAccessToken: GetAccessToken = async (code) => { type AccessTokenResponse = { - access_token: string; - openid: string; - expires_in: number; // In seconds - refresh_token: string; - scope: string; + access_token?: string; + openid?: string; + expires_in?: number; // In seconds + refresh_token?: string; + scope?: string; + errcode?: number; }; const config = await getConnectorConfig(metadata.id); const { appId: appid, appSecret: secret } = config; - const { access_token: accessToken, openid } = await got + const { + access_token: accessToken, + openid, + errcode, + } = await got .get(accessTokenEndpoint, { searchParams: { appid, secret, code, grant_type: 'authorization_code' }, timeout: await getConnectorRequestTimeout(), }) .json(); - assertThat(accessToken && openid, new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)); + assertThat( + errcode !== 40_029 && accessToken && openid, + new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid) + ); return { accessToken, openid }; }; @@ -131,7 +139,7 @@ export const getUserInfo: GetUserInfo = async (accessTokenObject) => { return { id: unionid ?? openid, avatar: headimgurl, name: nickname }; } catch (error: unknown) { - if (error instanceof GotRequestError && error.response?.statusCode === 40_001) { + if (error instanceof GotRequestError && error.response?.statusCode === 401) { throw new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid); }