今天做一个项目,是在微信上用的,微信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" src="/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 src="/content/js/mui.min.js"></script>

<script type="text/javascript">

mui.init();

</script>

<script src="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项目中了

ASP.NET MVC做的微信WEBAPP中调用微信JSSDK扫一扫的更多相关文章

  1. Asp.net mvc web api 在项目中的实际应用

    Asp.net mvc web api 在项目中的实际应用 前言:以下只是记录本人在项目中的应用,而web api在数据传输方面有多种实现方式,具体可根据实际情况而定! 1:数据传输前的加密,以下用到 ...

  2. ASP.NET MVC 做的网站项目

    感谢博客园团队日夜为广大需要获取知识人们所做的奉献 博客园团队您们辛苦了 ASP.NET MVC 实现有论坛功能的网站(有iis发布网站 这是之前写的... www.lazyfitness.cn 经过 ...

  3. 微信网页开发调用微信jssdk接口遇到的坑以及最终解决方法 (持续更新)

    1.微信网页开发调用jssdk时报permission denied 大致是两个原因 (1)首先注册时未将你所调用的接口名字添加至jsApiList (2)第二个就是你的这个公众号没有权限使用这个ap ...

  4. ASP.NET MVC 学习4、Controller中添加SearchIndex页面,实现简单的查询功能

    参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-method ...

  5. [小技巧][ASP.Net MVC Hack] 使用 HTTP 报文中的 Header 字段进行身份验证

    在一些 Web 系统中,身份验证是依靠硬件证书进行的:在电脑上插入 USB 证书,浏览器插件读取证书的相关信息,然后在发送 HTTP 登录请求时顺便在 Header 字段附加上身份信息.服务器端处理这 ...

  6. asp.net mvc,做 301 永久重定向

    以下代码为 asp.net mvc 4.0 代码做的 301 永久重定向 string url = “http://www.csdn.net/test.html” Response.StatusCod ...

  7. asp.net mvc Partial OutputCache 在SpaceBuilder中的应用实践

    最近给SpaceBuilder增加OutputCache 时发现了一些问题,贴在这做个备忘,也方便遇到类似问题的朋友查阅. 目前SpaceBuilder表现层使用是asp.net mvc v1.0,使 ...

  8. 在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下:

    Asp.net MVC中的ViewData与ViewBag ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从Asp.net MVC 1 就有了 ASP. ...

  9. ASP.NET MVC 学习8、Controller中的Detail和Delete方法

    参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-details-and ...

随机推荐

  1. android 安装调试第三方应用失败

    Android Studio 3.0会在debug apk的manifest文件application标签里自动添加 android:testOnly="true"属性,导致IDE ...

  2. 【Fanvas技术解密】HTML5 canvas实现脏区重绘

    先说明一下,fanvas是笔者在企鹅公司开发的,即将开源的flash转canvas工具. 脏区重绘(dirty rectangle)并不是一门新鲜的技术了,这在最早2D游戏诞生的时候就已经存在. 复杂 ...

  3. 分享自己针对Automation做的两个成熟的框架(QTP 和Selenium)

    自己在google code中开源了自己一直以来做的两个自动化的框架,一个是针对QTP的一个是针对Selenium的,显而易见,一个是商业的UI automation工具,一个是开源的自动化工具. 只 ...

  4. visual studio运行时库MT、MTd、MD、MDd的研究

    在开发window程序是经常会遇到编译好好的程序拿到另一台机器上面无法运行的情况,这一般是由于另一台机器上面没有安装响应的运行时库导致的,那么这个与编译选项MT.MTd.MD.MDd有什么关系呢?这是 ...

  5. SSM框架中,配置数据库连接的问题

    MySQL数据库版本是8.0.11. 要用驱动:com.mysql.cj.jdbc.Driver 最主要的是数据库的连接url. 搞了半天才把问题搞明白: 数据库url后面要加上参数: jdbc:my ...

  6. 转:体积阴影(Shadow Volumes)生成算法

    下面以最快的速度简单谈谈阴影生成技术,目前普遍采用的一般有三种:Planar Shadow.Shadow Mapping和Shadow Volume,前者类似投影,计算最简单,缺点只能绘制抛射在平面上 ...

  7. masonry瀑布流的使用

    今天在使用masonry.pkgd.min.js瀑布流的时候遇到一个很奇怪的问题,官网显示正常,而我的就是显示不正确,然后我又查看一遍,原来要加这段代码就ok了,记录一下,怕以后还会遇到这个问题 *, ...

  8. 删除现有的Recipient再重新添加选中的Contacts

    @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {     super. ...

  9. jsp路径问题之base

    <base href="<%=basePath%>"> base 标记用于指定页面中所有相对路径的基点, 而默认的相对路径的基点是页面所在路径. 测试代码如 ...

  10. 工作8年对技术学习过程的一些 总结 与 感悟 为什么有时迷茫、无奈 学习编程语言的最高境界最重要的是编程思想 T 字发展 学技术忌讳”什么都会“ 每天进步一点等式图 时间管理矩阵

    工作这些年对技术学习过程的一些 总结 与 感悟(一) 引言 工作了8年,一路走来总有些感触时不时的浮现在脑海中.写下来留个痕迹,也顺便给大家一点参考.希望能给初学者一点帮助. 入门 进入计算机行业,起 ...