从短信短链跳转微信小程序全流程实现

从短信短链跳转微信小程序全流程实现

整体流程概述

  1. 用户点击短信中的短链接
  2. 短链接跳转至微信打开指定小程序
  3. 小程序完成用户登录
  4. 跳转到小程序指定页面

详细技术实现

1. 生成带参数的短链接

首先需要在微信公众平台生成可以跳转小程序的短链接:

// Java后端生成微信URL Link示例
public String generateWechatUrlLink() {
    // 微信开放平台相关配置
    String appId = "你的小程序appid";
    String appSecret = "你的小程序secret";
    String path = "pages/index/index"; // 小程序路径
    String query = "param1=value1&param2=value2"; // 传递参数
    
    // 获取access_token
    String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" 
        + appId + "&secret=" + appSecret;
    // 调用微信API获取token(实际代码需添加HTTP请求处理)
    String accessToken = getAccessToken(tokenUrl);
    
    // 生成URL Link
    String urlLinkApi = "https://api.weixin.qq.com/wxa/generate_urllink?access_token=" + accessToken;
    
    JSONObject requestBody = new JSONObject();
    requestBody.put("path", path);
    requestBody.put("query", query);
    requestBody.put("is_expire", true); // 设置过期
    requestBody.put("expire_type", 1); // 过期时间类型
    requestBody.put("expire_interval", 30); // 30天后过期
    
    // 调用微信API生成URL Link(实际代码需添加HTTP请求处理)
    String urlLink = generateUrlLink(urlLinkApi, requestBody.toString());
    
    // 将生成的URL Link转为短链
    String shortUrlApi = "https://api.weixin.qq.com/cgi-bin/shorturl?access_token=" + accessToken;
    JSONObject shortUrlRequestBody = new JSONObject();
    shortUrlRequestBody.put("action", "long2short");
    shortUrlRequestBody.put("long_url", urlLink);
    
    // 调用微信API生成短链(实际代码需添加HTTP请求处理)
    String shortUrl = generateShortUrl(shortUrlApi, shortUrlRequestBody.toString());
    
    return shortUrl;
}

2. 小程序端接收参数并处理

在小程序的App.js或目标页面中接收和处理参数:

// 小程序App.js中
App({
  onLaunch(options) {
    // 处理URL Link打开小程序的场景
    if (options.query && options.query.scene) {
      // 解析scene参数
      const scene = decodeURIComponent(options.query.scene);
      console.log('从短链接进入的场景值:', scene);
      
      // 这里可以处理登录逻辑
      this.loginAndRedirect(scene);
    }
  },
  
  loginAndRedirect(sceneParams) {
    // 登录逻辑
    wx.login({
      success: res => {
        // 发送code到后端换取openid
        wx.request({
          url: 'https://your-backend-api.com/login',
          method: 'POST',
          data: {
            code: res.code,
            scene: sceneParams
          },
          success: (response) => {
            const { token, userInfo, redirectPath } = response.data;
            
            // 存储登录态
            wx.setStorageSync('token', token);
            wx.setStorageSync('userInfo', userInfo);
            
            // 跳转到指定页面
            if (redirectPath) {
              wx.reLaunch({
                url: redirectPath
              });
            }
          }
        });
      }
    });
  }
});

3. Java后端登录接口实现

// Spring Boot 控制器示例
@RestController
@RequestMapping("/api")
public class LoginController {
    
