[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-75709":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":12,"openIssues":13,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":15,"stars30d":16,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":17,"rankGlobal":8,"rankLanguage":8,"license":8,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":18,"topics":21,"createdAt":8,"pushedAt":8,"updatedAt":22,"readmeContent":23,"aiSummary":24,"trendingCount":14,"starSnapshotCount":14,"syncStatus":25,"lastSyncTime":26,"discoverSource":27},75709,"Gopay_plus_automatic","ywnd1144\u002FGopay_plus_automatic","ywnd1144",null,"Python",1315,637,3,5,0,4,838,21.41,false,"main",true,[],"2026-06-12 02:03:35","﻿# GoPay Plus 自动订阅机\r\n\r\n[![GitHub](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGitHub-Gopay__plus__automatic-blue?logo=github)](https:\u002F\u002Fgithub.com\u002Fywnd1144\u002FGopay_plus_automatic)\r\n[![Stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fywnd1144\u002FGopay_plus_automatic?style=social)](https:\u002F\u002Fgithub.com\u002Fywnd1144\u002FGopay_plus_automatic)\r\n\r\n> 项目地址：\u003Chttps:\u002F\u002Fgithub.com\u002Fywnd1144\u002FGopay_plus_automatic>\r\n\r\n全自动 ChatGPT Plus 订阅工具。给定一个 ChatGPT `access_token`，本项目会在 **约 20 秒** 内通过 Stripe → Midtrans → GoPay 的 tokenization 支付链路自动完成 0 元首月订阅。\r\n\r\n> ⚠️ **此项目将不会再进行更新，仅供研究、娱乐、学习，有能力者自行二开。**\r\n\r\n**声明**：项目作者与任何渠道方无关，也不从事相关的服务行为。此项目仅为开源共享交流，研究仅为个人兴趣爱好。本项目为**免费开源**，收费售卖者自重。问题请发邮箱 `links-to@outlook.com`。作者不对任何使用者的行为负责，该项目仅供学习交流。\r\n\r\n**不建议没有基础的用户自己部署**，请使用 GPT \u002F Claude 的高级模型辅助部署，并根据具体场景调整。如果你只是想看看效果，推荐先用 `manual` 模式跑一次单号，确认链路打通再谈批量。\r\n\r\n---\r\n\r\n## 目录\r\n\r\n1. [它能做什么](#它能做什么)\r\n2. [当前风控现状（必读）](#当前风控现状必读)\r\n3. [使用前要准备什么](#使用前要准备什么)\r\n4. [架构说明](#架构说明)\r\n5. [安装步骤（从零开始）](#安装步骤从零开始)\r\n6. [配置说明](#配置说明)\r\n7. [使用方法](#使用方法)\r\n8. [三种 OTP 接收方案](#三种-otp-接收方案)\r\n9. [生产部署（systemd 自启动）](#生产部署systemd-自启动)\r\n10. [常见问题](#常见问题)\r\n11. [项目结构](#项目结构)\r\n12. [免责声明](#免责声明)\r\n\r\n---\r\n\r\n## 它能做什么\r\n\r\n- 输入一个 ChatGPT `access_token`\r\n- 自动创建 IDR（印尼盾）订阅订单\r\n- 自动通过 Stripe + Midtrans + GoPay tokenization 完成付款\r\n- 自动接收并填写 OTP 验证码\r\n- 自动输入 GoPay PIN\r\n- 自动验证订阅状态\r\n- 最终结果：该账号变成 ChatGPT Plus（0 元首月试用）\r\n\r\n整个过程约 20 秒，全程无人工干预（配置好之后）。支持单号调试、多号批量、并发订阅。\r\n\r\n---\r\n\r\n## 当前风控现状（必读）\r\n\r\n这部分必须先看，否则跑起来碰到风控你会以为是代码 bug。\r\n\r\n### 1. CDN 层面的 \"There's a technical error\"\r\n\r\n遇到 `There's a technical error. Don't worry, we're working on it. Please try again.` 时，这是 Cloudflare 对 Midtrans linking 端点的限流。\r\n\r\n**绕过方式**：项目根目录 `429\u002F` 文件夹提供了基于 Chrome 指纹浏览器的绕过脚本（通过浏览器直接跑 linking，避免 SDK 指纹），多数情况下也可以通过**多次点击重试**触发 CDN 放行。\r\n\r\n> 注：该脚本不在本仓库主流程中，仅作备用工具。\r\n\r\n### 2. Midtrans 反欺诈（fraud_status=deny）\r\n\r\n当订阅返回 `charge: fraud_status=deny` 或出现 `Failed to proceed to GoPay. Please place your order again`：\r\n\r\n- 这是 **Midtrans 对虚拟号\u002F同一用户短时间内多次 linking 的反欺诈拦截**\r\n- 触发后**该号已无法再用于 GoPay 支付**，请换号\r\n- 正常使用（一号一订阅）不会触发\r\n- 调试阶段反复跑同一个号会触发，等几小时 ~ 1 天可恢复\r\n\r\n### 3. 一号多绑已受限\r\n\r\n截止到 2026-05-12，单个 GoPay 号多绑 Plus 已行不通，目前实测最多能绑 1~3 个账号。两种策略：\r\n\r\n- **一号一绑（推荐）**：每个 GoPay 号只绑一个 ChatGPT 账号，无需 WhatsApp，用 SMS 接码即可\r\n- **一号多绑**：在虚拟手机号期限内（一般接码平台号能保 10~60 分钟）多次接码多次绑定，或注册 WhatsApp 使用 WhatsApp OTP，但 WhatsApp 封号风险较大\r\n\r\n### 4. IP 出口要求\r\n\r\n- **必须**是日本出口 IP（实测 100% 可通过 ChatGPT 地区校验）或中国台湾地区 IP\r\n- 其他地区的代理拿不到 Plus 订阅资格\r\n\r\n### 5. 账号邮箱要求\r\n\r\n目前已知可获取 Plus 资格的邮箱类型：\r\n\r\n- Outlook \u002F Hotmail\r\n- 域名邮箱（前提：需要给子域名加 `edu` 前缀，例如原域名 `abc.com`，需用 `edu.abc.com` 的邮箱）\r\n\r\n### 6. GoPay \u002F Gojek 账号需要自己注册\r\n\r\n本项目**不**自动化 GoPay\u002FGojek 的注册（自动化注册难度过高）。你需要：\r\n\r\n1. 用印尼虚拟号在接码平台买号\r\n2. 手动注册 Gojek \u002F GoPay（或用模拟器）\r\n3. 设置 6 位 PIN\r\n4. 拿到 \"手机号 + PIN\" 作为本项目的输入\r\n\r\n### 7. 支付链路状态\r\n\r\n- **支付链路百分百可行**，已在生产环境多次验证。\r\n- 支付失败（不是脚本错误）几乎都是：号状态异常、IP 被风控、账号侧触发反欺诈。\r\n\r\n---\r\n\r\n## 使用前要准备什么\r\n\r\n| 项目 | 说明 | 如何获取 |\r\n|---|---|---|\r\n| Linux 服务器 | 推荐 Debian \u002F Ubuntu，1 核 1G 即可 | 任意云服务商 |\r\n| Python | 3.10 及以上 | `apt install python3 python3-pip` |\r\n| Node.js | 18+（**仅 `whatsapp` 模式需要**） | NodeSource 源 |\r\n| SOCKS5 代理 | **日本**出口 IP | 自建 \u002F 购买 |\r\n| GoPay 账号 | 印尼号 + 6 位 PIN（**必须已开启 PIN**，否则无法支付） | 虚拟号 + Gojek APP 注册 |\r\n| ChatGPT access_token | 要订阅的账号凭证 | 见下文 |\r\n\r\n### 如何获取 access_token\r\n\r\n1. 用浏览器登录 \u003Chttps:\u002F\u002Fchatgpt.com>\r\n2. 地址栏访问 \u003Chttps:\u002F\u002Fchatgpt.com\u002Fapi\u002Fauth\u002Fsession>\r\n3. 页面返回 JSON，找到 `accessToken` 字段\r\n4. 复制它的值（以 `eyJ` 开头的一长串，通常 1000+ 字符）\r\n5. 这就是 `access_token`\r\n\r\n> `access_token` 有效期约 24 小时，过期需重新获取。\r\n\r\n### 如何注册 GoPay 账号\r\n\r\n1. 在接码平台（HeroSMS \u002F 5sim \u002F sms-activate 等）买一个印尼手机号\r\n2. 下载 Gojek APP（或用模拟器 MuMu \u002F 雷电等）\r\n3. 用该印尼号注册 Gojek 账号\r\n4. 注册过程会收到 SMS 验证码（从接码平台获取）\r\n5. 在 APP 内设置 GoPay PIN（6 位数字；**强烈建议所有号统一用同一个 PIN**，方便批量）\r\n6. 记录：`手机号 + PIN`\r\n\r\n批量订阅就重复上面步骤，准备多个 `手机号 + PIN` 对。\r\n\r\n---\r\n\r\n## 架构说明\r\n\r\n项目由 3 个服务组成：\r\n\r\n```\r\n                    用户请求\r\n                       |\r\n                       v\r\n+--------------------------------------------------+\r\n|  orchestrator（编排器）        监听 :8800         |\r\n|  接收 \u002Fsubscribe 请求，协调整个流程              |\r\n+--------------------------------------------------+\r\n           |                           |\r\n           v                           v\r\n+-------------------+        +-------------------+\r\n| plus_gopay_links  |        |  OTP 来源          |\r\n| 支付核心（gRPC）   |        |  (三选一)         |\r\n| 监听 :50051       |        |                   |\r\n| 执行完整支付流程   |        |  1. manual        |\r\n|                   |        |  2. sms_api       |\r\n|                   |        |  3. whatsapp      |\r\n+-------------------+        +-------------------+\r\n```\r\n\r\n你不需要关心内部流程，只需：\r\n\r\n1. 配好 `config.json`\r\n2. 启动两个服务（WhatsApp 模式多一个）\r\n3. 通过 HTTP 调 `\u002Fsubscribe`\r\n\r\n---\r\n\r\n## 安装步骤（从零开始）\r\n\r\n### 第一步：准备服务器\r\n\r\n```bash\r\n# 以 root 登录 Linux 服务器\r\napt update && apt upgrade -y\r\n\r\n# 安装 Python\r\napt install -y python3 python3-pip curl git\r\n\r\n# 可选：仅 whatsapp 模式需要\r\ncurl -fsSL https:\u002F\u002Fdeb.nodesource.com\u002Fsetup_18.x | bash -\r\napt install -y nodejs\r\n```\r\n\r\n### 第二步：拉取项目\r\n\r\n```bash\r\ncd \u002Fopt\r\ngit clone https:\u002F\u002Fgithub.com\u002Fywnd1144\u002FGopay_plus_automatic.git gopay-plus\r\ncd gopay-plus\r\n```\r\n\r\n### 第三步：安装 Python 依赖\r\n\r\n```bash\r\npip install -r requirements.txt\r\n```\r\n\r\n报错 `externally-managed-environment` 时：\r\n\r\n```bash\r\npip install --break-system-packages -r requirements.txt\r\n```\r\n\r\n### 第四步：安装 Node.js 依赖（仅 WhatsApp 模式）\r\n\r\n```bash\r\ncd to_whatsapp && npm install && cd ..\r\n```\r\n\r\n### 第五步：复制配置模板\r\n\r\n```bash\r\ncp config.example.json config.json\r\nnano config.json     # 或 vim \u002F vi\r\n```\r\n\r\n字段说明见下一章。\r\n\r\n### 第六步：启动\r\n\r\n一键脚本（Linux）：\r\n\r\n```bash\r\nchmod +x start.sh\r\n.\u002Fstart.sh\r\n```\r\n\r\n或手动启动（方便调试）：\r\n\r\n```bash\r\n# 终端 1：支付核心\r\ncd plus_gopay_links\r\npython3 payment_server.py --config ..\u002Fconfig.json --listen :50051\r\n\r\n# 终端 2：编排器\r\ncd \u002Fopt\u002Fgopay-plus\r\npython3 orchestrator.py\r\n\r\n# 终端 3（仅 whatsapp 模式）：WhatsApp Relay\r\ncd to_whatsapp\r\nWA_PAIRING_PHONE=62xxxxxxxxxx WA_PROXY_URL=socks5:\u002F\u002F127.0.0.1:1080 WA_GRPC_PORT=50056 node index.js\r\n```\r\n\r\n### 第七步：自检\r\n\r\n```bash\r\ncurl http:\u002F\u002Flocalhost:8800\u002Fhealth\r\n# {\"ok\": true, \"service\": \"gopay-plus\", \"otp_mode\": \"manual\"}\r\n```\r\n\r\n---\r\n\r\n## 配置说明\r\n\r\n打开 `config.example.json`，**复制成 `config.json`** 再改（改 example 跑不起）。\r\n\r\n> JSON 不支持注释，实际 `config.json` 里不要留下面的 `\u002F\u002F` 说明行。\r\n\r\n```jsonc\r\n{\r\n  \"gopay\": {\r\n    \"country_code\": \"62\",\r\n    \u002F\u002F 印尼国家码，固定 62\r\n\r\n    \"phone_number\": \"81234567890\",\r\n    \u002F\u002F 默认 GoPay 手机号（不含国家码）\r\n    \u002F\u002F 批量模式时这里填一个占位号，每次 \u002Fsubscribe 可传 phone_number 覆盖\r\n\r\n    \"pin\": \"123456\",\r\n    \u002F\u002F 默认 6 位 PIN，批量建议统一\r\n\r\n    \"browser_locale\": \"zh-CN\",\r\n    \"pin_locale\": \"id\",\r\n\r\n    \"otp_channel\": \"whatsapp\",\r\n    \u002F\u002F \"whatsapp\"(默认) | \"sms\"\r\n    \u002F\u002F 选 \"sms\" 时，脚本会在 consent 后等倒计时再切换到 SMS 通道\r\n    \u002F\u002F 用 sms_api 接码平台时必须设成 \"sms\"，否则接码平台收不到\r\n\r\n    \"sms_switch_countdown_sec\": 30,\r\n    \u002F\u002F 切换到 SMS 前的等待秒数（GoPay web 端的按钮倒计时）\r\n\r\n    \"sms_switch_endpoint\": \"\",\r\n    \u002F\u002F 切换通道的 HTTP endpoint，留空用内置默认\r\n    \u002F\u002F 若 GoPay 接口变了，抓一次 HAR（点\"改用短信\"按钮时的请求）把 URL 填这里\r\n\r\n    \"sms_switch_body_extra\": {}\r\n    \u002F\u002F 切换请求需要的额外 body 字段，留空用内置默认\r\n  },\r\n\r\n  \"proxy\": \"socks5:\u002F\u002F127.0.0.1:1080\",\r\n  \u002F\u002F SOCKS5 代理，必须日本出口\r\n\r\n  \"orchestrator\": {\r\n    \"port\": 8800,\r\n    \"otp_timeout\": 90,\r\n    \u002F\u002F 等 OTP 的最长秒数；sms_api 模式建议 ≥ 120\r\n    \"auth_token\": \"my-secret-token-123\"\r\n    \u002F\u002F 自定义随机字符串，调用 \u002Fsubscribe 时需 Authorization: Bearer 该值\r\n  },\r\n\r\n  \"otp\": {\r\n    \"mode\": \"manual\",\r\n    \u002F\u002F \"manual\" | \"sms_api\" | \"whatsapp\"\r\n\r\n    \"sms_api\": {\r\n      \"provider\": \"herosms\",\r\n      \"api_key\": \"\",\r\n      \"base_url\": \"https:\u002F\u002Fapi.herosms.com\",\r\n      \"country\": \"id\",\r\n      \"service\": \"gopay\",\r\n      \"poll_interval_sec\": 3,\r\n      \"poll_timeout_sec\": 90\r\n    },\r\n\r\n    \"whatsapp\": {\r\n      \"grpc_addr\": \"127.0.0.1:50056\"\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n## 使用方法\r\n\r\n### 单次订阅（基本）\r\n\r\n```bash\r\ncurl -X POST http:\u002F\u002Flocalhost:8800\u002Fsubscribe \\\r\n  -H \"Content-Type: application\u002Fjson\" \\\r\n  -H \"Authorization: Bearer my-secret-token-123\" \\\r\n  -d '{\"session_token\": \"eyJhbGciOiJSUzI1NiIs...\"}'\r\n```\r\n\r\n成功：\r\n\r\n```json\r\n{\"ok\": true, \"charge_ref\": \"A1xxxxxxxxxxxxxxxxxxxxxxx\", \"elapsed_ms\": 19928}\r\n```\r\n\r\n失败：\r\n\r\n```json\r\n{\"ok\": false, \"error\": \"otp_timeout\", \"detail\": \"timeout waiting for OTP after 90s\", \"elapsed_ms\": 91000}\r\n```\r\n\r\n### 多号订阅（每次指定不同手机号 \u002F PIN）\r\n\r\n```bash\r\ncurl -X POST http:\u002F\u002Flocalhost:8800\u002Fsubscribe \\\r\n  -H \"Content-Type: application\u002Fjson\" \\\r\n  -H \"Authorization: Bearer my-secret-token-123\" \\\r\n  -d '{\r\n    \"session_token\": \"eyJ...\",\r\n    \"phone_number\": \"82222222222\",\r\n    \"pin\": \"123456\"\r\n  }'\r\n```\r\n\r\n`phone_number` \u002F `pin` 都是可选字段，不传就使用 `config.json` 里的默认值。\r\n\r\n### 并发订阅\r\n\r\norchestrator 支持并发，直接并发发多个 `\u002Fsubscribe` 请求即可（每个传不同的 `session_token` + `phone_number`）。\r\n\r\n> 只用 `manual` 模式并发时，多个请求的 OTP 会共用一个 inbox，容易串号。批量场景请用 `sms_api`。\r\n\r\n---\r\n\r\n## 三种 OTP 接收方案\r\n\r\nGoPay linking 会发一个 6 位验证码到号主手机。如何把这个 OTP 回填给本工具，有三种方式。\r\n\r\n### 方案一：`manual` 模式（手动 \u002F ADB）\r\n\r\n最简单，适合新手调试和少量使用。\r\n\r\n原理：你自己（或脚本）看到验证码后，手动发 HTTP 把验证码告诉编排器。\r\n\r\n配置：`config.json` 中 `otp.mode` = `\"manual\"`。\r\n\r\n使用流程：\r\n\r\n```\r\n1. POST \u002Fsubscribe\r\n2. 约 10 秒后 GoPay 会发验证码到号主手机（默认 WhatsApp）\r\n3. 看到验证码后，90 秒内执行：\r\n   curl -X POST http:\u002F\u002F服务器:8800\u002Fotp \\\r\n     -H \"Content-Type: application\u002Fjson\" \\\r\n     -d '{\"otp\": \"123456\"}'\r\n4. orchestrator 收到后继续流程\r\n5. 返回订阅结果\r\n```\r\n\r\n如果你有 Android 模拟器（MuMu \u002F 雷电等），可以用 `otp_forwarder.py` 自动化转发：\r\n\r\n```bash\r\n# 编辑脚本顶部：\r\n#   OTP_URL = \"http:\u002F\u002F你的服务器:8800\u002Fotp\"\r\n#   AUTH    = \"Bearer my-secret-token-123\"\r\n\r\nadb connect 127.0.0.1:7555    # 或你的模拟器 ADB 端口\r\nadb devices\r\n\r\npython3 otp_forwarder.py      # 保持窗口开着\r\n```\r\n\r\n> **重要**：不要点开 WhatsApp 的通知消息，否则 ADB 抓不到。\r\n\r\n### 方案二：`sms_api` 模式（接码平台自动获取）\r\n\r\n适合批量生产，全自动无人值守。\r\n\r\n原理：GoPay 把验证码通过 **SMS** 发到虚拟手机号，编排器自动调接码平台 API 查询并取回验证码。\r\n\r\n**重要前提：GoPay linking 默认把 OTP 发到 WhatsApp，接码平台收不到。** 必须同时配置：\r\n\r\n1. `otp.mode` = `\"sms_api\"`\r\n2. `gopay.otp_channel` = `\"sms\"`（让脚本在 consent 后切换 SMS 通道）\r\n3. `orchestrator.otp_timeout` ≥ **120**（因为要等 30 秒倒计时 + SMS 送达）\r\n\r\n关键字段（合并摘录）：\r\n\r\n```json\r\n{\r\n  \"gopay\": {\r\n    \"otp_channel\": \"sms\",\r\n    \"sms_switch_countdown_sec\": 30,\r\n    \"sms_switch_endpoint\": \"\"\r\n  },\r\n  \"orchestrator\": { \"otp_timeout\": 120 },\r\n  \"otp\": {\r\n    \"mode\": \"sms_api\",\r\n    \"sms_api\": {\r\n      \"api_key\": \"你的key\",\r\n      \"base_url\": \"https:\u002F\u002Fapi.你的平台.com\"\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n> `sms_switch_endpoint` 留空时使用内置默认。若 GoPay 调整了接口，抓一次 HAR（点 GoPay web 页\"改用短信接收\"时发出的请求），把 URL 填到 `sms_switch_endpoint`，附加字段填到 `sms_switch_body_extra`。\r\n\r\n接码平台对接：\r\n\r\n编排器默认请求：\r\n\r\n```\r\nGET {base_url}?action=get_sms&api_key={你的key}&phone={手机号}&country=id\r\n```\r\n\r\n再从响应文本里自动提取 6 位数字（`\\b\\d{6}\\b`）。\r\n\r\n如果你的平台 URL 格式不同，直接改 `orchestrator.py` 里 `_wait_sms_api_otp` 函数的 URL 构造即可，响应解析是通用的。\r\n\r\n常见平台参考：\r\n\r\n```\r\nHeroSMS:\r\n  GET https:\u002F\u002Fapi.herosms.com\u002Fapi\u002Fget_sms?api_key=KEY&phone=PHONE\r\n  返回：{\"sms\": \"Your verification code is 123456\"}\r\n\r\n5sim:\r\n  GET https:\u002F\u002F5sim.net\u002Fv1\u002Fuser\u002Fcheck\u002F{order_id}\r\n  Header: Authorization: Bearer KEY\r\n  返回：{\"sms\": [{\"text\": \"123456 is your code\"}]}\r\n\r\nsms-activate:\r\n  GET https:\u002F\u002Fapi.sms-activate.org\u002Fstubs\u002Fhandler_api.php?api_key=KEY&action=getStatus&id=ORDER_ID\r\n  返回：STATUS_OK:123456\r\n```\r\n\r\n批量流程示例：\r\n\r\n```\r\n1. 接码平台买一个印尼号（假设 81234567890）\r\n2. 用这个号在 Gojek 注册 GoPay，设 PIN 为 123456\r\n3. curl -X POST http:\u002F\u002Flocalhost:8800\u002Fsubscribe \\\r\n     -H \"Authorization: Bearer my-secret-token-123\" \\\r\n     -d '{\"session_token\":\"eyJ...\",\"phone_number\":\"81234567890\",\"pin\":\"123456\"}'\r\n4. 编排器自动从接码平台取验证码，完成订阅\r\n5. 换下一组 号 + access_token，继续\r\n```\r\n\r\n> 作者本人未逐一实测过每个接码平台，但原理一致（拉短信、提取 6 位码），用户需根据自己买的平台做小幅改造。\r\n\r\n### 方案三：`whatsapp` 模式（WhatsApp 自动接收）\r\n\r\n适合**固定一个** GoPay 号长期使用的场景。\r\n\r\n原理：在服务器上用 Baileys 登录 WhatsApp，监听 GoPay 发来的消息。\r\n\r\n配置：`config.json` 中 `otp.mode` = `\"whatsapp\"`。\r\n\r\n首次配对：\r\n\r\n```bash\r\ncd to_whatsapp\r\nexport WA_PAIRING_PHONE=62xxxxxxxxxx   # 你的 WhatsApp 主号（含 62）\r\nexport WA_PROXY_URL=socks5:\u002F\u002F127.0.0.1:1080\r\nexport WA_GRPC_PORT=50056\r\nnode index.js\r\n```\r\n\r\n终端会显示一个 8 位配对码，例如 `WN2XQNLB`。\r\n\r\n在你的手机上操作：\r\n\r\n1. 打开 WhatsApp\r\n2. 右上角三点 → 已关联设备 → 关联设备\r\n3. 输入那个 8 位配对码\r\n\r\n配对成功后服务常驻，自动接收 GoPay 验证码。\r\n\r\n**已知问题**：WhatsApp 的**关联设备**可能对金融类消息（如 GoPay 验证码）做屏蔽（`MASK_LINKED_DEVICES`），导致服务端收不到。遇到这个情况请改用 `manual` 或 `sms_api`。\r\n\r\n### 三种方案对比\r\n\r\n|  | manual | sms_api | whatsapp |\r\n|---|---|---|---|\r\n| 全自动 | 需手动 \u002F ADB | 完全自动 | 完全自动 |\r\n| 多号支持 | 支持 | 支持 | 仅单号 |\r\n| 额外成本 | 无 | 接码平台费用 | 无 |\r\n| 稳定性 | 取决于人 \u002F ADB | 高 | 可能被屏蔽 |\r\n| 适合场景 | 调试 \u002F 少量 | 批量生产 | 固定号长期 |\r\n\r\n---\r\n\r\n## 生产部署（systemd 自启动）\r\n\r\n让服务开机自启、崩溃自动拉起：\r\n\r\n```bash\r\n# 1. 支付核心\r\ncat > \u002Fetc\u002Fsystemd\u002Fsystem\u002Fplus-gopay-links.service \u003C\u003C 'EOF'\r\n[Unit]\r\nDescription=GoPay Payment Service\r\nAfter=network.target\r\n\r\n[Service]\r\nType=simple\r\nWorkingDirectory=\u002Fopt\u002Fgopay-plus\r\nExecStart=\u002Fusr\u002Fbin\u002Fpython3 plus_gopay_links\u002Fpayment_server.py --config config.json --listen :50051\r\nRestart=always\r\nRestartSec=5\r\nEnvironment=PYTHONUNBUFFERED=1\r\n\r\n[Install]\r\nWantedBy=multi-user.target\r\nEOF\r\n\r\n# 2. 编排器\r\ncat > \u002Fetc\u002Fsystemd\u002Fsystem\u002Fgopay-orchestrator.service \u003C\u003C 'EOF'\r\n[Unit]\r\nDescription=GoPay Orchestrator\r\nAfter=plus-gopay-links.service\r\n\r\n[Service]\r\nType=simple\r\nWorkingDirectory=\u002Fopt\u002Fgopay-plus\r\nExecStart=\u002Fusr\u002Fbin\u002Fpython3 orchestrator.py\r\nRestart=always\r\nRestartSec=5\r\nEnvironment=PYTHONUNBUFFERED=1\r\n\r\n[Install]\r\nWantedBy=multi-user.target\r\nEOF\r\n\r\n# 启用并启动\r\nsystemctl daemon-reload\r\nsystemctl enable --now plus-gopay-links gopay-orchestrator\r\n\r\n# 查看状态 \u002F 日志\r\nsystemctl status plus-gopay-links\r\nsystemctl status gopay-orchestrator\r\njournalctl -u gopay-orchestrator -f\r\n```\r\n\r\n---\r\n\r\n## 常见问题\r\n\r\n### Q: 返回 `otp_timeout`\r\n\r\n在 `otp_timeout` 内没收到验证码。排查：\r\n\r\n- `manual`：是否在超时内 POST 了 `\u002Fotp`？\r\n- `sms_api`：`api_key` \u002F `base_url` 配置对不对？`gopay.otp_channel` 是否设成 `\"sms\"`？号是否仍在接码平台的\"激活\"窗口里？\r\n- `whatsapp`：Relay 是否在跑？是否被 `MASK_LINKED_DEVICES` 屏蔽？\r\n\r\n### Q: 返回 `start_gopay_failed`\r\n\r\n通常是 `access_token` 无效或已过期。从 `https:\u002F\u002Fchatgpt.com\u002Fapi\u002Fauth\u002Fsession` 重新拿一个。\r\n\r\n少数情况是 Stripe confirm 阶段被风控（同 IP \u002F 账号特征触发），换号或换 IP 试。\r\n\r\n### Q: PIN 验证失败 \u002F 被限流\r\n\r\n- PIN 不是 6 位数字 → 改 `config.json`\r\n- 同号短时间内多次错 PIN → 被 GoPay 临时限流，冷却期约 1 小时\r\n- 确保 config 里的 PIN 位数正确（曾见把 6 位 PIN 误抄成 7 位导致反复失败的案例）\r\n\r\n### Q: Midtrans charge 返回 `fraud_status=deny`\r\n\r\n同号短时间内 linking 次数过多，触发 Midtrans 反欺诈。这一号作废，换号即可。一号一订阅场景不会遇到。\r\n\r\n### Q: 返回 `midtrans linking exhausted retries: account already linked`\r\n\r\n这个 GoPay 号最近已绑过其他 ChatGPT 账号。根据一号多绑限制，可能该号已达上限；换号重试。\r\n\r\n### Q: 同时订阅多个账号怎么做\r\n\r\n并发发多个 `\u002Fsubscribe` 即可。注意 `manual` 模式的 OTP inbox 是共享的，并发时容易串号，批量请用 `sms_api`。\r\n\r\n### Q: 代理要求\r\n\r\n- SOCKS5 协议\r\n- 日本出口（或中国台湾），其他地区拿不到 Plus 资格\r\n- 不能是已被 GoPay \u002F Midtrans 黑名单的 IP\r\n- 推荐自建 \u002F 住宅代理\r\n\r\n### Q: Windows 本地能跑吗\r\n\r\n`start.sh` 是 Bash 脚本，Windows 用户可以在 WSL 里跑，或直接手动启动两个 Python 进程。\r\n\r\n---\r\n\r\n## 项目结构\r\n\r\n```\r\nGopay_plus_automatic\u002F\r\n├── README.md                # 本文件\r\n├── config.example.json      # 配置模板（复制为 config.json 使用）\r\n├── requirements.txt         # Python 顶层依赖\r\n├── start.sh                 # 一键启动（Linux \u002F WSL）\r\n├── orchestrator.py          # 编排器 HTTP API + 三种 OTP 模式\r\n├── otp_forwarder.py         # ADB OTP 自动转发（manual 模式辅助脚本）\r\n├── .gitignore\r\n├── plus_gopay_links\u002F        # 支付核心\r\n│   ├── gopay.py             # Stripe \u002F Midtrans \u002F GoPay 完整支付流程\r\n│   ├── payment_server.py    # gRPC 封装\r\n│   ├── requirements.txt\r\n│   ├── proto\u002F\r\n│   │   ├── payment.proto\r\n│   │   └── otp.proto\r\n│   ├── payment_pb2.py \u002F payment_pb2_grpc.py\r\n│   └── otp_pb2.py \u002F otp_pb2_grpc.py\r\n└── to_whatsapp\u002F             # WhatsApp OTP 接收（可选模块）\r\n    ├── index.js             # Baileys 客户端\r\n    ├── package.json\r\n    ├── wa_relay.py          # Node 进程 wrapper\r\n    └── proto\u002Fotp.proto\r\n```\r\n\r\n---\r\n\r\n## 免责声明\r\n\r\n本项目仅供学习研究使用。使用者需自行承担风险，遵守相关服务条款，不得违反 OpenAI 条款和相关法律法规。使用本项目即默认用户知情并同意：一切后果由用户个人承担，与作者无关。\r\n","GoPay Plus 自动订阅机是一个全自动的 ChatGPT Plus 订阅工具，通过 Stripe → Midtrans → GoPay 的支付链路在约 20 秒内完成 0 元首月订阅。其核心功能包括自动创建印尼盾订阅订单、自动处理付款流程、接收并填写 OTP 验证码、输入 GoPay PIN 以及验证订阅状态。项目采用 Python 编写，并支持单号调试和多号批量并发订阅。此工具适合需要快速实现 ChatGPT Plus 订阅的研究者、开发者或个人用户，但需要注意的是，项目不再更新且部署具有一定技术门槛，推荐具备一定基础的用户使用。此外，项目要求使用特定地区的 IP 出口及邮箱类型以确保订阅成功。",2,"2026-06-11 03:53:08","CREATED_QUERY"]