C#調用微信程序掃一掃
還是照舊廢話不多說,直接上重點
相信大家都搜到了這篇文章,那么肯定也不是啥也不會,因此在以下文章中省略一些基礎部分;
先簡單說一下步驟【這是調用微信官方api的步驟】:
1.首先拿到appId與AppSecret。
2.獲取token
3.根據token獲取ticket
4.通過以上信息生成簽名,正確的配置完簽名才能調用微信api,簽名格式如下:
const config = {
debug: true, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時才會打印。
appId: '', // 必填,公眾號的唯一標識
timestamp: , // 必填,生成簽名的時間戳
nonceStr: '', // 必填,生成簽名的隨機串
signature: '',// 必填,簽名,見附錄1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表見附錄2
}
wx.config(config);
接下來就是以上步驟的實現,不多說,直接上代碼:
請求接口:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=xxx&secret=xxx
appid與secret填進去即可;
先寫一下HttpClientHelper.cs用來發送請求的靜態輔助類:
public static T GetResponse<T>(string url)
where T : class, new()
{
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
var response = httpClient.GetAsync(url).Result;
var result = default(T);
if (response.IsSuccessStatusCode)
{
var t = response.Content.ReadAsStringAsync();
var s = t.Result;
result = JsonConvert.DeserializeObject<T>(s);
}
return result;
}
ok工具類有了,還需要實體來接收微信api返回的信息:
public class wechatResquert
{
//簽名需要當前調用接口的頁面地址,哪個頁面調用掃一掃,穿哪個頁面完整url進來
public string src { get; set; }
}
public class wechatResposen
{
public bool debug { get; set; }
public string appId { get; set; }
public string timestamp { get; set; }
public string nonceStr { get; set; }
public string signature { get; set; }
public string jsApid { get; set; }
public string ticket { get; set; }
public string string1 { get; set; }
}
public class wechatData
{
public string expires_in { get; set; }
public string access_token { get; set; }
public string errcode { get; set; }
public string ticket { get; set; }
public string errmsg { get; set; }
}
public class chatData
{
public bool succcess { get; set; }
public string msg { get; set; }
public string src { get; set; }
public wechatResposen data { get; set; } = new wechatResposen();//生成的簽名
}
接下來就是缺一個生成簽名的方法了,新建一個方法GetWeChatConfig:
public ApiResult GetWeChatConfig(wechatResquert resquert){
chatData result = new chatData();
//記錄當前是哪個頁面,方便調試
result.src = resquert.src;
//獲取token
wechatData data = HttpClientHelper.GetResponse<wechatData>("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={secret}");
if (data.errcode != "" && data.errcode != null)
{//失敗就直接返回
result.succcess = false;
result.msg = data.errmsg;
return Success(result);
}
//獲取ticket
wechatData ticket = HttpClientHelper.GetResponse<wechatData>($"https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={data.access_token}&type=jsapi");
if (ticket.errcode != "0" && ticket.errcode != null)
{//失敗就直接返回
result.succcess = false;
result.msg = data.errmsg;
return Success(result);
}
//獲取時間戳,生成隨機字符,拼湊string1,將string1 Sha1加密生成signature
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
string timestamp = Convert.ToInt64(ts.TotalMilliseconds / 1000).ToString();//微信默認處理時間戳是10位數,所以在這里除以1000
string noncestr = Guid.NewGuid().ToString();
string string1 = $"jsapi_ticket={ticket.ticket}&noncestr={noncestr}×tamp={timestamp}&url={resquert.src}";//順序不能改
using (SHA1 sha1 = SHA1.Create())
{
// 將輸入字符串轉換為字節數組
byte[] inputBytes = Encoding.UTF8.GetBytes(string1);
// 計算哈希值
byte[] hashBytes = sha1.ComputeHash(inputBytes);
// 將字節數組轉換為十六進制字符串
StringBuilder sb = new StringBuilder();
foreach (byte b in hashBytes)
{
sb.Append(b.ToString("x2")); // "x2" 表示將字節轉換為兩位十六進制
}
result.succcess = true;
result.msg = "ok";
result.data.appId = "xxx";
result.data.debug = false;
result.data.jsApid = "scanQRCode";
result.data.nonceStr = noncestr;
result.data.timestamp = timestamp;
result.data.signature = sb.ToString();
result.data.ticket = ticket.ticket;
result.data.string1 = string1;
return Success(result);
}
}
ok后端代碼層面就這么簡單,data中就是生成的簽名
前端引入<script src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script>:
// 配置微信 JS-SDK,加入你已經通過后端GetWeChatConfig獲取了配置信息_data
wx.config({
debug: false, // 調試模式,true 時會彈出調試信息
appId: _data.data.appId,
timestamp: _data.data.timestamp,
nonceStr: _data.data.nonceStr,
signature: _data.data.signature,
jsApiList: [_data.data.jsApid] // 需要使用的JS接口列表
});
// 配置完成后調用
wx.ready(function () {
console.log("微信 JS-SDK 配置完成");
wx.scanQRCode({
needResult: 1, // 默認為0,掃描結果由微信處理;1則直接返回掃描結果
scanType: ["qrCode"], // 可以指定掃二維碼還是條形碼
success: function (res) {
debugger
const result = res.resultStr; // 掃碼結果
alert(result);
},
fail: function (err) {
alert("掃碼失敗: ", err);
}
});
});
// 處理配置失敗
wx.error(function (err) {
console.error("微信 JS-SDK 配置失敗: ", err);
});
將以上這段js代碼寫入你需要觸發掃碼的事件中,效果如圖:


浙公網安備 33010602011771號