    @Autowired
    private WechatService wechatService;
    
    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestBody LoginRequest request) {
        // 1. 通过code获取openid
        String openid = wechatService.getOpenid(request.getCode());
        
        if (openid == null) {
            return ResponseEntity.badRequest().body("登录失败");
        }
        
        // 2. 处理scene参数(从短链接带来的参数)
        Map<String, String> sceneParams = parseSceneParams(request.getScene());
        
        // 3. 查询或创建用户
        User user = userService.findOrCreateUser(openid, sceneParams);
        
        // 4. 生成JWT token
        String token = jwtTokenUtil.generateToken(user);
        
        // 5. 根据场景参数确定跳转路径
        String redirectPath = determineRedirectPath(sceneParams);
        
        // 返回结果
        Map<String, Object> response = new HashMap<>();
        response.put("token", token);
        response.put("userInfo", convertToUserInfo(user));
        response.put("redirectPath", redirectPath);
        
        return ResponseEntity.ok(response);
    }
    
    private Map<String, String> parseSceneParams(String scene) {
        // 解析scene参数,例如"param1=value1&param2=value2"
        return Arrays.stream(scene.split("&"))
            .map(p -> p.split("="))
            .collect(Collectors.toMap(
                arr -> arr[0],
                arr -> arr.length > 1 ? arr[1] : ""
            ));
    }
    
    private String determineRedirectPath(Map<String, String> sceneParams) {
        // 根据业务逻辑确定跳转路径
        if ("special".equals(sceneParams.get("type"))) {
            return "/pages/special/index";
        }
        return "/pages/home/index";
    }
}

4. 微信相关服务类

@Service
public class WechatServiceImpl implements WechatService {
    
    @Value("${wechat.appid}")
    private String appid;
    
    @Value("${wechat.secret}")
    private String secret;
    
    @Override
    public String getOpenid(String code) {
        String url = String.format(
            "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code",
            appid, secret, code);
        
        // 使用RestTemplate或其他HTTP客户端调用微信API
        String response = restTemplate.getForObject(url, String.class);
        JSONObject json = JSON.parseObject(response);
        
        return json.getString("openid");
    }
}

注意事项

  1. 安全性:所有从客户端传递的参数都需要在后端验证
  2. 短链有效期:微信生成的URL Link默认有效期为30天,可根据需要调整
  3. 参数传递
    • URL Link有长度限制,复杂参数建议先存储在后端,只传ID
    • 敏感数据不要通过URL传递
  4. 用户体验
    • 从短信到微信的跳转需要用户手机已安装微信
    • 考虑添加加载状态和错误处理
  5. 兼容性
    • 处理用户未安装微信的情况
    • 处理不同微信版本兼容性问题

完整流程总结

  1. 后端生成带参数的微信URL Link并转为短链
  2. 将短链通过短信发送给用户
  3. 用户点击短信链接跳转微信并打开小程序
  4. 小程序获取启动参数并向后端发起登录请求
  5. 后端验证登录并返回用户信息和跳转路径
  6. 小程序根据返回结果跳转到指定页面

以上示例提供了从短信短链到小程序指定页面的完整技术实现方案,可根据实际业务需求进行调整。

### 微信小程序实现短链接支付功能 #### 创建URL Link用于支付页面跳转 为了实现微信小程序中的短链接支付功能,可以利用微信提供的`获取URL Link`接口来创建指向特定支付页面的短链接。该接口允许指定要跳转小程序路径以及查询参数,从而能够构建一个可以直接引导用户进入支付流程的接[^2]。 ```json { "path": "/pages/pay/index", "query": { "order_id": "123456" } } ``` 此JSON对象定义了一个通往名为`pay`目录下的`index`文件所代表的页面,并携带订单ID作为查询字符串的一部分传递给目标页面以便处理具体的付款逻辑。 #### 处理支付请求 当用户点击上述生成好的短链接后会自动启动微信应用并加载对应的小程序页面,在这里需要编写相应的业务代码完成实际的商品购买操作: ```javascript // pages/pay/index.js Page({ onLoad(options) { const orderId = options.order_id; wx.requestPayment({ timeStamp: '', nonceStr: '', package: 'prepay_id=xxx', signType: 'MD5', paySign: '', success(res) {}, fail(res) {} }); }, }); ``` 这段JavaScript脚本展示了如何接收来自短链接传入的数据(即订单编号),并通过调用微信内置API发起一次预授权式的在线支付尝试。注意这里的签名算法和其他必要字段需按照官方指引正确填充以确保交易安全可靠。 #### 安全性和合规性考量 在整个过程中务必遵循《微信公众平台运营规范》及相关法律法规的要求,保障用户的资金和个人信息安全不受侵犯;同时也要做好异常情况下的用户体验优化工作,比如网络波动导致支付失败后的提示信息设计等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值