generate-url-link.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // Node 脚本:生成带 storeId 的小程序 URL Link(可指定体验版)
  2. // 优点:可直接分享为链接或转成二维码,支持 env_version
  3. // 用法(Windows PowerShell):
  4. // $env:WX_APPID="wxbb048b80cd2a14b9"; $env:WX_SECRET="<你的AppSecret>"; node server/generate-url-link.js
  5. const https = require('https');
  6. const APPID = process.env.WX_APPID || 'wxbb048b80cd2a14b9';
  7. const SECRET = process.env.WX_SECRET; // 必须提供 AppSecret
  8. const STORE_ID = 'ARhMGM5Y1W';
  9. const PATH = 'nova-pbf/pages/index/index';
  10. const QUERY = `storeId=${STORE_ID}`;
  11. const ENV_VERSION = 'trial'; // 可选: 'develop' | 'trial' | 'release'
  12. function httpGetJson(url) {
  13. return new Promise((resolve, reject) => {
  14. https
  15. .get(url, (res) => {
  16. let data = '';
  17. res.on('data', (chunk) => (data += chunk));
  18. res.on('end', () => {
  19. try {
  20. const json = JSON.parse(data);
  21. resolve(json);
  22. } catch (e) {
  23. reject(e);
  24. }
  25. });
  26. })
  27. .on('error', reject);
  28. });
  29. }
  30. function httpPostJson(url, bodyObj) {
  31. const body = JSON.stringify(bodyObj);
  32. return new Promise((resolve, reject) => {
  33. const req = https.request(url, {
  34. method: 'POST',
  35. headers: {
  36. 'Content-Type': 'application/json',
  37. 'Content-Length': Buffer.byteLength(body),
  38. },
  39. });
  40. let data = '';
  41. req.on('response', (res) => {
  42. res.on('data', (chunk) => (data += chunk));
  43. res.on('end', () => {
  44. try {
  45. const json = JSON.parse(data);
  46. resolve(json);
  47. } catch (e) {
  48. reject(e);
  49. }
  50. });
  51. });
  52. req.on('error', reject);
  53. req.write(body);
  54. req.end();
  55. });
  56. }
  57. async function main() {
  58. if (!SECRET) {
  59. console.error('❌ 未提供 WX_SECRET(AppSecret)。请设置环境变量后重试。');
  60. process.exit(1);
  61. }
  62. console.log('🔑 获取 access_token...');
  63. const tokenResp = await httpGetJson(
  64. `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${SECRET}`
  65. );
  66. if (!tokenResp.access_token) {
  67. console.error('❌ 获取 access_token 失败:', tokenResp);
  68. process.exit(1);
  69. }
  70. const accessToken = tokenResp.access_token;
  71. console.log('✅ access_token 获取成功');
  72. console.log('🔗 生成 URL Link...');
  73. const apiUrl = `https://api.weixin.qq.com/wxa/generate_urllink?access_token=${accessToken}`;
  74. const payload = {
  75. path: PATH,
  76. query: QUERY,
  77. env_version: ENV_VERSION,
  78. is_expire: false,
  79. };
  80. const resp = await httpPostJson(apiUrl, payload);
  81. if (!resp.url_link) {
  82. console.error('❌ 生成 URL Link 失败:', resp);
  83. process.exit(1);
  84. }
  85. console.log('✅ URL Link 生成成功:');
  86. console.log(resp.url_link);
  87. console.log('📌 打开该链接即可跳转到小程序(环境:', ENV_VERSION, '),并携带 query:', QUERY);
  88. }
  89. main().catch((e) => {
  90. console.error('程序异常:', e);
  91. process.exit(1);
  92. });