2018-06-22 17:23:47 qq_36500554 阅读数 163
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27752 人正在学习 去看看 秦子恒
       今天整理一下微信开发展示当前位置的相关内容。
 
       开发环境参考:微信开发(一)--分享接口 点击打开链接

       一.页面配置:

                  设置jsp页面显示

<div class="weui_cells">
						<div class="weui_cell">
							<div class="weui_cell_select">
								<label class="weui-form-preview__label"><span style="color:red;"></span>当前位置: </label>
							</div>
							<div class="weui_cell_bd weui_cell_primary">
								<textarea id="signArea" name="signArea" readonly="readonly" class="weui_textarea" rows="3">位置获取中...</textarea>
							</div>
						</div>
					</div>
       二.js获取凭证 调用位置接口:  

                备注:获取jssdk配置可以参考前两篇文章。

/* 初始化jssdk */
	$.get("${basePath}/jssdk/config.do",{url:window.location.href},function(data,status){
		if(status == "success"){
			wx.config({
			    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
			    appId: data.appId, // 必填,公众号的唯一标识
			    timestamp: data.timestamp, // 必填,生成签名的时间戳
			    nonceStr: data.nonceStr, // 必填,生成签名的随机串
			    signature: data.signature,// 必填,签名,见附录1
			    jsApiList: ['getLocation'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2   获取地理位置接口  
			 
			});
			wx.ready(function(){
				//layer.msg("jssdk初始化成功");
			    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,
			    //所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
			});
			wx.error(function(res){
			    // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,
			    //也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
				layer.msg(res);
			});
		}
		},"json");
	
	
	wx.ready(function(){  
		wx.getLocation({  
	        type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'  
	        success: function (res) {
	        	//$("#latitude").val(res.latitude);// 纬度,浮点数,范围为90 ~ -90  
	        	//$("#longitude").val(res.longitude);// 经度,浮点数,范围为180 ~ -180。	
	        	$.ajax({
	        		  type: 'POST',
	        		  url: "${basePath}/position/getDetail.do?method=area&latitude="+res.latitude+"&longitude="+res.longitude,
	        		  dataType: 'text',
	        		  success: function(data){
	        			  if($("#signArea").val() == "位置获取中..." || $("#signArea").val() == ""){
	        				 alert('data'+data);
	        				  $("#signArea").val(data);
	        			  }
	        		  }
	        		});
	        }
	    });

	    
	});  
	   
	wx.error(function (res) {
	  alert("调用微信jsapi返回的状态:"+res.errMsg);
	});
	
	
    三.后台解析数据:

         根据需求,本文用了百度的接口解析地理位置,也可以使用其他工具进行地址解析。

/**
	 * 获取位置
	 * @param latitude
	 * @param longitude
	 * @return
	 */
	private String getGeographicalPosition(String latitude , String longitude) {
		// 参数解释: 纬度,经度 type 001 (100代表道路,010代表POI,001代表门址,111可以同时显示前三项)  用百度的一接口 解析地理位置
		String urlString = "http://gc.ditu.aliyun.com/regeocoding?l="+latitude+","+longitude+"&type=010";

		String res = "";
		try {
			URL url = new URL(urlString);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setDoOutput(true);
			conn.setRequestMethod("POST");
			BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
			String line;
			while ((line = in.readLine()) != null) {
				res += line + "\n";
			}
			in.close();
		} catch (Exception e) {
			System.out.println("error: " + e.getMessage());
		}
		return res;
	}
	
	
  

  @ResponseBody
  @RequestMapping(value="/checkCustomerName", method = RequestMethod.POST,produces = "text/html;charset=UTF-8")
  private  String checkCustomerName(@RequestParam(value="addCustomerName")String addCustomerName ) throws IOException{
	  // 根据新录入的客户名称 判断是否已经存在
	
	  CustomerInfoExample example = new CustomerInfoExample();
	  CustomerInfoExample.Criteria criteria = example.createCriteria();
	   criteria.andNameEqualTo(addCustomerName);
      List<CustomerInfo> customerInfoList = customerInfoService.loadCustomerInfoByExample(example);
      String customerInfoId= "0";
      if (customerInfoList.size()>0) {
			customerInfoId=customerInfoList.get(0).getId()+"" ;
      }
      
       JSONArray jsonArray = new JSONArray();//new一个json数组  
       jsonArray.add(customerInfoId);  
   
	  return jsonArray.toString();  
	  
  }   
  
       学习在于不断地探索、思考和总结记录,欢迎喜欢的朋友们在下方留言,期待与君共同进步!








2018-06-12 15:52:44 weixin_38199437 阅读数 2217
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27752 人正在学习 去看看 秦子恒

最近开发是碰见了一个微信巨坑的地方,就是在分享链接后,收到的链接不显示缩略图的情况,结果没想到的原因竟然是:

    描述或标题中含有 红包现金 等关键字

2014-05-29 21:32:26 aszt123 阅读数 971
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27752 人正在学习 去看看 秦子恒
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
$textTpl = '<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>';
$msgType = 'text';
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType,"<a href=\"http://baidu.com\">百度一下,你就知道</a>");
echo $resultStr;

