微信扫一扫调用失败解决方案

现实项目中业务需要开发微信公众号,业务场景其中有需求要使用微信扫一扫,奇怪的问题产生了,第一次进入页面的时候调用成功没有问题,当做别的操作之后,在点击调用微信扫一扫 发现无路如何都调用不起来了。

微信JS-SDK说明文档官网 

http://caibaojian.com/wxwiki/0030551f015f01ecaa56d20b88ee3c6cb32503bf.html#JSSDK.E4.BD.BF.E7.94.A8.E6.AD.A5.E9.AA.A4

在微信JS-SDK说明文档官网 找了很久也没有跟我相同的案例,多番测试之后发现是URL 的问题才导致了调用微信扫一扫调用不起来了 ,下面用我的例子来说明情况

 

第一次进入页面时,点击扫描后打印出来的URL 是没有拼接任何的参数,这个时候去调用微信扫一扫是成功的没有问题的

微信扫一扫调用失败解决方案_第1张图片

奇怪的问题产生了 当做别的操作之后,在点击调用微信扫一扫 发现无路如何都调用不起来了,原因就是因为的请求URL中 拼接了其他的参数,这样就导致了微信解析我的URL 的解析失败,因为我们调用微信端的接口值其实微信还要在我们的URL中拼接一些其他的参数,所以在这里就明白到了 调用微信扫一扫时 URL 不允许拼接有任何的参数。

微信扫一扫调用失败解决方案_第2张图片

 

本人解决方案 在增加一个刷新按钮 重定向URL  这样调用微信扫一扫就可以成功了

点击刷新后重定向的URL 

微信扫一扫调用失败解决方案_第3张图片

 

完整的jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@include file="/context/mytags.jsp"%>
<%--  --%>



上架列表







	
             

扫描入库码    刷新    编辑上架    返回
选择 编码 名称 材质 规格 总数
${m.skusysno } ${m.skuname} ${m.groupname3} ${m.groupname1} ${m.umqty}
<%-- --%>

 

 

后台刷新后重定向URL 方法

package com.szerp.wechat.contoller.cangku;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.jeecgframework.core.common.exception.BusinessException;
import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery;
import org.jeecgframework.core.common.model.json.DataGrid;
import org.jeecgframework.core.util.StringUtil;
import org.jeecgframework.web.system.service.SystemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.alibaba.fastjson.JSONObject;
import com.szerp.wechat.util.CurrencyUtil;
import com.szerp.wechat.util.Sign;
import com.szerp.wechat.util.TokenUtil;
import com.szerp.wmstask.entity.LWmsTaskdetailsEntity;
import com.szerp.wmstask.service.LWmsTasksServiceI;
import com.szerp.wmstask.service.ReceiptTask;

import net.sf.json.JSONArray;

/**
 * 微信上架接口实现类;
 * 
 * @author zhanguoqiang
 * @date 2020-02-17
 * 
 */
@Scope("prototype")
@Controller			
@RequestMapping("/UpperShelf")
public class UpperShelfController{
    @Autowired
    private LWmsTasksServiceI lWmsTasksService;
    @Autowired
    private ReceiptTask receiptTaskImpl;
	@Autowired
	private SystemService systemService;
	
	@Autowired
	@Qualifier("sessionFactory")
	private SessionFactory sessionFactory;

	private static final Logger logger = Logger.getLogger(UpperShelfController.class); // 日志类
	private String message; // 接口返回提示信息

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
	
	public Session getSession()
	  {
	     return sessionFactory.getCurrentSession();
	  }
	
	  private static Properties properties = new Properties();
	

	

	
	

	

	
	
	
	
	/**
	 * 把扫码需要的参数传到HttpServletRequest 当中传到页面
	 * @param request
	 */
	
	public void setRequest(HttpServletRequest request){
		// 1.获取token
		TokenUtil tokenutil=new TokenUtil();
        String access_token = tokenutil.seekToken(request);
		//String access_token = null;
		String apiticket = null;
		try {
			//将jsapi_ticket、noncestr、timestamp、url拼接,使用SHA1加密算法,最终生成签名
		     if (access_token == null) {
					String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
							+ "公众号ID" + "&secret=" + "公众号秘钥";
					JSONObject jsonStrToken = CurrencyUtil.doGetStr(url) ;
					access_token = jsonStrToken.getString("access_token");
				}

				if (null == apiticket) {
					String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="
							+ access_token + "&type=jsapi";
					JSONObject jsonStrTicket = CurrencyUtil.doGetStr(url);
					apiticket = jsonStrTicket.getString("ticket");
				} 
				String url = request.getRequestURL().toString();
				String	jsapi_ticket = apiticket;
				Map  signMap = Sign.sign( jsapi_ticket,  url);
				request.setAttribute("timestamp", signMap.get("timestamp"));
				request.setAttribute("nonceStr", signMap.get("nonceStr"));
				request.setAttribute("signature", signMap.get("signature"));
		} catch (Exception e) {
			e.printStackTrace();
			logger.info("request存值报错:"+e.getMessage());
		}
		
	}
	
	 // 
	@RequestMapping(value = "doconfig")
	public ModelAndView doconfig(HttpServletRequest request, HttpServletResponse response) {
		try {
			/**
			 * 把扫码需要的参数传到HttpServletRequest 当中传到页面
			 * @param request
			 */
			this.setRequest(request);
			Properties prop = PropertiesLoaderUtils.loadProperties(new ClassPathResource("sysConfig.properties"));
			String local = prop.getProperty("local");
			String site="";
			//本地
			if("1".equals(local)){
				String wechatLocalUrl = prop.getProperty("wechatLocalUrl");
				site = new String(wechatLocalUrl+"UpperShelf/doSaoMa");
			}else if("2".equals(local)){//外网
				String wechatUrl = prop.getProperty("wechatUrl");
				site = new String(wechatUrl+"UpperShelf/doSaoMa");
			}
		   // 重定向到新地址
		   response.setStatus(response.SC_MOVED_TEMPORARILY);
		   response.setHeader("Location", site); 	
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("获取扫码接口报错" + e.getMessage());
		}

		return new ModelAndView("WeChat/upperShelf/upperShelfList");
	}
	
	#本地 1  外网 2
local=1
#wechat 路径
wechatLocalUrl=http://localhost:8080/项目名/rest/
wechatUrl=https://公众号域名/rest/
	
}

 

你可能感兴趣的:(微信公众号)