微信公众号开发问题与注意事项和解决方案

自有封装公开了: https://git.oschina.net/zhuqiang/wx_sdk

1.接入问题

1.消息接入后,每次请求的session都不同。不要想着用一个用户用session来保存数据

2.配置问题

  1. 设置 -> 公众号设置 -> 功能设置

    1. 业务域名:在各种操作的时候,在该域名下的不会被系统提示小心被盗被骗等字样,每个月只能修改3次
    2. JS接口安全域名:使用jssdk必须设置此域名,每个月只能修改3次
      规则:
      1. 当前网页使用的二级域名可以设置成一级域名
      2. 非80端口的域名需要加上端口号

    报错:
    1. 进入授权页面报错:无效的domain

  2. 接口权限 -> 网页授权获取用户基本信息 : 此域名非80端口必须加端口号
  3. 开发配置 -> 公众号支付
    支付授权目录:微信支付所发起的页面地址必须在此目录中,否则支付不会成功。必须设置到支付页面所在路径的上一级目录(该目录必须是发起支付的页面的精确目录,子目录下无法正常调用支付)。最多只能设置3个目录,且必须域名通过了备案

用户管理

获取用户地理位置

场景使用举例:获取附近有哪些网点。
关键点是:获取到 用户的地理位置信息:在微信中有两种方法,1:就是使用该功能 2:用户主动发送地理位置给公众号

他们的利弊:

1. 操作上:
  1. 用户主动发送地理位置给公众号:需要用户主动发送。(繁琐)
  2. 获取用户地理位置:是微信客户端为你做的(前提是关注公众号后,会弹出一个授权框,让用户同意获取地址位置信息,如果该功能是后来加上去的,需要之前关注过的用户在公众号详情页面中打开提供地理位置信息的选项,在这种情况下是比较繁琐的。然后如果是新关注者,则一本万利. 还有一种提示就是。如果地理位置是关闭的。你每次进入公众号的时候就会弹出授权框)
2. 数据实时性
  1. 用户主动发送地理位置给公众号:因为是户主动发送,所以很实时
  2. 获取用户地理位置:客户端自动处理。它有两种模式:
    1. 每次会话的时候:触发事件(通过测试发现,只有从联系人列表/点击公众号进入到对话框页面的时候会触发)相对1来说不是很实时(但是根据概率来说,这种操作很低,除非用户一直停留在这个会话页面,但是我们可以使用把每个openid的地理位置存起来。外加提示来解决这个问题)
    2. 用户进入微信公众号后每隔5s触发一次上报事件:只要停留在公众号里面就会一直上报(数据很实时,但是浪费流量)

综合的处理办法是:
  使用 获取用户地理位置 方式:并把模式设置为 每次会话的时候上报地理位置, 把位置更新到session中(这个方法行不通,可以使用全局map加周期线程task来巡查清除过期的地理位置),如果用户使用到相关功能则判断是否有位置,有则回馈,如果没有则有3个可能:
1. 用户拒绝了获取地址位置信息
2. 使用该功能的是老关注者
3. 由于手机系统问题,禁用了该权限

针对以上问题:
1. 引导老用户在公众号详细信息里面打开该地理位置授权
2. 告知用户主动发送地理位置信息
3. 由于系统问题的话。就没办法了(操作起来比较复杂)


网页服务

网页账号/网页授权获取用户基本信息

1.提示:redirect_uri 参数不对
拼接授权url的时候,如果你是按照文档拼接的。和别人拼接的url差不多的话,跳转也提示你这个错误,那么应该是:该接口的授权回调页面域名:和你当前需要授权的url不匹配。


JSSDK

js授权

  1. 签名使用的加密不需要 支付中的 key,并且使用的加密方式是SHA-1
  2. wx.ready方法,在实际测试中,授权未ok,也会调用该方法。同时也会调用wx.error方法
  3. window.location.href 自动获取的链接在提交给后台的时候,由于一些框架原因:会把& 转义为 &l; 该问题已经在sdk中解决了。但是要注意
  4. 4.
wx.ready(function(){
    alert("debug:jsSDK授权成功,该方法,实际测试来看,无论是否成功 都会在 调用 config之后调用该方法,不知道是什么原因");
    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});

完整的自动授权js:使用方式:把微信的jssdk引入,再引入该js文件。就能对当前页面自动授权了

/**
 * Created by win on 2015/9/16.
 * 微信jssdk公用js文件
 */
