网站搜索框使用微信扫码功能

背景

客户要求可以直接识别标签二维码对某些仪器设备进行管理,类似于淘宝搜索框可以直接拍照搜索商品一样。前面已经做了一个网页调用摄像头识别二维码的功能,此功能有两个缺陷:

  • 识别需要先拍照,不能直接识别
  • 识别率低,尤其是拍照抖动,二维码内容稍微多一点或二维码小一点就识别不了。

以上两点相加就相当不好用了。

使用微信扫码

鉴于我们的系统已经集成到了微信公众号,所以准备调用微信扫码(只有在微信内打开的页面才能使用微信扫码)。
参照官方文档

绑定域名

打开公众号设置

选择功能设置

添加JS接口安全域名,注意你添加的域名目录下面上次图中微信指定的文件,如果文件没在根目录,域名需要填写到子目录

引入JS文件

使用vs2019创建默认的asp.net mvc项目

在index.cshtml页面中使用的页面引用js

<script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>

前端主要代码

$(function () {
  /**
   * 判断是否微信内部打开页面
   * */
  function isWeiXin() {
    var ua = window.navigator.userAgent.toLowerCase();
    console.log(ua);//mozilla/5.0 (iphone; cpu iphone os 9_1 like mac os x) applewebkit/601.1.46 (khtml, like gecko)version/9.0 mobile/13b143 safari/601.1
    if (ua.match(/MicroMessenger/i) == 'micromessenger') {
      return true;
    }
    else {
      return false;
    }
  }
  /**
   * 只有微信内部页面打开才能用
   * */
  if (isWeiXin()) {
    $.ajax({
      type: "post",
      url: "/Home/GetSingDataAsync",
      data: {
        "url": location.href.split('#')[0]
      },
      dataType: "json",
      success: function (data) {
        alert(JSON.stringify(data));
        wx.config({
          debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
          appId: data.appId, // 必填,公众号的唯一标识
          timestamp: data.timestamp, // 必填,生成签名的时间戳
          nonceStr: data.nonceStr, // 必填,生成签名的随机串
          signature: data.signature,// 必填,签名,见附录1
          jsApiList: [
            'checkJsApi',
            'startRecord',
            'stopRecord',
            'translateVoice',
            'scanQRCode',// 微信扫一扫接口
            'openCard'
          ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
        });
        wx.error(function (res) {
          alert("出错了:" + res.errMsg);//这个地方的好处就是wx.config配置错误,会弹出窗口哪里错误,然后根据微信文档查询即可。
        });
        wx.ready(function () {
          wx.checkJsApi({
            jsApiList: ['scanQRCode'],
            success: function (res) {
              //扫描二维码
              wx.scanQRCode({
                needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
                scanType: ["qrCode"], // 可以指定扫二维码还是一维码,默认二者都有
                success: function (res) {
                  var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
                  alert(result);//因为我这边是扫描后有个链接,然后跳转到该页面
                },
                error: function () {
                  console.log('123');
                }
              });
            }
          });
        });
      },
      error: function (url) {
        alert("An error occurred!");
      }
    });
  } else {
    alert("请使用微信打开");
  }
}) 

后端代码

public class HomeController : Controller
{
  //把APPID和APP_SECRET换成你自己的
  private const string APPID = "******";
  private const string APP_SECRET = "******";
  //为了调试方便我这里第一次把Token和Ticket获取到之后就写死了,应该写入缓存(7200s过期)
  private static string Token = "24_cQsz9scwyXLnPaAes5JlfHTfuQ2e3Iw5L8JyWfUpQiMnTk4IToOTZ7dP0Fv190ZHTy5ST--jeuDzYwoUj_hvhSHDX288YYLYVcrmvMzRPwld8ccTTzWGNTKZz53jYKDy5f8U1E886msDPsrwORGbAJABET";
  private static string Ticket = "HoagFKDcsGMVCIY2vOjf9qZA_fkPP3enjnT58qu16hzZN-3kwAP0NK6jgQM0jyAc0sK8cxaGkT9_DSgp6cHCpw";
  public ActionResult Index()
  {

    return View();
  }

  public ActionResult About()
  {
    ViewBag.Message = "Your application description page.";

    return View();
  }

  public ActionResult Contact()
  {
    ViewBag.Message = "Your contact page.";

    return View();
  }

  public async Task GetToken()
  {
    await GetTicketAsync();
  }
  //获取token和ticket
  private async Task<string> GetTicketAsync()
  {

    var tokenUrl = $"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APP_SECRET}";

    var client = new System.Net.WebClient();
    client.Encoding = Encoding.UTF8;
    client.Headers.Add("Content-Type", "Application/x-www-form-urlencoded");
    var responseData = client.UploadData(tokenUrl, "POST", new byte[0]);
    var responseText = Encoding.UTF8.GetString(responseData);
    var token = JsonConvert.DeserializeAnonymousType(responseText, new { access_token = "", expires_in = "" });

    Token = token.access_token;
    var ticketUrl = $"https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={Token}&type=jsapi";
    var ticResponseData = client.UploadData(ticketUrl, "POST", new byte[0]);
    var ticResponseText = Encoding.UTF8.GetString(ticResponseData);
    var ticket = JsonConvert.DeserializeAnonymousType(ticResponseText, new { errcode = "", errmsg = "", ticket = "", expires_in = "" });
    Ticket = ticket.ticket;
    return "";
  }
  //获取签名字符串
  public async Task<string> GetSingDataAsync(string url)
  {

    var sign = new SignData();
    sign.appId = APPID;
    sign.nonceStr = Create_nonce_str();
    sign.timestamp = Create_timestamp();
    //var url = Request.Url.AbsoluteUri;
    if (url.IndexOf('#') > 0)
    {
      url = url.Substring(0, url.IndexOf('#'));
    }
    sign.url = url;
    var string1 = "jsapi_ticket=" + Ticket +
        "&noncestr=" + sign.nonceStr +
        "&timestamp=" + sign.timestamp +
        "&url=" + sign.url;

    //var string1 = GetTestSign();

    var sha1 = SHA1.Create();
    sign.signature = ByteToHex(sha1.ComputeHash(Encoding.UTF8.GetBytes(string1)));
    return JsonConvert.SerializeObject(sign);
  }
  //测试签名字符串,和微信官方提供的一样,用来测试签名方法是否正确
  private string GetTestSign()
  {
    var nonceStr = "Wm3WZYTPz0wzccnW";
    var ticket = "sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg";
    var timestamp = "1414587457";
    var url = "http://mp.weixin.qq.com?params=value";
    var string1 = "jsapi_ticket=" + ticket +
        "&noncestr=" + nonceStr +
        "&timestamp=" + timestamp +
        "&url=" + url;
    return string1;
  }

  /// <summary>
  /// 随机字符串
  /// </summary>
  /// <returns></returns>
  private string Create_nonce_str()
  {
    return Guid.NewGuid().ToString().Substring(0, 8);
  }
  /// <summary>
  /// 时间戳
  /// </summary>
  /// <returns></returns>
  private string Create_timestamp()
  {
    return (DateTime.Now.Ticks / 100000000).ToString();
  }
  private string ByteToHex(byte[] hash)
  {
    var sb = new StringBuilder();
    foreach (var b in hash)
    {
      sb.Append(b.ToString("x2"));
    }
    return sb.ToString();
  }
}

代码已上传github

总结

以上所述是小编给大家介绍的网站搜索框使用微信扫码功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 详解JAVA后端实现统一扫码支付:微信篇

    最近做完了一个项目,正好没事做,产品经理就给我安排了一个任务. 做一个像收钱吧这样可以统一扫码收钱的功能. 一开始并不知道是怎么实现的,咨询了好几个朋友,才知道大概的业务流程:先是开一个网页用来判断支付平台,是微信还是支付宝,判断过后就好办了,直接照搬微信支付和支付宝的官方文档.不过微信的文档感觉有点坑,得多花点心思. 现在讲讲怎么实现微信支付网页支付,也就是公众号支付: 1.判断支付平台,在判断是微信平台时,必须使用window.location打开网页,使用其他方法在IOS版微信无法打开网页

  • PC 端微信扫码注册和登录实例

    PC 端微信扫码注册和登录 一.前言 先声明一下,本文所注重点为实现思路,代码及数据库设计主要为了展现思路,如果对代码效率有着苛刻要求的项目切勿照搬. 相信做过微信开发的人授权这块都没少做过,但是一般来说我们更多的是为移动端的网站做授权,确切来说是在微信端下做的一个授权.今天遇到的一个问题是,项目支持微信端以及 PC 端,并且开放注册.要求做到无论在 PC 端注册或者是在微信端注册之后都可以在另外一个端进行登录.也就是说无论 PC 或是微信必须做到"你就是你"(通过某种方式关联). 二

  • php实现微信扫码自动登陆与注册功能

    本文实例讲述了php实现微信扫码自动登陆与注册功能.分享给大家供大家参考,具体如下: 微信开发已经是现在程序员必须要掌握的一项基本的技术了,其实做过微信开发的都知道微信接口非常的强大做起来也非常的简单,这里我们一起来看一个微信自动登陆注册的例子. php 微信扫码 pc端自动登陆注册 用的接口scope 是snsapi_userinfo,微信登陆一个是网页授权登陆,另一个是微信联合登陆 网页授权登陆:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b647

  • jQuery实现的类似淘宝网站搜索框样式代码分享

    运行效果图:                                                ----------------------查看效果----------------------- 小提示:浏览器中如果不能正常运行,可以尝试切换浏览模式. 为大家分享的类似淘宝网站搜索框样式代码如下 <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo

  • php实现微信原生支付(扫码支付)功能

    网上的很多PHP微信扫码支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,只有200行代码,希望可以给各位想接入微信扫码支付的带来些许帮助和借鉴意义. 直接运行该文件即可得到一个支付二维码的图片. 需要注意的事项: 1.该文件需放到支付授权目录下,可以在微信支付商户平台->产品中心->开发配置中设置. 2.如提示签名错误可以通过微信支付签名验证工具进行验证:微信公众平台支付接口调试工具 代码如下: <?php header('Content-type:

  • 分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件

    最近比较工作比较轻松,帮一个朋友的基于ecshop开发的商城加入微信扫描支付功能,本以为是很简单的事儿--下载官方sdk或开发帮助文档,按着里面的做就ok了,谁知折腾了两三天的时间才算搞定,中间也带着疑问在网上找了不少技术文章,却发现都只是比较粗略的写他们是怎么开发接入的,并没有解决我遇到的问题...,唉,有时候真心的感觉'只能靠自己'. 本文就是想把自己遇到的问题及解决办法写出来,让做这方面开发的朋友有所帮助! 开发之前,先查看官方[扫码支付]开发文档,扫码支付分为以下两种模式: △模式一:

  • .NET微信开发之PC 端微信扫码注册和登录功能实现

    一.前言 先声明一下,本文所注重点为实现思路,代码及数据库设计主要为了展现思路,如果对代码效率有着苛刻要求的项目切勿照搬. 相信做过微信开发的人授权这块都没少做过,但是一般来说我们更多的是为移动端的网站做授权,确切来说是在微信端下做的一个授权.今天遇到的一个问题是,项目支持微信端以及 PC 端,并且开放注册.要求做到无论在 PC 端注册或者是在微信端注册之后都可以在另外一个端进行登录.也就是说无论 PC 或是微信必须做到"你就是你"(通过某种方式关联). 二.寻找解决方案 按传统的方式

  • 自定义PC微信扫码登录样式写法

    PC微信扫码登录 近期做一个PC端微信扫码登录的需求,微信扫码有两种方式,一种是新开一个二维码页面,另一种是内嵌入产品网页.本次以内嵌二维码为例,具体怎样在页面中显示一个登陆二维码,文档说的很清楚,就不赘述了,文档地址:https://open.weixin.qq.com/cg... 解决自定义微信二维码样式问题 当一切准备妥当之后,网页上的二维码初始默认是这个样子. 特别大不说(默认二维码大小280x280),还有微信登录的title,下方也有扫码登录的提示. 幸运的是,微信留了一个api给我

  • java实现网站微信扫码支付

    一.网站微信扫码支付开发并没有现成的java示例,总结一下自己微信扫码支付心得 二.首先去微信公众平台申请账户 https://mp.weixin.qq.com ** 三.账户开通.开发者认证之后就可以进行微信支付开发了 1.微信统一下单接口调用获取预支付id,以及生成二维码所需的codeUrl /** * 保存订单,并生成二维码所需的codeUrl * * @param request * @param response * @param notifyURLBuf * @param order

  • 网站搜索框使用微信扫码功能

    背景 客户要求可以直接识别标签二维码对某些仪器设备进行管理,类似于淘宝搜索框可以直接拍照搜索商品一样.前面已经做了一个网页调用摄像头识别二维码的功能,此功能有两个缺陷: 识别需要先拍照,不能直接识别 识别率低,尤其是拍照抖动,二维码内容稍微多一点或二维码小一点就识别不了. 以上两点相加就相当不好用了. 使用微信扫码 鉴于我们的系统已经集成到了微信公众号,所以准备调用微信扫码(只有在微信内打开的页面才能使用微信扫码). 参照官方文档 绑定域名 打开公众号设置 选择功能设置 添加JS接口安全域名,注

  • java实现微信扫码登录第三方网站功能(原理和代码)

    目录 一.查看微信扫码登录官方文档 二.实现微信第三方登录流程: 三.代码实现: 为避免繁琐的注册登陆,很多平台和网站都会实现三方登陆的功能,增强用户的粘性.这篇文章主要介绍了java实现微信扫码登录第三方网站功能(原理和代码),避免做微信登录开发的朋友们少走弯路. 一.查看微信扫码登录官方文档 官方文档:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&

  • 微信小程序自定义扫码功能界面的实现代码

    小程序的一个扫码页面,扫码界面一直开着,同时可以处理其他功能,如下: 由于直接调用微信的scanCode,无法自定义界面,所以只能使用原生组件camera,完成这个功能,关于扫描框的四个角的图片,就自己画一下吧,中间的移动横线,使用了小程序的动画功能,在原生camera组件上,覆盖需要用到cover-view和cover-image,同时加入了提示音 /**scan.wxss**/ .scan-view {   width: 100%;   height: 100%;   display: fl

  • SpringBoot整合Vue实现微信扫码支付以及微信退款功能详解

    直接上代码,在order模块添加依赖 <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</version> </dependency> 在配置类添加申请的商家号信息 #关联的公众号appid weixin.pay.appid=wxXXXXXXX #商户号 weixi

  • Spring Boot实现微信扫码登录功能流程分析

    目录 1. 授权流程说明 第一步:请求CODE 第二步:通过code获取access_token 第三步:通过access_token调用接口 2. 授权流程代码 3. 用户登录和登出 4. Spring AOP校验用户有没有登录 5. 拦截登录校验不通过抛出的异常 微信开放平台:微信扫码登录功能 官方文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html 1. 授权

  • 基于 Swoole 的微信扫码登录功能实现代码

    随着微信的普及,扫码登录方式越来越被现在的应用所使用.它因为不用去记住密码,只要有微信号即可方便快捷登录.微信的开放平台原生就有支持扫码登录的功能,不过大部分人还是在用公众平台,所以扫码登录只能自行实现.这里基于微信公众平台的带参数临时二维码,并且结合 Swoole 的 WebSocket 服务实现扫码登录.大体流程如下: 客户端打开登录界面,连接到 WebSocket 服务 WebScoket 服务生成带参数二维码返回给客户端 用户扫描展示的带参数二维码 微信服务器回调扫码事件并通知开发者服务

  • 企业微信扫码登录网页功能实现代码

    企业微信扫码登录网页功能,代码如下所示: //jq写法完善版 <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <title>信息平台</title> <script src="http://res

随机推荐