微信公众号-分享功能
发布于 5 年前 作者 jieyin 5364 次浏览 来自 分享

话不多说直接上代码

1、获取access_token

string appId ="1122334455";//公众号对应的appid
string appSecret = "aaabbccdd";//公众号对应的密钥 查看地址:公众号-开封-基本配置
string tokenUrl = $"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appId}&secret={appSecret}";
var tokenResult = HttpHelper.RequestHttpClient(tokenUrl, EnumRequestMethod.GET).Result;
//此处为自己的业务逻辑判断,如果这一步没有获取到access_token,不用继续往下走了,先解决获取access_token获取问题吧。

1.1、WechatMpShareAccessToken实体如下

/// <summary>
/// 获取access_token实体
/// </summary>  
public class WechatMpShareAccessToken
{
   /// <summary>
   /// 全局token
   /// </summary>  
   public string access_token { get; set; }
    /// <summary>
    /// 过期时间
    /// </summary> 
    public int expires_in { get; set; }
    /// <summary>
    /// 错误码
    ///  </summary>  
    public string  errcode{ get; set; }
    /// <summary>
    /// 错误描述
    /// </summary>  
    public string errmsg{ get; set; }
}

2、 获取jsapi_ticket

string access_token = tokenResult.access_token;
string ticketUrl = $"https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={access_token}&type=jsapi";
var ticket = HttpHelper.RequestHttpClient(ticketUrl, EnumRequestMethod.GET).Result;

2.1 、WechatMpShareJsApiTicket实体如下

///  <summary>
/// 获取分享的jsapi_ticket实体
///  </summary>  
public class WechatMpShareJsApiTicket
{
   /// <summary>
   /// 错误码
   /// </summary>    
    public string errcode { get; set; }
    /// <summary>
    /// 错误内容
    /// </summary>
    public string errmsg { get; set; }
    /// <summary>
    /// ticket
    ///  </summary>
    public string ticket { get; set; }
    /// <summary>
    /// 有效期
    /// </summary>
    public string expires_in { get; set; }
}

3、SHA1加密

result.timeStamp = RandomGeneratHepler.GenerateTimeStamp();
result.nonceStr = RandomGeneratHepler.GenerateNonceStr();
string sign = "jsapi_ticket=" + ticket.ticket + "&noncestr=" + result.nonceStr + "×tamp=" + result.timeStamp + "&url=" + url;
string sha1 = SHA1Helper.SHA1(sign);
result.appId = appId;
result.paySign = sha1.ToLower();

3.1以下为SHA1加密方法,注意此处加密与微信支付所有的加密方式不同(微信支付加密方式有两种,SIGN_TYPE_MD5 SIGN_TYPE_HMAC_SHA256

///SHA1Helper 加密类如下
/// <summary>  
/// SHA1加密
/// </summary>  
public class SHA1Helper
{
   /// <summary>
   /// SHA1 加密,返回大写字符串
   /// </summary>
   /// 需要加密字符串
   /// 返回40位UTF8 大写
    public static string SHA1(string content)
    {
        return SHA1(content, Encoding.UTF8);
    }
    ///  <summary>
    /// SHA1 加密,返回大写字符串
    ///  </summary>
    /// 需要加密字符串
    /// 指定加密编码
    /// 返回40位大写字符串
    public static string SHA1(string content, Encoding encode)
    {
        try
        {
            SHA1 sha1 = new SHA1CryptoServiceProvider();
            byte[] bytes_in = encode.GetBytes(content);
            byte[] bytes_out = sha1.ComputeHash(bytes_in);
            sha1.Dispose();
            string result = BitConverter.ToString(bytes_out);
            result = result.Replace("-", "");
            return result;
        }
        catch (Exception ex)
        {
            throw new Exception("SHA1加密出错:" + ex.Message);
        }
    }
}

3.2以下为签名时所需要的生成时间戳+随机数的方法

/// <summary>
/// 生成时间戳+微信签名所需的随机数
/// </summary> 
public class RandomGeneratHepler 
{
    /// <summary>
    /// 生成时间戳,标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数
    /// </summary> 
    public static string GenerateTimeStamp()
    {
        TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
        return Convert.ToInt64(ts.TotalSeconds).ToString();
    }

    /// <summary>
    /// 生成随机串,随机串包含字母或数字
    /// </summary> 
    public static string GenerateNonceStr()
    {
        RandomGenerator randomGenerator = new RandomGenerator();
        return randomGenerator.GetRandomUInt().ToString();
    }
}

总结:接入分享基本上没啥难度,遇到了两个错误码 40048 63002

40164是由于当前的ip没有在公众号内配置白名单(路径:公众号-开发-基本配置-IP白名单),此处的ip为上述传入参数url,如果是域名,转为ip然后按照前面所述的路径配置即可。

63002基本上就是签名的错误了,我是因为当初把第二步忽略了导致的,所以说还是仔细点。

希望对大家有所帮助

1 回复

你好,我这边也报了63002,你说的第二步指的是什么

回到顶部