微信服务号的开发-服务器配置

本文详细介绍微信服务号开发中服务器配置步骤,包括测试号申请、URL设置及内网穿透,重点讲解通过SHA1加密验证Token确保服务器配置成功的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微信服务号开发-服务器配置

本期是将微信开发第一步,也就是服务器配置,以及校验。
话不多说,我们主要讲重点。既然是微信服务号开发,首先我们需要一个测试号,大家可以自己去微信公众平台申请一个。
申请完后,我们需要填写以下服务器配置信息。在这里插入图片描述
这里的url我使用的是花生壳来进行内网穿透,大家也可以自行选择。
注意这边填写完URL后,微信将以你下一栏填写的Token 进行sha1加密,以get 的方式下发到你的服务器上。
两者若是比对一致,则配置成功。
在这里插入图片描述下面贴一下校验代码

import com.jodoll.mall.samples.model.Signature;
import com.jodoll.mall.samples.utils.CheckUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

/**
 * @fileName:WeiXinController
 * @author:ccl
 * @createTime:2019-05-24:08:36
 */
@RestController
@RequestMapping("/weixin")
public class WeiXinController {

    @GetMapping("/validate")
    public String weixinConnect(HttpServletRequest request) {
        Signature sg = new Signature(
                request.getParameter("signature"),
                request.getParameter("timestamp"),
                request.getParameter("nonce"),
                request.getParameter("echostr"));
        String method = request.getMethod();
        if (CheckUtil.checkSignature(sg)) {
            System.out.println("微信连接成功!");
            return sg.getEchostr();
        }
        return "";
    }

}

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * @fileName:Signature
 * @author:ccl
 * @createTime:2019-05-24:08:37
 */
@Data
@AllArgsConstructor
public class Signature {
    private String signature;
    private String timestamp;
    private String nonce;
    private String echostr;
}

import com.jodoll.mall.samples.model.Signature;

import java.security.MessageDigest;
import java.util.Arrays;

/**
 * @fileName:CheckUtil
 * @author:ccl
 * @createTime:2019-05-24:08:40
 */
public class CheckUtil {


    private static final String token = "token";

    public static boolean checkSignature(Signature sg) {

        String[] arr = new String[] { token, sg.getTimestamp(), sg.getNonce() };
        // 排序
        Arrays.sort(arr);
        // 生成字符串
        StringBuffer content = new StringBuffer();
        for (int i = 0; i < arr.length; i++) {
            content.append(arr[i]);
        }

        // sha1加密
        String temp = getSha1(content.toString());
        // 比较
        return temp.equals(sg.getSignature());
    }

    // 加密算法
    public static String getSha1(String str) {
        if (str == null || str.length() == 0) {
            return null;
        }

        char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        try {
            MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
            mdTemp.update(str.getBytes("UTF-8"));
            byte[] md = mdTemp.digest();
            int j = md.length;
            char buf[] = new char[j * 2];
            int k = 0;

            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
                buf[k++] = hexDigits[byte0 & 0xf];
            }

            return new String(buf);
        } catch (Exception e) {
            return null;
        }

    }
}

以后将会陆续更新服务号的讲解。