手机端ok的

网页版无效


2019-12-12 00:10:18 qq_41219586 阅读数 20
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27752 人正在学习 去看看 秦子恒

1.说明:前端使用微信开发者工具,后台用ideal,后台框架为springboot+mybatisplus 本文主要内容是实现从数据库查询数据并运用在页面上的整个流程

后台不会搭建的可以点击下面的链接看下另一篇博客
链接

2.数据库表的数据以及显示效果

在这里插入图片描述
在这里插入图片描述

3.后台关键代码

(1)action层

  /**
     * 查找商品的类别 返回数组类型的数据
     * */
    @RequestMapping("/findclassify")
    public ArrayList findclassify(){
        ArrayList classify =  goodsService.findclassify();
        System.out.println(classify);
        return classify;
    }

(2)service层

 public ArrayList findclassify() {
        return goodsDao.findclassify();
    }

(3)dao层

public ArrayList findclassify();

(4)mapper映射文件

    <select id="findclassify" resultType="java.lang.String">
        select  classify_name from t_classify ;
    </select>

4.前台关键代码

(1)wxml代码
key==index?‘is_checked’:‘classify_normal’–>根据点击与未点击的部分显示不同样式,具体查看下面的博客
链接

  <!-- 左边分类栏 -->
  <view class="left">
   <!-- wx:for遍历js中的classify1数组并显示-->
    <view wx:for="{{classify1}}"  wx:key="key" data-url="{{item.classify_id}}"  >
      <view class="{{key==index?'is_checked':'classify_normal'}}" bindtap="Checked"  data-index='{{index}}'>{{item}} </view>
    </view>
  </view>

(2)wxss代码

/*左边分类模块*/
.left{
  width: 160rpx;
  min-height: 1000rpx;
  background-color: white;
}
/*点击前的样式*/
.classify_normal{
width: 160rpx;
height: 110rpx;
display: flex;
justify-content: center;
align-items: center;
background-color: #E4E4E4;
border-top: solid 1rpx white;
}
/*被点击选中后的样式*/
.is_checked{
width: 158rpx;
height: 110rpx;
display: flex;
justify-content: center;
align-items: center;
background-color:white;
border-bottom: solid 2rpx #E4E4E4;
border-left: solid 4rpx red;
}

(3)js代码

 /**
   * 页面的初始数据
   */
  data: {
    classify1:[
    ],
    key:0
    }
     /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    var that = this;
    /**
     * 查询商品有哪些类型
     */
    // findclassify:是action层@RequestMapping内对应的值,
    wx.request({
      url: 'http://localhost:8080/findclassify',
      success:function(e){
      /*把查出来的数据赋值给classify1数组*/
        that.setData({
          classify1: e.data
        }) 
      }
    })

该方法并没有向数据库传参数 ,只是一个简单的查询;
如果是要传参数到后台,那么在wx.request里加上一个data:{}就可以了;代码如下
findgoods:是action层@RequestMapping内对应的值,

   wx.request({
      url: 'http://localhost:8080/findgoods',
      data:{
			classify:classify的值
		}
    })

后台数据接收如下:
在这里插入图片描述

