为了账号安全,请及时绑定邮箱和手机立即绑定

ASP.NET MVC做的微信WEBAPP中调用微信JSSDK扫一扫

标签:
C#

今天做一个项目,是在微信上用的,微信WEB APP,里面用到了调用手机摄像头扫一扫二维码的功能,记得以前某个项目里写有的,但是找不到之前那个项目源码了,想复制粘贴也复制不了了,只好对着微信的那个开发文档重新再写过 ,顺便写个博客,以后碰到相同的问题直接复制博客里的代码就行了
以下是显示在微信上的页面:
图片描述
以下是页面的代码,(用到了MUI):

@{
Layout = "~/Views/Shared/_Layout.cshtml";
}

<header class="mui-bar mui-bar-nav">
<h1 class="mui-title">扫码认证</h1>
</header>
<div class="mui-content">
<div style="text-align: center; padding:0.5rem; background: white;">
<img id="img_shaoma" class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="/content/images/shaoma.png" style="width:100px;" />
</div>
<div style="margin-top:0.5rem;padding:2rem; text-align: center; background:white;">
<input id="txtyzm" type="text" placeholder="输入认证码验证产品" />
<button type="button" class="mui-btn mui-btn-success">点击认证</button>
</div>
</div>

@section script{
<script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="/content/js/mui.min.js"></script>
<script type="text/javascript">
mui.init();
</script>
<script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script>
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: "@ViewBag.appid", // 必填,企业号的唯一标识,此处填写企业号corpid
timestamp: @ViewBag.timestamp, // 必填,生成签名的时间戳
nonceStr: "@ViewBag.noncestr", // 必填,生成签名的随机串
signature: "@ViewBag.signature",// 必填,签名,见附录1
jsApiList: ['scanQRCode'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});

    wx.ready(function () {
        // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
        document.getElementById('img_shaoma').addEventListener('tap', function () {
            wx.scanQRCode({
                needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
                scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是一维码,默认二者都有
                success: function (res) {
                    var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
                   // mui.alert("扫码结果:" + result);
                    document.getElementById("txtyzm").value = result;
                }
            });
        })
    });

</script>

}

以下是对应的控制器后台代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Niunan.NiaoRen.Web.Areas.Seller.Controllers
{
public class ShaoMaController : Controller
{
//卖家中心-扫码页面
public ActionResult Index()
{

region 用到微信扫一扫接口需要用的东西
        WxPayAPI.NiunanWXHelper wxhelper = new WxPayAPI.NiunanWXHelper();
        WxPayAPI.WxPayData config_data = wxhelper.GetJSSDKConfig();
        ViewBag.appid = config_data.GetValue("appId");
        ViewBag.timestamp = config_data.GetValue("timestamp");
        ViewBag.noncestr = config_data.GetValue("nonceStr");
        ViewBag.signature = config_data.GetValue("signature"); 
        #endregion
        return View();
    }
}

}
以下是NiunanWXHelper 的代码,用到了一些原来微信官方DEMO里的一些方法,所以创建在了微信官方DEMO的那个项目中:
using LitJson;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Security;

/// <summary>
/// 牛腩自己写的微信helper
/// https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
/// </summary>
namespace WxPayAPI
{
public class NiunanWXHelper
{
/// <summary>
/// 返回使用微信JS-SDK接口的配置
// appId: @ViewBag.wx_appid, // 必填,企业号的唯一标识,此处填写企业号corpid
// timestamp: @ViewBag.wx_timestamp, // 必填,生成签名的时间戳
// nonceStr: @ViewBag.wx_noncestr, // 必填,生成签名的随机串
// signature: @ViewBag.wx_signature,// 必填,签名,见附录1
/// </summary>
/// <returns></returns>
public WxPayData GetJSSDKConfig()
{
string appid = WxPayConfig.APPID;
string secret = WxPayConfig.APPSECRET;
string timestamp = WxPayApi.GenerateTimeStamp();
string noncestr = WxPayApi.GenerateNonceStr();
string signature = "";

        //签名算法  https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
        //1. 获取AccessToken(有效期7200秒,开发者必须在自己的服务全局缓存access_token)
        string url1 = $"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={secret}";
        string result = HttpService.Get(url1);
        JsonData jd = JsonMapper.ToObject(result);
        string access_token = (string)jd["access_token"];

        //2. 用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket)
        string url2 = $"https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={access_token}&type=jsapi";
        string result2 = HttpService.Get(url2);
        JsonData jd2 = JsonMapper.ToObject(result2);
        string ticket = (string)jd2["ticket"];

        //3. 开始签名
        string now_url = HttpContext.Current.Request.Url.AbsoluteUri;
        string no_jiami = $"jsapi_ticket={ticket}&noncestr={noncestr}&timestamp={timestamp}&url={now_url}";
        //SHA1加密
        signature = FormsAuthentication.HashPasswordForStoringInConfigFile(no_jiami, "SHA1");

        WxPayData data = new WxPayData();
        data.SetValue("appId", appid);
        data.SetValue("timestamp", timestamp);
        data.SetValue("nonceStr", noncestr);
        data.SetValue("signature", signature);

        Log.Debug(this.GetType().ToString(), "使用微信JS-SDK接口的配置 : " + data.ToPrintStr());

        return data;
    }
}

}

从官网下载的DEMO是ASPX的,我把里面的lib文件夹和business文件夹抽出来放到WXPAYAPI项目中了
图片描述

点击查看更多内容
3人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消