<think>嗯,用户问的是微信服务号开发服务器配置成功后收不到消息的问题。这个问题挺常见的,可能有很多原因。首先,我需要回忆一下微信服务号配置流程,以及消息推送的机制。 首先,服务器配置成功可能意味着Token验证通过了,但实际接收消息的时候可能还有其他问题。可能用户完成了URL和Token的配置,但消息没有正确处理。这时候要分步骤排查。 可能的步骤包括检查服务器配置是否正确,比如URL是否可访问,是否有处理GET和POST请求。然后,检查服务器的日志,看看是否有收到来自微信服务器的请求。如果没有日志,可能是网络问题,比如防火墙或者安全组设置,导致微信服务器无法访问用户的服务器。 另外,微信的消息加密方式可能有问题,比如启用了加密模式但没有正确解密消息。这时候需要检查EncodingAESKey是否配置正确,以及服务器端是否有对应的解密逻辑。 还有可能是消息处理后的响应不符合微信的要求,比如没有返回正确的XML结构或者没有及时响应(5秒内),导致微信服务器重试,而用户可能没注意到重复请求的处理。 另外,服务号的权限问题,比如没有开通接收消息的接口权限,或者公众号类型不支持,比如订阅号可能权限不足。不过用户提到的是服务号,所以权限应该没问题,但还是要确认一下。 还有可能是消息类型处理的问题,比如用户发送的消息类型服务器端没有正确处理,比如事件推送或者文本消息,导致虽然收到消息但未正确解析。需要检查代码中的消息类型判断逻辑。 还可能服务器配置的URL路径处理有问题,比如在web框架中路由配置错误,导致虽然验证通过,但实际处理消息的路径没有被正确路由到处理函数。 另外,微信服务器可能因为某些原因被暂时屏蔽,比如频繁错误响应导致被微信服务器加入黑名单,需要检查服务器是否稳定,是否有大量错误日志。 可能的解决方案包括:检查服务器日志,确认是否有请求进入;使用工具如Postman模拟微信的POST请求,测试服务器的响应;检查代码中的加密解密逻辑;确认服务器处理消息后返回正确的响应格式;检查网络配置,确保80或443端口开放,并且没有安全策略拦截;确认公众号后台配置的Token、URL和EncodingAESKey代码一致。 总结下来,需要从配置、网络、代码逻辑、日志排查等多个方面来检查。可能还需要分步骤指导用户如何逐步排查,比如先检查日志,再模拟请求,再检查代码逻辑等。</think>微信服务号开发中,服务器配置成功后无法接收消息可能由多种原因导致。以下是常见问题及排查步骤: --- ### **一、基础配置检查** 1. **服务器地址(URL)有效性** - 确保URL能通过公网访问(可用浏览器或 `curl` 测试)。 - 确认服务器支持 **GET**(验证)和 **POST**(接收消息)请求。 - 检查是否配置了SSL证书(必须使用 **HTTPS**)。 2. **Token/EncodingAESKey 一致性** - 公众号后台填写的 `Token` 和 `EncodingAESKey` 必须代码中的配置完全一致。 - 若启用加密模式,需在代码中实现消息解密逻辑(如使用微信提供的SDK)。 --- ### **二、网络服务器问题** 1. **防火墙/安全组** - 确认服务器的 **80/443端口** 对微信服务器IP开放(微信服务器IP列表需定期更新,[官方文档](https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html))。 - 检查云服务商(如阿里云、腾讯云)的安全组规则。 2. **服务器日志监控** - 查看服务器访问日志,确认是否收到微信的POST请求。 - 若未收到请求,可能是网络拦截或微信服务器未推送。 --- ### **三、代码逻辑排查** 1. **消息处理响应格式** - 微信要求 **5秒内** 返回响应,超时会导致重试(可能重复推送)。 - 响应内容必须是合法的XML格式(如文本消息需返回 `<xml>...</xml>` 结构)。 2. **加密模式兼容性** - 检查代码是否处理了加密模式: - **明文模式**:直接接收明文XML。 - **兼容/安全模式**:需解密 `POST` 请求体中的 `Encrypt` 字段。 3. **消息类型处理** - 确保代码能识别不同消息类型(如 `text`、`event`)和事件类型(如关注事件 `subscribe`)。 - 事件消息需特殊处理(如用户关注、菜单点击)。 --- ### **四、微信后台设置** 1. **服务器配置状态** - 登录公众号后台,确认服务器配置为 **“启用”** 状态。 - 若修改过配置,需重新保存并等待生效。 2. **接口权限账号类型** - 服务号需认证后才能使用高级接口。 - 确认当前账号类型为“服务号”(订阅号部分接口受限)。 --- ### **五、测试工具调试** 1. **模拟请求测试** - 用 `curl` 或 Postman 向服务器发送模拟消息,检查是否能正确处理并返回XML。 - 示例请求体(明文模式): ```xml <xml> <ToUserName><![CDATA[公众号ID]]></ToUserName> <FromUserName><![CDATA[用户OpenID]]></FromUserName> <CreateTime>1640995200</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[测试消息]]></Content> <MsgId>1234567890</MsgId> </xml> ``` 2. **微信开发者工具** - 使用公众号后台的 **“开发者工具” -> “在线接口调试工具”** 发送测试消息。 --- ### **六、常见错误案例** - **案例1**:代码未处理 `POST` 请求,仅验证了 `GET` 请求。 - **案例2**:未解析微信的XML数据,直接返回了错误格式(如JSON)。 - **案例3**:服务器使用了反向代理(如Nginx),但未正确转发请求体。 - **案例4**:EncodingAESKey 在后台修改后,代码未同步更新。 --- ### **总结步骤** 1. 检查服务器日志,确认是否收到消息请求。 2. 验证代码是否能解析XML和加密消息。 3. 用工具模拟请求,缩小问题范围。 4. 对比官方示例代码(如[Python](https://github.com/wechat-python-sdk/wechat-python-sdk)或[Node.js](https://github.com/node-webot/wechat)),检查逻辑差异。 若仍无法解决,建议提供具体的代码片段、日志信息和网络环境,以便进一步定位问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值