$(function () {
    $.ajax({
        url: $contextPath + "/wx/jssdk/getConfigData.action",
        type: "POST",
        dataType: "json",
        data: {
            "appId": "xxxxxx",
            "url": window.location.href
        },
        success: function (data) {
            if (data) {
                wxConfig(data);
            } else {
                alert("获取jssdk授权参数失败");
            }
        },
        error: function (a, b, c) {
            alert("出现了一个错误,未能请求成功!")
        }
    });
    function wxConfig (data){
        /*
         * 注意:
         * 1. 所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
         * 2. 如果发现在 Android 不能分享自定义内容,请到官网下载最新的包覆盖安装,Android 自定义分享接口需升级至 6.0.2.58 版本及以上。
         * 3. 常见问题及完整 JS-SDK 文档地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
         *
         * 开发中遇到问题详见文档“附录5-常见错误及解决办法”解决,如仍未能解决可通过以下渠道反馈:
         * 邮箱地址:[email protected]
         * 邮件主题:【微信JS-SDK反馈】具体问题
         * 邮件内容说明:用简明的语言描述问题所在,并交代清楚遇到该问题的场景,可附上截屏图片,微信团队会尽快处理你的反馈。
         */
        wx.config({
            debug: true,
            "appId": data.appId,
            "nonceStr": data.nonceStr,
            "signature": data.signature,
            "timestamp": data.timestamp,
            jsApiList: [
                'checkJsApi',
                'onMenuShareTimeline',
                'onMenuShareAppMessage',
                'onMenuShareQQ',
                'onMenuShareWeibo',
                'hideMenuItems',
                'showMenuItems',
                'hideAllNonBaseMenuItem',
                'showAllNonBaseMenuItem',
                'translateVoice',
                'startRecord',
                'stopRecord',
                'onRecordEnd',
                'playVoice',
                'pauseVoice',
                'stopVoice',
                'uploadVoice',
                'downloadVoice',
                'chooseImage',
                'previewImage',
                'uploadImage',
                'downloadImage',
                'getNetworkType',
                'openLocation',
                'getLocation',
                'hideOptionMenu',
                'showOptionMenu',
                'closeWindow',
                'scanQRCode',
                'chooseWXPay',
                'openProductSpecificView',
                'addCard',
                'chooseCard',
                'openCard'
            ]
        });
    }
});
wx.ready(function(){
    //alert("debug:jsSDK授权成功,该方法,实际测试来看,无论是否成功 都会在 调用 config之后调用该方法,不知道是什么原因");
    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});
wx.error(function(res){
    alert("debug:jsSDK授权失败:" + JSON.stringify(res));
    // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});
  1. 生成签名需要4个参数:noncestr、jsapi_ticket、timestamp、url(当前使用jssdk的页面的url,但是不包含#后面的链接),这4个参数在签名的时候key都是小写。(由于在jssdk中有一部分签名和jssdkapi中的参数名称驼峰写法不一致,需要注意!)
  2. jsapi_ticket 需要单独用accesstoken去获取,并且一样需要控制生命周期。过期时间是7200秒

支付api

  1. 支付文档中说的H5发起一个支付,是旧版本的api,新版本的api就用jssdk中的。据说2014年7月后开通的支付都是新版本接口

chooseWXPay方法

首先js授权要通过。发起支付的话。弹出如下提示:
{“errMsg”:”chooseWXPay:fail”} 之后,告知支付非法。
需要检测的地方有两个:

  1. 微信支付-设置支付授权目录-检测当前页面是否在授权目录内
  2. 统一下单的支付类型。要设置成jsapi

流程:

  1. 先授权当前页面js使用权限
  2. 在当前页面获取用户的openid,然后传到后台去统一下单,统一下单中的支付类型=jsapi,且openid必须填写
  3. 最后获取chooseWXPay所需要的支付参数,需要注意的是:最后参与签名的参数有appId, timeStamp, nonceStr, package, signType。
        map.put("appId",unifiedorder.getAppid());
        map.put("timeStamp", new Date().getTime()+"");  //该timeStamp和js中的timestamp 有一个驼峰写法。不要错了
        map.put("nonceStr", RandomStringGenerator.getRandomStringByLength(32));
        map.put("package","prepay_id=" + unifiedorder.getPrepay_id());
        map.put("signType","MD5");
        String sign = PaySignature.getMapSignStr(map, key);  //这里的签名:要使用支付的签名,也就是需要key参与。(我之前就是用错了,一直报 支付签名验证错误)
        map.put("paySign", sign);  //签名

openid网页授权:

  1. 按照文档要求拼接url访问提示:redirect_uri 参数错误
    可能的问题:
    1. 网页账号 网页授权获取用户基本信息 权限接口中的授权地址域名和当前跳转的url不同

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