2018-02-13 16:29:57 sinat_38273626 阅读数 618
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27752 人正在学习 去看看 秦子恒

1- java代码

网站实现扫描二维码关注微信公众号,如果已经关注公众号就自动登陆网站并获取其微信昵称,头像等信息,如果用户未关注就等用户关注公众号后自动登陆网站

     --如果用户已关注公众号,网站端直接自动登陆,如果没有关注,就等用户关注公众号之后网站端自动登陆

     (目前已经完成了这个功能,示例网址:http://www.bid-data.com/ 爱招标——免费实时标讯推送平台,为企业负责人及商务人员即时掌控招标动态、中标检索、竞争对手中标项目分析等服务平台。)

   做微信扫码登陆,生成二维码必须是微信公众号中绑定的域这个域名,网站生成不了二维码(网站与微信服务器不是同一个域名) ,而是调用微信系统的接口获取二维码,用户扫码后也是请求微信服务器 

   

实现思路
   1,微信的系统,提供生成带参数的二维码的接口,这个参数就是唯一值(场景值)
   2,网站调用微信系统,获取生成的二维码图片
   3,用户扫码会直接调用微信服务器,将用户访问微信服务器的信息记录到redis,key就是唯一值(场景值)
   4,网站端做轮训去查询redis中是否有这个唯一值的数据,如果有就获取用户信息登录,没有就五秒一次轮训,登录后就不在做轮训(从二维码弹出之后开始做轮训,关闭二维码后停止轮训)
   5,这里的唯一值是可以自己定义的,我用的是截取了几位的时间戳 

实现步骤
(1)微信端:写一个获取带参数的临时二维码接口。
  // 临时二维码 
    private final static String QR_SCENE = "QR_SCENE";  
    // 永久二维码  
    private final static String QR_LIMIT_SCENE = "QR_LIMIT_SCENE";  
    // 永久二维码(字符串)  
    private final static String QR_LIMIT_STR_SCENE = "QR_LIMIT_STR_SCENE";   
    // 创建二维码  
    private String create_ticket_path = "https://api.weixin.qq.com/cgi-bin/qrcode/create";  
    // 通过ticket换取二维码  
    private String showqrcode_path = "https://mp.weixin.qq.com/cgi-bin/showqrcode";  

    @RequestMapping("getQrcode")
    public @ResponseBody String getQrcode(@RequestParam(value = "sceneId")int sceneId) throws Exception{


        String ticket = createTempTicket(tokenService.getToken(),"2592000",sceneId);
        LOGGER.info("get wechat qrcode  ==> start");
        LOGGER.info("sceneId :"+sceneId);
        LOGGER.info("ticket :"+ticket);
        LOGGER.info("get wechat qrcode  ==> end");
        return ticket;
    }
    /** 
     * 创建临时带参数二维码 
     * @param accessToken 
     * @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。 
     * @param sceneId 场景Id 
     * @return 
     */  
    public String createTempTicket(String accessToken, String expireSeconds, int sceneId) {  

        TreeMap<String,String> params = new TreeMap<String,String>();  
        params.put("access_token", accessToken);  
        Map<String,Integer> intMap = new HashMap<String,Integer>();
        intMap.put("scene_id",sceneId);  
        Map<String,Map<String,Integer>> mapMap = new HashMap<String,Map<String,Integer>>();  
        mapMap.put("scene", intMap);  

        Map<String,Object> paramsMap = new HashMap<String,Object>();  
        paramsMap.put("expire_seconds", expireSeconds);  
        paramsMap.put("action_name", QR_SCENE);  
        paramsMap.put("action_info", mapMap);  
        String data = new Gson().toJson(paramsMap);  
        String tse = HttpRequestUtil.HttpsDefaultExecute(HttpRequestUtil.POST_METHOD,create_ticket_path,params,data);  

        JSONObject jsonObject = JSONObject.fromObject(tse);
        LOGGER.info("ticket :"+jsonObject.getString("ticket"));

     return showqrcode_path+"?ticket="+jsonObject.getString("ticket");
 }
accessToken就是调用微信接口的凭证token
(2)网站端:网站写一个调用微信生成二维码的接口

    @RequestMapping("getQrcode")
    public @ResponseBody Hashtable getQrcode(int sceneId){

        System.out.println(sceneId);

        Hashtable param = new Hashtable();
        param.put("sceneId", sceneId);

        String qrcodePath = HttpUtil.postRequest(Constant.getValue("get_qrcode"), param);

        System.out.println(" qrcodePath ==> "+qrcodePath);
        param.put("path", qrcodePath);
        return param;
    }
直接使用http调用接口就行,Constant.getValue("get_qrcode")这个就是微信提供二维码接口的url

(3)微信端:微信处理用户请求(这个地址是微信公众号填的那个地址,微信服务器会将所有用户请求转发到这个地址)

       // 事件推送
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
                // 事件类型
                String eventType = requestMap.get("Event");
                // 关注
                if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {

                    //获取用户信息
                    String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
                    requestUrl = requestUrl.replace("ACCESS_TOKEN", tokenService.getToken())
                            .replace("OPENID", fromUserName);
                    JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET",null);
                    String nickname = jsonObject.getString("nickname");
                    String address = jsonObject.getString("country")+"-"+jsonObject.getString("province")+"-"+jsonObject.getString("city");
                    String headimgurl = jsonObject.getString("headimgurl");

            //将用户信息存入redis,key为唯一值(场景值)
                    Hashtable params = new Hashtable();
                    params.put("phoneIme", fromUserName);
                    params.put("state", 1);
                    params.put("location", address);
                    params.put("realName", nickname);
                    params.put("nickname", nickname);
                    params.put("headimgurl", headimgurl);
                    if(StringUtils.isNotBlank(eventKey)){
                        redisCacheTool.setDataToRedis(eventKey.replace("qrscene_", ""), 3600, params);
                        System.out.println("qrcode redis key ==> "+eventKey.replace("qrscene_", ""));
                        params.put("equipmentType", eventKey);
                    }
            //入库
                    HttpUtil.postRequest(Constant.getValue("UPDATE_USER"), params);

                }
                // 取消关注
                else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
                    // TODO 取消订阅后用户不会再收到公众账号发送的消息,因此不需要回复
                    Hashtable params = new Hashtable();
                    params.put("phoneIme", fromUserName);
                    params.put("state", 0);
                    HttpUtil.postRequest(Constant.getValue("UPDATE_USER_ANS"), params);

                }
                // 扫描带参数二维码
                else if (eventType.toLowerCase().equals(MessageUtil.EVENT_TYPE_SCAN)) {
                    // TODO 处理扫描带参数二维码事件
if(StringUtils.isNotBlank(eventKey)){

                        String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
                        //获取用户信息
                        requestUrl = requestUrl.replace("ACCESS_TOKEN", tokenService.getToken())
                                .replace("OPENID", fromUserName);
                        JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET",null);
                        String nickname = jsonObject.getString("nickname");
                        String address = jsonObject.getString("country")+"-"+jsonObject.getString("province")+"-"+jsonObject.getString("city");
                        String headimgurl = jsonObject.getString("headimgurl");
              //将用户信息存入redis,key为唯一值(场景值)
                        Hashtable params = new Hashtable();
                        params.put("nickname", nickname);
                        params.put("headimgurl", headimgurl);
                        params.put("location", address);
                        redisCacheTool.setDataToRedis(eventKey, 3600, params);
                        System.out.println("qrcode redis key ==> "+eventKey);
                    }


                    respContent = "返回的信息";
                    textMessage.setContent(respContent);
                    respXml = MessageUtil.messageToXml(textMessage);
                }
(4)网站端:登陆页面中做轮训,每隔几秒查询一次redis,如果有用户信息就登陆

        var timestamp = new Date().getTime() + "";
    var str = timestamp.substring(8, timestamp.length);

        window.setInterval(function() {

        getUser(cont);

    }, 10000);

        function getUser() {
        $.ajax({
            type : 'get',
            data : {
                sceneId : str
            },
            dataType : 'json',
            url : "getUser.do",
            success : function(data) {

                if (data.msg == "success") {
                    location.reload(); 
                }

            },
            error : function(data) {

                if (data.msg == "success") {
                    location.reload();
                }

            }
        });
    }        
没有更多推荐了,返回首页