前言
對(duì)于小程序大家可能都非常熟悉了,隨著小程序的不斷普及越來(lái)越多的公司都開始推廣使用起來(lái)了。今天接到一個(gè)需求就是生成小程序碼,并且與運(yùn)營(yíng)給的推廣圖片合并在一起做成一張漂亮美觀的推廣二維碼,掃碼這種二維碼就可以進(jìn)入小程序。為了節(jié)省服務(wù)器內(nèi)存資源,我想的就是成功調(diào)用通微信生成小程序碼的接口后直接把微信返回過(guò)來(lái)的圖片二進(jìn)制內(nèi)容(返回的圖片 Buffer)轉(zhuǎn)化為二進(jìn)制byte[]文件流,然后再轉(zhuǎn)成Image這樣就不需要在保存到本地直接讀取本地的背景圖片通過(guò)GDI+(Graphics)繪制圖片。
選擇小程序碼生成方式
首先微信小程序官方文檔提供了三種生成小程序碼的方法,如下所示(本文采用的是第三種,需要的碼數(shù)量極多的業(yè)務(wù)場(chǎng)景):
-
文檔詳情地址:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getQRCode.html
1、createwxaqrcode獲取小程序二維碼,適用于需要的碼數(shù)量較少的業(yè)務(wù)場(chǎng)景。通過(guò)該接口生成的小程序碼,永久有效,有數(shù)量限制。
2、getwxacode獲取小程序碼,適用于需要的碼數(shù)量較少的業(yè)務(wù)場(chǎng)景。通過(guò)該接口生成的小程序碼,永久有效,有數(shù)量限制。
3、getwxacodeunlimit獲取小程序碼,適用于需要的碼數(shù)量極多的業(yè)務(wù)場(chǎng)景。通過(guò)該接口生成的小程序碼,永久有效,數(shù)量暫無(wú)限制。
獲取小程序全局唯一后臺(tái)接口調(diào)用憑據(jù)(access_token)
對(duì)接開發(fā)過(guò)微信相關(guān)的業(yè)務(wù)的同學(xué)應(yīng)該都清楚,調(diào)用微信接口很多情況下都會(huì)需要使用到access_token接口調(diào)用憑證。一般來(lái)說(shuō)access_token的有效時(shí)長(zhǎng)為2小時(shí),為了不頻繁調(diào)用該接口我們可以通過(guò)緩存的方法把調(diào)用憑證存起來(lái)并設(shè)置合理的過(guò)期時(shí)間(redis,cookie,memorycache都是非常不錯(cuò)的選擇)。
請(qǐng)求地址:
-
GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
請(qǐng)求參數(shù):
返回值(JSON 數(shù)據(jù)包):
請(qǐng)求代碼:
///?<summary>
????????///?獲取小程序全局唯一后臺(tái)接口調(diào)用憑據(jù)(access_token)
????????///?</summary>
????????///?<returns></returns>
????????public?string?GetWechatAccessToken()
????????{
????????????var?appId?=?"你的小程序AppID";//小程序唯一憑證,即?AppID
????????????var?secret?=?"你的小程序AppSecret";?//小程序唯一憑證密鑰,即?AppSecret
????????????string?Url?=?string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}",?appId,?secret);
????????????string?Result?=?HttpWebRequest(Url,?"GET",?"",?Encoding.UTF8);
????????????var?obj?=?JsonConvert.DeserializeObject<AccessToken>(Result);
????????????if?(obj?!=?null?&&?obj.access_token?!=?null)
????????????{
????????????????return?obj.access_token;
????????????}
????????????else
????????????{
????????????????return?"";
????????????}
????????}
????????///?<summary>
????????///?WebRequest網(wǎng)絡(luò)請(qǐng)求
????????///?</summary>
????????///?<param?name="requestUrl">請(qǐng)求地址</param>
????????///?<param?name="method">請(qǐng)求方式(GET/POST)</param>
????????///?<param?name="data">請(qǐng)求參數(shù)(method="POST"需要攜帶)</param>
????????///?<param?name="encoding">字符編碼</param>
????????///?<param?name="contentType">請(qǐng)求數(shù)據(jù)的內(nèi)容類型</param>
????????///?<returns></returns>
????????public?string?HttpWebRequest(string?requestUrl,?string?method,?string?data,?Encoding?encoding,string?contentType="application/json;charset=UTF-8")
????????{
????????????WebRequest?webRequest?=?WebRequest.Create(requestUrl);
????????????webRequest.Method?=?method;
????????????if?(method?==?"POST")
????????????{
????????????????byte[]?bytes?=?Encoding.Default.GetBytes(data);
????????????????webRequest.ContentType?=?contentType;
????????????????webRequest.ContentLength?=?bytes.Length;
????????????????Stream?requestStream?=?webRequest.GetRequestStream();
????????????????requestStream.Write(bytes,?0,?bytes.Length);
????????????????requestStream.Close();
????????????}
????????????WebResponse?response?=?webRequest.GetResponse();
????????????Stream?responseStream?=?response.GetResponseStream();
????????????if?(responseStream?==?null)
????????????{
????????????????return?"";
????????????}
????????????StreamReader?streamReader?=?new?StreamReader(responseStream,?encoding);
????????????string?result?=?streamReader.ReadToEnd();
????????????responseStream.Close();
????????????streamReader.Close();
????????????return?result;
????????}
????///?<summary>
????///?響應(yīng)模型
????///?</summary>
????public?class?AccessToken
????{
????????///?<summary>
????????///?獲取到的憑證
????????///?</summary>
????????public?string?access_token?{?get;?set;?}
????????///?<summary>
????????///?憑證有效時(shí)間,單位:秒。目前是7200秒之內(nèi)的值
????????///?</summary>
????????public?int?expires_in?{?get;?set;?}
????????///?<summary>
????????///?錯(cuò)誤碼
????????///?</summary>
????????public?int?errcode?{?get;?set;?}
????????///?<summary>
????????///?錯(cuò)誤信息
????????///?</summary>
????????public?string?errmsg?{?get;?set;?}
????}
小程序碼獲取
請(qǐng)求地址:
-
POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
請(qǐng)求參數(shù):
請(qǐng)求成功返回值:
返回的圖片 Buffer(如果調(diào)用成功,會(huì)直接返回圖片二進(jìn)制內(nèi)容(圖片文件流),如果請(qǐng)求失敗,會(huì)返回 JSON 格式的數(shù)據(jù)。)
請(qǐng)求異常返回值:
請(qǐng)求代碼:
注意:這個(gè)與前面獲取授權(quán)憑證的網(wǎng)絡(luò)請(qǐng)求不同的是因?yàn)橐邮照?qǐng)求返回過(guò)來(lái)的圖片二進(jìn)制內(nèi)容(buffer),然后需要把二進(jìn)制文件流轉(zhuǎn)化為byte[]二進(jìn)制字節(jié)流,然后在轉(zhuǎn)化Image。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-856311.html
///?<summary>
????????///?獲取小程序碼圖片
????????///?</summary>
????????///?<param?name="access_token">接口調(diào)用憑據(jù)</param>
????????///?<param?name="param">攜帶參數(shù)</param>
????????private?Image?GetWetchatAppletQRCodeImage(string?access_token,?string?param)
????????{
????????????string?requestData?=?"{\"scene\":\""?+?param?+?"\"}";
????????????string?requestUrl?=?"https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="?+?access_token;
????????????HttpWebRequest?request?=?(HttpWebRequest)WebRequest.Create(requestUrl);
????????????request.Method?=?"POST";
????????????request.ContentType?=?"application/json;charset=UTF-8";
????????????byte[]?payload?=?System.Text.Encoding.UTF8.GetBytes(requestData);
????????????request.ContentLength?=?payload.Length;
????????????Stream?writer?=?request.GetRequestStream();
????????????writer.Write(payload,?0,?payload.Length);
????????????writer.Close();
????????????HttpWebResponse?response;
????????????response?=?(HttpWebResponse)request.GetResponse();
????????????Stream?stream?=?response.GetResponseStream();//獲取返回的圖片?Buffer(文件流)
????????????byte[]?imageBuffer?=?StreamToBytes(stream);
????????????return?ByteArrayConvertToImage(imageBuffer);
????????}
????????///?<summary>
????????///?將文件數(shù)據(jù)流轉(zhuǎn)為二進(jìn)制byte[]字節(jié)流
????????///?</summary>
????????///?<param?name="stream">文件流</param>
????????///?<returns></returns>
????????private?byte[]?StreamToBytes(Stream?stream)
????????{
????????????List<byte>?bytes?=?new?List<byte>();
????????????int?temp?=?stream.ReadByte();
????????????while?(temp?!=?-1)
????????????{
????????????????bytes.Add((byte)temp);
????????????????temp?=?stream.ReadByte();
????????????}
????????????return?bytes.ToArray();
????????}
????????///?<summary>
????????///?byte?[]?轉(zhuǎn)化為Iamge
????????///?</summary>
????????///?<param?name="buffer"></param>
????????///?<returns></returns>
????????public?static?Image?ByteArrayConvertToImage(byte[]?buffer)
????????{
????????????using?(MemoryStream?ms?=?new?MemoryStream(buffer))
????????????{
????????????????//?直接調(diào)用Image庫(kù)類中自帶的方法使用MemoryStream實(shí)例對(duì)象獲取Image
????????????????return?Image.FromStream(ms);
????????????}
????????}
小程序碼和背景圖合并
///?<summary>
????????///?小程序推廣二維碼獲取
????????///?</summary>
????????///?<param?name="userId">小程序碼攜帶的用戶參數(shù)</param>
????????///?<returns></returns>
????????public?JsonResult?GetCompositePictureUrl(int?userId)
????????{
????????????//圖片存放物理路徑
????????????var?savePhysicalPath?=?HttpContext.Request.MapPath("~/qrcode/");
????????????var?imgBack?=?Image.FromFile(savePhysicalPath?+?"ewm.jpg");//合成背景圖片
????????????var?wechatQrcodeImg?=?GetWetchatAppletQRCodeImage(GetWechatAccessToken(),userId.ToString());//獲取小程序碼圖片
????????????var?compositePictureUrl?=?CompositePicture(imgBack,?wechatQrcodeImg,?savePhysicalPath,?232,?719,?290,?290);
????????????return?Json(new?{?code?=?0,?compositePictureUrl?=?compositePictureUrl?});
????????}
????????///?<summary>
????????///?合成圖片
????????///?</summary>
????????///?<param?name="backgroundImage">背景圖</param>
????????///?<param?name="qrCodeImg">二維碼圖片</param>
????????///?<param?name="savePhysicalPath">圖片存放物理路徑</param>
????????///?<param?name="xDeviation">繪制圖像X軸偏差</param>
????????///?<param?name="yDeviation">繪制圖像Y軸偏差</param>
????????///?<param?name="width">繪制圖像寬</param>
????????///?<param?name="height">繪制圖像高</param>
????????///?<returns></returns>
????????public?string?CompositePicture(Image?backgroundImage,?Image?qrCodeImg,?string?savePhysicalPath,?int?xDeviation?=?0,?int?yDeviation?=?0,?int?width?=?0,?int?height?=?0)
????????{
????????????Bitmap?bitmap?=?new?Bitmap(backgroundImage.Width,?backgroundImage.Height);
????????????Graphics?graphics?=?Graphics.FromImage(bitmap);//繪圖
????????????graphics.Clear(Color.White);
????????????SolidBrush?surush?=?new?SolidBrush(Color.White);
????????????graphics.DrawImage(backgroundImage,?0,?0,?backgroundImage.Width,?backgroundImage.Height);
????????????graphics.DrawImage(qrCodeImg,?xDeviation,?yDeviation,?width,?height);
????????????GC.Collect();//垃圾清理
????????????string?compositePictureUrl?=?savePhysicalPath?+?Guid.NewGuid().ToString()?+?".jpg";
????????????//合成圖片保存
????????????bitmap.Save(compositePictureUrl,?System.Drawing.Imaging.ImageFormat.Jpeg);
????????????return?compositePictureUrl;
????????}
合成效果圖
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-856311.html
到了這里,關(guān)于.NET生成微信小程序推廣二維碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!