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

今天做一个项目,是在微信上用的,微信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项目中了

时间: 2024-11-09 00:55:00

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

asp.net mvc 做的问卷调查如何把用户提交的数据录入到后台

问题描述 asp.net mvc 做的问卷调查如何把用户提交的数据录入到后台 asp.net mvc 做的问卷调查如何把用户提交的数据录入到后台 如图所示 解决方案 通过 post 提交网页,将数据存到服务器中 解决方案二: ①首先写个js提交方法,获取单选按钮的值,然后利用比如ajax的post方式或者get方式提交后台即可: ②在对应页面的controller里写代码,保存数据库即可.

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

最近给SpaceBuilder增加OutputCache 时发现了一些问题,贴在这做个备忘,也方便遇到类似问题的朋友查阅. 目前SpaceBuilder 表现层使用是asp.net mvc v1.0,使用了很多RenderAction(关于asp.net mvc的Partial Requests参见Partial Requests in ASP.NET MVC) .希望对于实时性要求不高的内容区域采用客户端缓存来提升性能同时也弥补一下RenderAction对性能的损失. 使用asp.net m

Asp.net Mvc Framework可以在Controller中使用的Url.Action方法

原本的Url.Action方法是利用RouteCollection来实现Url的Routing的. 所以这里用一个扩展方法重现一下 using System.Web.Routing; static public class CUrl { public static string Action(this Controller c, string controller, string action) { RouteValueDictionary rvd = new RouteValueDiction

微信支付中的刷卡支付和扫码支付测试

微信支付太坑了.官网下载的SDK,改了商户 ID和APPID等测试 都没用,仔细看了一下,原来首页默认调用的都是网上的页面,真是大坑 ..还有配置里的IP是8.8.8.8 ,用这个有时是会出错的,得改成自己的IP如:180.136.145.94 坑啊坑啊坑啊坑.

对ASP.NET MVC项目中的视图做单元测试

关于视图的单元测试 说到ASP.NET MVC,我们似乎始终都在关注对于Controller的测试--虽然Stephen Walther也写过如 何脱离Web Server对View进行单元测试,但是他的方法可看而不可用.复杂的构造和预备,以及对生成的 HTML字符串作判断--这真是在对视图做单元测试吗?仔细分析他的代码可以发现,这其实是在对 ViewEngine做单元测试.而且,如果真要对ViewEngine做单元测试,也不应该像他那样依赖外部文件.在 我看来,他的做法什么都不是--似乎美观,

[转自JeffreyZhao]不妨来做个尝试:UpdatePanel for ASP.NET MVC

原文地址:http://www.cnblogs.com/JeffreyZhao/archive/2008/04/27/try-to-build-an-updatepanel-for-asp-dot-net-mvc.html 先来发一通牢骚. 其实这是一篇迟发布近2个月的文章.事实上在ASP.NET MVC Preview 2发布之前我就已经将这篇文章的所有内容准备完毕了.当时想,就等Preview 2发布吧,而真一旦Preview 2发布之后却又懒得进行移植--移植了之后却又懒得写文章.这一拖就

ASP.NET MVC之AJAX

本文的例子基于Asp.Net MVC Preview 3,并采用了jQuery完成客户端的JavaScript功能. 之前的两篇文章粗粗的对Asp.Net MVC做了介绍.这里强烈推荐一个网站,有兴趣的朋友可以看这里.这是Rob Conery的个人网站,他采用了Asp.Net MVC做了一个Demo, 不仅在codeplex上提供了这个项目的源代码,还提供了15个视频,这些视频的内容包括从项目的构思.到设计.再到实现和重构的一个完整的过程. ASP.NET Web Form下的AJAX 在传统的

asp net mvc 跨控制器-asp.net mvc 怎么实现跨 controller 传参数?

问题描述 asp.net mvc 怎么实现跨 controller 传参数? 先来描述一下我的问题吧,asp.net mvc 在一个控制器的action中,有一个 list集合,要传到 另一个controller的action中,我知道的:1如果是同一个controller 可以 用this.(action名)来调用.因为是不同的controller所以不行.2还可以用RedirectToAction 输入控制器名,action名,然后是要传的参数,这样做,服务器会发一个302到浏览器,然后浏览

[转自Scott]ASP.NET MVC框架(第四部分): 处理表单编辑和提交场景

英文原文地址:http://weblogs.asp.net/scottgu/archive/2007/12/09/asp-net-mvc-framework-part-4-handling-form-edit-and-post-scenarios.aspx 翻译原文地址:http://blog.joycode.com/scottgu/archive/2007/12/10/112465.aspx 过去的几个星期内,我一直在写着讨论我们正在开发的新ASP.NET MVC框架的系列贴子.ASP.NET