精华内容
下载资源
问答
  • 关于微信网页版WeChat不能正常登录的最佳解决方案

    万次阅读 多人点赞 2019-10-05 19:11:28
      因为出于工作和学习的目的,我的个人电脑操作系统使用的是Ubuntu 18.04 LTS,就...现在微信和QQ在生活和工作领域均是举足轻重,emm…     BUT!!! 腾讯到目前为止并没有推出Linux版的微信和TI...

    因为出于工作和学习的目的,我的个人电脑操作系统使用的是Ubuntu 18.04 LTS,就目前而言,许多优秀的软件都有Linux版本,虽然Linux的用户群体相对较小,但是其软件生态也在日益完善,而且日常使用浏览器就可以解决许多应用需求。

    现在微信和QQ在生活和工作领域均是举足轻重,但是对于Linux用户 emm…

     
     

    腾讯到目前为止并没有推出Linux版的微信和TIM(QQ)…

    而且,2019年1月1日起 网页版QQ 正式停止服务,WTF!!!

     
     
     

    所以目前只能使用微信网页版,然而使用之后出现了非常严重的问题,第一次登录成功了,但是关闭浏览器再登录竟然被锁定了!!!

    看下图,是不是你也遇到了???

    在这里插入图片描述
    上网查询发现许多人都遇到了这个问题,都没有给出很好的解决办法,所以自己琢磨处理,成功地解决了这个问题,现在分享给大家。

    需要注意的是:微信网页版需要和手机版同时在线,这是腾讯网页版处于安全因素的官方规定。
    

     
     

    声明:以下解决方案是基于 Ubuntu18.04 Linux 操作系统的 Chrome 解决方案,其他平台环境仅供参考。
    

    解决方案

    首先登录环境是没有任何问题的,经调查也不是官方的原因,So。。。后来发现。。。这应该是微信网页版的一个BUG。

    微信网页版页面的数据缓存 导致的问题,也可能是微信网页版需要的 浏览器权限 没有获取到(经测试我的电脑不是因为权限问题)。

     

    我使用的浏览器是Chrome,我给出我的解决方案:

     

    首先 打开Chrome设置

     

    选择 【高级】
    在这里插入图片描述

    选择 【隐私与安全】-> 【内容设置 / 站点设置】
    在这里插入图片描述

    选择 【查看站点权限和存储的数据】
    在这里插入图片描述

    查找微信网页版站点
    在这里插入图片描述
    wx.qq.com
    wx2.qq.com 【关键是这个】

    分别清空这两个站点的数据
    尽量把站点的需要的 权限全部修改为允许
    在这里插入图片描述

    然后再返回 【内容设置 / 站点设置】 选择 【Cookie 与 站点数据】
    在这里插入图片描述
    选择 【退出时清空数据】-> 【添加微信网页版站点】
    在这里插入图片描述

    彻底关闭Chrome再登录微信





    如果以上方法还是无法登录,则是账号的原因
    按照以下官方操作方法对微信账号进行解除登录限制:

    1. 确保 微信需要绑定 非虚拟手机号 使用
    2. 确保 微信已设置登录密码
    3. 确保 在【更多安全设置】中绑定 可信QQ和邮箱
    4. 在微信中点击【设置】-> 【账号与安全】-> 【微信安全中心】自行申请解封账号或解冻账号。

    腾讯对微信禁止手机(电脑)同时登录多个客户端,为了防止 机器人/营销 等恶意账号使用多个浏览器的WEB页面进行舞弊操作,所以对微信账号进行了WEB端登录限制,只能提高微信可信度并自行申请解除限制。





    我在 Ubuntu 18.04 环境下的确解决了,几个月来一直在用微信。
    以上方法仅供参考!仅供参考!仅供参考!~~~






    小技巧

    对于使用Chrome的用户来说,尤其是使用 Linux Desktop 的用户,没有客户端每次必须打开浏览器使用微信是不是很烦?其他三方应用安装也繁琐。

    哈哈,那就试试Chrome为微信网页版创建快捷方式吧:

    以下介绍功能基于

    • Ubuntu 18.04 TSL
    • Chrome [ Version 77.0.3865.90 (Official Build) (64-bit) ]

     
     
     

    点击浏览器右上角图标在这里插入图片描述
    在弹出的面板中 选择 【更多工具】-> 【创建快捷方式】

    一个微信客户端就生成了,其快捷方式自动加入桌面的Applications中,是不是很赞?

    以后再也不用必须打开浏览器登录微信了,浏览器可以随意关闭且不影响微信。

    看看效果图:

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

     
     

    题外

    多年以来,曾有几次特殊的应用需求时,类似的服务中,Google总能给我一些惊喜。其中,Chrome 无疑是我用过综合评价最棒的浏览器,没有之一。此外,在Windows 10 中基于 Chromium 开发的 Microsoft Edge 也在日趋完善越来越好用了,据说 巨硬 正在计划开发 Edge for Linux?

    纵观整个计算机互联网领域,Google一直是行业的领军企业之一,这家98年才成立的高科技公司,其学术研究和创造贡献方面均是属于世界前沿的,用了二十年的时间,却做出了几十年的成绩,是真的强。而且Google发布了很多出众的产品,它们的大多数是免费的。

     

    许多人都认为Google是一家伟大的公司,其实,我也是这么想的 :)

    展开全文
  • 微信公众平台开发之微信网页授权开发是子恒老师《微信公众平台开发》视频教程的第10部。详细讲解了用php进行微信网页授的开发。内容包含构造授权uri,实现网页授权,优化微信网页授,获取用户信息等等。
  • 文章目录微信公众平台开发:微信网页授权和微信支付1. 微信网页授权1.1 微信网页授权和微信支付有什么关系?1.2 微信授权流程1.2.1 手工实现微信网页授权1.2.2 利用第三方SDK开发2. 微信支付2.1 微信支付场景2.2 ...

    微信公众平台开发:微信网页授权和微信支付

    问题1:微信公众平台网页授权和微信开放平台网页授权什么关系?

    ① 微信公众平台

    微信公众平台是微信公众账号申请入口和管理后台。商户可以在公众平台提交基本资料、业务资料、财务资料申请开通微信支付功能。

    平台入口:http://mp.weixin.qq.com

    ② 微信开放平台

    微信开放平台是商户APP接入微信支付开放接口的申请入口,通过此平台可申请微信APP支付

    平台入口:http://open.weixin.qq.com

    问题2:微信支付和微信授权什么关系?

    这篇文章,主要想聊一下微信公众平台的开发,下一篇聊微信开放平台授权

    1. 微信网页授权

    上一篇文章中已经详细的讲了微信网页授权的开发步骤,这里结合上篇文章,主要讲讲两种授权方式

    1.1 微信网页授权和微信支付有什么关系?

    ① 如果用户第一次使用美团外卖的公众号,进入美团外卖公众号后选择一家小店的商品加入购物车,然后点击去结算

    ②点击结算后,出现一个要求用户授权的界面(在公众号进行微信支付功能,目的是获取用户的openid,只有拥有用户的openid才能进行后序的微信支付行为)

    ③ 当用户同意授权后,这时就会微信支付系统就会创建一个预付单

    ④ 点击去支付,完成微信支付
    在这里插入图片描述

    1.2 微信授权流程

    授权流程主要涉及前面两个步骤:

    在这里插入图片描述

    关于微信授权的流程上一篇有具体详细的解释,这里梳理大致思路:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

    ① 用户同意授权,获取Code

    1. 引导用户访问:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect (参数官方文档,很清楚)

    2. 当用户访问这个连接时就会跳转到 图② 微信网页授权页面,即美团外卖申请获取你的公开信息。

    3. 当用户点击允许后,代表同意授权,页面将跳转到: redirect_uri/?code=CODE&state=STATE。

    ② 通过code换取网页授权access_token(获取access_token的同时还会获取openid)

    1. redirect_uri/?code=CODE&state=STATE这个请求的请求参数中可以获得code
    2. 获取code后,请求以下链接获取access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

    ③ 通过access_token和openid拉取用户信息(要求scope=snsapi_userinfo)

    1. 从请求的返回结果中,便可以获得access_token 和 openid
    2. 如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
    3. 请求方法:https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
    4. 从请求方法的返回结果即可得到用户的信息

    1.2.1 手工实现微信网页授权

    @Controller
    @RequestMapping("/weixin")
    public class WiexinOathu {
    
        // 1、当用户请求这个方法时,我们需要引导用户打开url这个地址,请求授权
        @RequestMapping("/oauth")
        public void autho(HttpServletResponse response)  {
            //redirect_uri
            String path = "http://heng.nat300.top/sell/weixin/invoke";
            try {
                URLEncoder.encode(path,"UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
    
            String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
                "appid=wxd0430ca3dde79d52" +
                "&redirect_uri="+ path +
                "&response_type=code" +
                "&scope=snsapi_userinfo" +
                "&state=STATE" +
                "#wechat_redirect";
    
            try {
                response.sendRedirect(url);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //用户同意授权后,页面回调接口路径:http://heng.nat300.top/sell/weixin/invoke
        @RequestMapping("/invoke")
        public void oauthInvoke(HttpServletRequest request){
            //2、从回调地址中获取code
            String code = request.getParameter("code");
            String state = request.getParameter("state");
    
            System.out.println("code="+code);
    
            //3、认证服务器,获取code后,请求以下链接获取网页授权access_token
            String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
                    "appid=wxd0430ca3dde79d52" +
                    "&secret=46088f58a30ffb26b12d921735d26691" +
                    "&code="+code +
                    "&grant_type=authorization_code";
    
            //认证服务器响应的json数据,获取access_token 和 openid
            JSONObject jsonObject = WeiXinUtil.httpRequest(url,"POST",null);
            String access_token = jsonObject.getString("access_token");
            String openid = jsonObject.getString("openid");
    
            System.out.println("access_token="+access_token);
            System.out.println("openid="+openid);
    
            //4、根据openid和access_token获取资源信息
            String URLUserinfo = "https://api.weixin.qq.com/sns/userinfo?" +
                    "access_token=" + access_token +
                    "&openid="+openid+
                    "&lang=zh_CN";
            JSONObject jsonobj = WeiXinUtil.httpRequest(URLUserinfo,"GET",null);
            System.out.println(jsonobj);
        }
    }
    

    在微信客户端访问:http://heng.nat300.top/sell/weixin/oauth

    code=061Lgdll21xhn54RXCnl2EO7F33Lgdlg
    
    ---->httpRequest传回的信息是:{"access_token":"36_Sf82qk9BPk-3cQmqlmmqlQNtBKWcd6Qldslgj75fRzhw0rkzmlLWvd8NLUKodlmhavSq3CVaMyvOjjIsQufKUw","expires_in":7200,"refresh_token":"36_TOv7gFw840QLTNe_GmzAA6sDtDOo-2TlpkzuAM8t5GXVhu5SXSpOMhW83tYu9BqsJdxRb8w7p90oEK_1Uhz7FA","openid":"oaaZ7txEYH7kpwRVfBCc9hych-CE","scope":"snsapi_userinfo"}
    
    access_token=36_Sf82qk9BPk-3cQmqlmmqlQNtBKWcd6Qldslgj75fRzhw0rkzmlLWvd8NLUKodlmhavSq3CVaMyvOjjIsQufKUw
    
    openid=oaaZ7txEYH7kpwRVfBCc9hych-CE
    
    ---->httpRequest传回的信息是:{"openid":"oaaZ7txEYH7kpwRVfBCc9hych-CE","nickname":"别惹我","sex":2,"language":"zh_CN","city":"南京","province":"江苏","country":"中国","headimgurl":"http://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83eoMGGJX7Etibc0he241duGKMSWickeibOUAGEC0OeaxuzMXaAOhbK3KSBViaNibf4ZbTBoABTqgSc0ia3bA/132","privilege":[]}
    {"openid":"oaaZ7txEYH7kpwRVfBCc9hych-CE","nickname":"别惹我","sex":2,"language":"zh_CN","city":"南京","province":"江苏","country":"中国","headimgurl":"http://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83eoMGGJX7Etibc0he241duGKMSWickeibOUAGEC0OeaxuzMXaAOhbK3KSBViaNibf4ZbTBoABTqgSc0ia3bA/132","privilege":[]}
    

    1.2.2 利用第三方SDK开发

    第三方SDKGithub地址:https://github.com/Wechat-Group/WxJava/wiki/MP_OAuth2%E7%BD%91%E9%A1%B5%E6%8E%88%E6%9D%83

    @Controller
    @RequestMapping("/wechat")
    @Slf4j
    public class WeChatController {
        @Autowired
        private WxMpService wxMpService;
    
        @Autowired
        private WxMpService wxOpenService;
    
        //http://heng.nat300.top/sell/wechat/authorize
        @GetMapping("/authorize")
        public String authorize(){
            //returnUrl就是用户授权同意后回调的地址
            String returnUrl="http://heng.nat300.top/sell/wechat/userInfo";
            //引导用户访问这个链接,进行授权
            String url = wxMpService.oauth2buildAuthorizationUrl(returnUrl, WxConsts.OAUTH2_SCOPE_USER_INFO, URLEncoder.encode(returnUrl));
            return "redirect:"+url;
        }
    
        //用户授权同意后回调的接口,从请求参数中获取code
        @GetMapping("/userInfo")
        public String userInfo(@RequestParam("code")String code,@RequestParam("state")String returnUrl){
            WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();
            try {
                //通过code换取access_token
                wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
            } catch (WxErrorException e) {
                log.error("【微信网页授权】{}",e);
                throw new SellException(ResultEnum.WECHAT_MP_ERROR.getCode(),e.getError().getErrorMsg());
            }
            String openId = wxMpOAuth2AccessToken.getOpenId();
            log.info("openid={}", openId);
    
            //这个地址可有可无,反正只是为了拿到openid,但是如果没有会报400错误,为了好看随便返回一个百度的地址
            returnUrl = "http://www.baidu.com";
    
            return "redirect:" + returnUrl;
        }
    }
    

    在微信客户端访问:http://heng.nat300.top/sell/wechat/authorize

    控制台打印openid,同时网页最终返回至returnUrl = “http://www.baidu.com”;
    在这里插入图片描述

    2. 微信支付

    开发JSAPI支付时,在统一下单接口中要求必传用户openid,在微信授权时我们已经获取了用户的openid,下面就可以进行微信支付的流程了。

    2.1 微信支付场景

    商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程。

    ① 商户通过自定义菜单吸引用户点击进入商户网页, 用户选择购买,完成选购流程,创建预支付订单;

    ② 调起微信支付控件,用户开始输入支付密码;

    ③ 密码验证通过,支付成功。商户后台得到支付成功的通知。

    ④ 返回商户页面,显示购买成功。该页面由商户自定义

    ⑤ 微信支付公众号下发支付凭证。

    ⑥ 商户公众号下发消息,提示发货成功。该步骤可选。

    在这里插入图片描述

    以下是支付场景的交互细节,请认真阅读,设计商户页面的逻辑:

    ① 用户打开商户网页选购商品,发起支付,在网页通过JavaScript调用getBrandWCPayRequest接口,发起微信支付请求,用户进入支付流程。

    ② 用户成功支付点击完成按钮后,商户的前端会收到JavaScript的返回值。商户可直接跳转到支付成功的静态页面进行展示。

    ③ 商户后台收到来自微信开放平台的支付成功回调通知,标志该笔订单支付成功。

    2.2 JSAPI支付

    JSAPI支付是指商户通过调用微信支付提供的JSAPI接口,在支付场景中调起微信支付模块完成收款。应用场景有:

    线下场所:调用接口生成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付

    公众号场景:用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付

    PC网站场景:在网站中展示二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付

    如没有设置支付目录,无法调起支付接口:
    在这里插入图片描述

    2.3 微信支付业务流程

    ① 商户生成图文消息或二维码展示为用户,用户点击消息或扫描二维码在微信浏览器里面打开H5网页中通过JavaScript调用getBrandWCPayRequest接口,发起微信支付请求,请求生成支付订单。

    https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6

    ② 商户后台生成商户订单(业务订单),并调用微信支付系统的统一下单接口API生成预支付单(支付订单),返回预支付单信息(商户根据公众号相关信息、用户相关信息、商品相关信息,去获取一个prepay_id和paySign)

    https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

    ③ 商户将获取到的前端所需的支付参数,传给前端用户,用户点击发起支付,微信支付系统验证参数合法性等信息后返回验证结果,要求用户支付授权(确认支付,输入密码)

    ④ 用户输入密码后,微信支付系统验证授权并异步通知商户支付结果(用户已经成功下单并支付了,你赶紧处理一下)

    ⑤ 商户处理完成后(将订单状态修改为已支付),需要将处理结果告知微信支付系统,否则微信支付系统会一直向商户发送异步通知

    https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7

    ⑥ 微信支付公众号下发支付凭证,返回支付结果,展示消息给用户

    微信内网页支付时序图

    可能会出现问题的地方:

    问题1:当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知,怎么办?

    支付完成后,微信会把相关支付结果及用户信息通过数据流的形式发送给商户,商户需要接收处理,并按文档规范返回应答。

    1、同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。

    2、后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信会判定本次通知失败,重新发送通知,直到成功为止(在通知一直不成功的情况下,微信总共会发起多次通知),但微信不保证通知最终一定能成功。

    3、在订单状态不明或者没有收到微信支付结果通知的情况下,建议商户主动调用微信支付【查询订单API】确认订单状态。

    因此,由于网络异常或者系统的波动,可能会导致用户支付成功,但是商户侧未能成功接收到支付结果通知,进而显示订单未支付的情况。商户侧的订单状态更新不及时,容易造成用户投诉,甚至是重复支付的情况发生。

    解决方案:

    img

    ① 商户APP或者前端页面收到支付返回时,商户需要调用商户查单接口确认订单状态,并把查询结果展示给用户。

    ② 商户后台需要准确、高效地处理微信支付发送的异步支付结果通知,并按接口规范把处理结果返回给微信支付。

    ③ 商户后台未收到异步支付结果通知时,商户应该主动调用《微信支付查单接口》,同步订单状态。

    ④ 商户在T+1日从微信支付侧获取T日的交易账单,并与商户系统中的订单核对。如出现订单在微信支付侧成功,但是在商户侧未成功的情况,商户需要给用户补发货或者退款处理。

    如果商户查单接口返回订单未支付,需要提醒用户“稍后进入订单管理页核实订单状态,不要重复发起支付”。商户后端需要及时获取、更新订单状态,实现逻辑参考【后端服务处理】。当用户再次进入订单管理页面,对未支付的订单再次发起支付时,商户应该使用原单号发起,不要更换支付单号,避免用户重复支付。

    2.4 代码实现

    2.4.1 统一下单接口

    @Slf4j
    @Service
    public class PayServiceImpl implements PayService {
        //封装了的方法,也是很关键的方法
        @Autowired
        private BestPayServiceImpl bestPayService;
    
        private static final String ORDER_NAME="微信购物订单";
    
        //创建一个支付订单,注意是支付订单,不是业务订单
        @Override
        public PayResponse create(OrderDTO orderDTO) {
            //封装支付请求参数
            PayRequest payRequest = new PayRequest();
            //openid
            payRequest.setOpenid(orderDTO.getBuyerOpenid());
            //订单总金额OrderAmount
            payRequest.setOrderAmount(orderDTO.getOrderAmount().doubleValue());
    		//订单id
            payRequest.setOrderId(orderDTO.getOrderId());
            //订单名称
            payRequest.setOrderName(ORDER_NAME);
            //支付类型,代表微信公众号支付
            payRequest.setPayTypeEnum(BestPayTypeEnum.WXPAY_H5);
    
            //调用支付接口发起支付
            bestPayService.pay(payRequest);
            log.info("【微信支付】request = {}", JsonUtil.toJson(payRequest));
    		
            //支付后的响应结果
            PayResponse payResponse = bestPayService.pay(payRequest);
            log.info("【微信支付】response】= {}",JsonUtil.toJson(payResponse));
            return payResponse;
        }
    }
    
    @Controller
    @RequestMapping("/pay")
    public class PayController {
    	//订单业务层接口
        @Autowired
        private OrderService orderService;
    	
        //支付业务层接口
        @Autowired
        private PayService payService;
    
        //创建订单
        @GetMapping("/create")
        public ModelAndView create(@RequestParam("orderId")String orderId,
                                   @RequestParam("returnUrl")String returnUrl,
                                   Map<String,Object> map) throws UnsupportedEncodingException {
            //1.根据订单id查询订单
            OrderDTO orderDTO = orderService.findOnes(orderId);
            if(orderDTO==null){
                throw new SellException(ResultEnum.ORDER_NOT_EXIST);
            }
    
            //2. 发起支付
            PayResponse payResponse = payService.create(orderDTO);
            map.put("payResponse",payResponse);
            map.put("returnUrl",returnUrl);
    
            //跳转到模板引擎页面create.ftlh
            return new ModelAndView("pay/create",map);
        }
    }
    

    2.4.2 微信内H5调起支付

    <script>
        function onBridgeReady(){
        	//动态的从ModelAndView中提取
            WeixinJSBridge.invoke(
                'getBrandWCPayRequest', {
                    //公众号名称,由商户传入
                    "appId": "${payResponse.appId}",
                    //时间戳,自1970年以来的秒数
                    "timeStamp": "${payResponse.timeStamp}",
                    //随机串
                    "nonceStr": "${payResponse.nonceStr}",
                    "package":"${payResponse.packAge}",
                    //微信签名方式
                    "signType": "MD5",
                    //微信签名
                    "paySign": "${payResponse.paySign}"
                },
                function(res){
                    // 在用户支付成功后跳转的通知地址
                    location.href="${returnUrl}";
                });
        }
        if (typeof WeixinJSBridge == "undefined"){
            if( document.addEventListener ){
                document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
            }else if (document.attachEvent){
                document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
                document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
            }
        }else{
            onBridgeReady();
        }
    </script>
    

    2.4.3 异步通知商户支付结果

    @Service
    @Slf4j
    public class PayServiceImpl implements PayService {
    
        @Autowired
        private BestPayServiceImpl bestPayService;
    
        @Autowired
        private OrderService orderService;
    
    	//异步通知
        @Override
        public PayResponse notify(String notifyData) {
            //异步通知响应结果
            PayResponse payResponse = bestPayService.asyncNotify(notifyData);
            log.info("【微信支付】异步通知, payResponse={}", JsonUtil.toJson(payResponse));
    
            //查询订单
            OrderDTO orderDTO = orderService.findOne(payResponse.getOrderId());
    
            //判断订单是否存在
            if (orderDTO == null) {
                log.error("【微信支付】异步通知, 订单不存在, orderId={}", payResponse.getOrderId());
                throw new SellException(ResultEnum.ORDER_NOT_EXIST);
            }
    
            //判断金额是否一致(0.10   0.1)
            if (!MathUtil.equals(payResponse.getOrderAmount(), orderDTO.getOrderAmount().doubleValue())) {
                log.error("【微信支付】异步通知, 订单金额不一致, orderId={}, 微信通知金额={}, 系统金额={}",
                        payResponse.getOrderId(),
                        payResponse.getOrderAmount(),
                        orderDTO.getOrderAmount());
                throw new SellException(ResultEnum.WXPAY_NOTIFY_MONEY_VERIFY_ERROR);
            }
    
            //修改订单的支付状态
            orderService.paid(orderDTO);
    
            return payResponse;
        }
    }
    
    @Controller
    @RequestMapping("/pay")
    public class PayController {
        @Autowired
        private OrderService orderService;
        @Autowired
        private PayService payService;
        
    	// 微信异步通知
        @PostMapping("/notify")
        public ModelAndView notify(@RequestBody String notifyData) {
            payService.notify(notifyData);
              //商户返回给微信支付系统处理结果
        	return new ModelAndView("pay/success");
        }
    }
    
    展开全文
  • Vue微信网页微信支付

    2020-10-15 11:01:59
    基于Vue框架的微信网页进行微信支付导语一、微信后台配置接口1.配置微信支付的合法地址2.配置JS接口安全域名二、安装微信SDK依赖1.安装2.在需要的页面导入三、在页面中配置SDK四、使用微信支付接口 导语 作为一个先...

    导语

    作为一个先接触微信小程序再做微信公众号的前端萌新,第一次写微信网页的微信支付,感觉步骤有点繁琐,写篇博客帮助一下有困惑的小伙伴,也防止以后忘记
    要实现公众号微信支付,最基础的是拥有一个微信服务号、一个微信商户平台账号、一个服务器和域名,且微信服务号绑定了微信商户平台,这些步骤就不细说了

    一、微信后台配置接口

    1.配置微信支付的合法地址

    登录微信商户平台,进入产品中心——>开发配置,设置JSAPI支付授权目录,输入你的服务器域名和文件目录,然后输入密码和验证码就可以配置成功。
    然后进入账户中心——>API安全——>API密钥
    这里需要配置一个给后台的秘钥(这个应该主要是后台考虑的问题),32位数字字母的秘钥,要保存好,忘了只能重设。

    2.配置JS接口安全域名

    这次要登录微信公众平台,登录你的服务号,进入公众号设置——>功能设置,设置JS接口安全域名,JS接口安全域名是确保你可以在这个网页调用微信的SDK的
    设置这个的时候要在服务器你填的目录下放一个微信提供的txt文件,要和后端一起合作完成

    二、安装微信SDK依赖

    1.安装

    npm install weixin-jsapi
    

    2.在需要的页面导入

    import wx from "weixin-jsapi"
    

    三、在页面中配置SDK

    微信SDK在每个需要使用的页面都要进行配置,直接在页面创建的时候配置

    created() {
         //获取当前页面url
        let url = location.href
        //调用后端接口,给后台url,让后台返回appId、时间戳、随机串、签名,建议vue路由使用hash模式,可以根据#分隔路由
        getJsSDKInfo({ticketUrl: url.split("#")[0]}).then(res => {
          console.log(res)
          wx.config({
            debug: false,//用于调试,这里一般在测试阶段先用true,等打包给后台的时候就改回false,
            appId: res.data.result.appId,
            timestamp: res.data.result.timestamp,
            nonceStr: res.data.result.nonceStr,
            signature: res.data.result.signature,
            jsApiList: ['chooseWXPay']//需要使用的API,此处只使用了微信支付接口
          })
          //查看配置是否成功,成功时候才能使用微信SDK
          wx.ready(() => {
            wx.checkJsApi({
              jsApiList: ['chooseWXPay'],
              success: function (res) {
                console.log("success")
                console.log(res)
              },
              fail: function (res) {
                console.log("fail");
                console.log(res)
              }
            })
          })
        })
      },
    
    

    在成功配置之后,我们就可以在需要的地方调用微信支付的接口了

    四、使用微信支付接口

        pay() {//监听需要支付的按钮,调用该函数
          //调用后台接口,获取时间戳、字符串、签名方式、支付签名和package
          getPayInfo({reportId: this.resultId}).then(res=>{
            console.log(res)
            wx.chooseWXPay({
              timestamp: res.data.result.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
              nonceStr: res.data.result.nonceStr, // 支付签名随机串,不长于 32 位
              package: res.data.result.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
              signType: res.data.result.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
              paySign: res.data.result.paySign, // 支付签名
              success:  (res)=> {//成功回调函数
                console.log("success")
                getReportDetails()//支付成功之后需要做的事
              }
            })
          })
        }
    
    展开全文
  • 微信公众平台 微信网页授权

    千次阅读 2017-06-27 19:03:01
    前言:最近处心积虑的把微信网页授权弄了一下,感觉对微信公众号的认知还是太肤浅,以后要多总结学习微信公众号的开发,这里简单总结一下微信网页授权的java接口开发。在开发微信公众平台的时候建议使用测试号,毕竟...

    前言:最近处心积虑的把微信网页授权弄了一下,感觉对微信公众号的认知还是太肤浅,以后要多总结学习微信公众号的开发,这里简单总结一下微信网页授权的java接口开发。在开发微信公众平台的时候建议使用测试号,毕竟不是每个人都能微信认证。

    微信网页授权的作用:如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。

    官方文档微信网页授权

    注:部分内容摘抄子微信公众平台开发文档

    一、用户同意授权,获取code

    1 参考链接

    在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 
    若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。 

    尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问

    参考链接(请在微信客户端中打开此链接体验):
    scope为snsapi_base

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect 

    scope为snsapi_userinfo

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect 

    尤其注意:跳转回调redirect_uri,应当使用https链接来确保授权code的安全性。

    2 参数说明

    参数 是否必须 说明
    appid 公众号的唯一标识
    redirect_uri 授权后重定向的回调链接地址,请使用urlEncode对链接进行处理
    response_type 返回类型,请填写code
    scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
    state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
    #wechat_redirect 无论直接打开还是做页面302重定向时候,必须带此参数

    如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。

    code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。 

    3 实践开发

    3.1 redirect_uri回调地址

    (1)配置微信授权回调地址

    在微信公共平台的开发->接口权限->网页服务->网页授权->网页授权获取用户基本信息
    这里写图片描述
    因为我的公众号没有认证过,所以我们可以采用开发者工具的公众平台测试账号进行测试。测试账号的接口体验权限可以让我尽情的去开发。

    在网页授权获取用户基本信息选择修改,在回调地址中输入你需要回调的地址,我的测试地址是www.baidu.com。
    这里写图片描述

    (2)对redirect_uri使用urlEncode对链接进行处理

    java代码

    public static void main(String[] args) {
        String result = "";
        try {
            result = URLEncoder.encode("https://www.baidu.com","utf-8");
            System.out.println(result);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    执行结果

    https%3A%2F%2Fwww.baidu.com

    (3)关于网页授权回调域名的说明

    1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头。

    2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.htmlhttp://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.comhttp://music.qq.comhttp://qq.com无法进行OAuth2.0鉴权。

    3、如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可。

    3.2 测试链接

    给大家安利一个工具,微信web开发者工具。选择微信公众号开发。
    这里写图片描述
    如果我们直接请求链接会提示请在微信客户端打开,直接用微信提供的工具测试直接提高了自己的逼格,主要是很好用。

    (1) 拼接请求

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxa8***07444b***&redirect_uri=https%3A%2F%2Fwww.baidu.com&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect

    (2)请求测试结果
    这里写图片描述
    请求之后微信会回调地址加上code和status返回给我们。这样子我们就能拿到code值了。code的有效性只要5分钟,超时再请求会提示错误。

    二、通过code换取网页授权access_token

    首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。

    尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。

    1 请求方法

    获取code后,请求以下链接获取access_token:  https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code 

    2 参数说明

    参数 是否必须 说明
    appid 公众号的唯一标识
    secret 公众号的appsecret
    code 填写第一步获取的code参数
    grant_type 填写为authorization_code

    3 java接口开发

    (1)返回参数实体类

    /**
     * 类名: WeixinOauth2Token.java</br> 
     * 描述: 网页授权信息</br> 
     */
    public class WeixinOauth2Token {
        // 网页授权接口调用凭证
        private String accessToken;
        // 凭证有效时长
        private int expiresIn;
        // 用于刷新凭证
        private String refreshToken;
        // 用户标识
        private String openId;
        // 用户授权作用域
        private String scope;
    
        public String getAccessToken() {
            return accessToken;
        }
    
        public void setAccessToken(String accessToken) {
            this.accessToken = accessToken;
        }
    
        public int getExpiresIn() {
            return expiresIn;
        }
    
        public void setExpiresIn(int expiresIn) {
            this.expiresIn = expiresIn;
        }
    
        public String getRefreshToken() {
            return refreshToken;
        }
    
        public void setRefreshToken(String refreshToken) {
            this.refreshToken = refreshToken;
        }
    
        public String getOpenId() {
            return openId;
        }
    
        public void setOpenId(String openId) {
            this.openId = openId;
        }
    
        public String getScope() {
            return scope;
        }
    
        public void setScope(String scope) {
            this.scope = scope;
        }
    }

    (2)请求方法类

       /**
         * 获取网页授权凭证
         * @param appId 公众账号的唯一标识
         * @param appSecret 公众账号的密钥
         * @param code
         * @return WeixinAouth2Token
         */
        public static WeixinOauth2Token getOauth2AccessToken(String appId, String appSecret, String code) {
            WeixinOauth2Token wat = null;
            // 拼接请求地址
            String requestUrl = WeixinConstants.OAUTH2_URL;
            requestUrl = requestUrl.replace("APPID", appId);
            requestUrl = requestUrl.replace("SECRET", appSecret);
            requestUrl = requestUrl.replace("CODE", code);
            // 获取网页授权凭证
            JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);
            if (null != jsonObject) {
                try {
                    wat = new WeixinOauth2Token();
                    wat.setAccessToken(jsonObject.getString("access_token"));
                    wat.setExpiresIn(jsonObject.getInt("expires_in"));
                    wat.setRefreshToken(jsonObject.getString("refresh_token"));
                    wat.setOpenId(jsonObject.getString("openid"));
                    wat.setScope(jsonObject.getString("scope"));
                } catch (Exception e) {
                    wat = null;
                    int errorCode = jsonObject.getInt("errcode");
                    String errorMsg = jsonObject.getString("errmsg");
                    log.error("获取网页授权凭证失败 errcode:{} errmsg:{}", errorCode, errorMsg);
                }
            }
            return wat;
        }

    (3)发送http请求工具类

       /**
         * 发送https请求
         * @param requestUrl 请求地址
         * @param requestMethod 请求方式(GET、POST)
         * @param outputStr 提交的数据
         * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
         */
        public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
            JSONObject jsonObject = null;
            try {
                // 创建SSLContext对象,并使用我们指定的信任管理器初始化
                TrustManager[] tm = { new MyX509TrustManager() };
                SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
                sslContext.init(null, tm, new java.security.SecureRandom());
                // 从上述SSLContext对象中得到SSLSocketFactory对象
                SSLSocketFactory ssf = sslContext.getSocketFactory();
    
                URL url = new URL(requestUrl);
                HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
                conn.setSSLSocketFactory(ssf);
    
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setUseCaches(false);
                // 设置请求方式(GET/POST)
                conn.setRequestMethod(requestMethod);
    
                // 当outputStr不为null时向输出流写数据
                if (null != outputStr) {
                    OutputStream outputStream = conn.getOutputStream();
                    // 注意编码格式
                    outputStream.write(outputStr.getBytes("UTF-8"));
                    outputStream.close();
                }
    
                // 从输入流读取返回内容
                InputStream inputStream = conn.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String str = null;
                StringBuffer buffer = new StringBuffer();
                while ((str = bufferedReader.readLine()) != null) {
                    buffer.append(str);
                }
    
                // 释放资源
                bufferedReader.close();
                inputStreamReader.close();
                inputStream.close();
                inputStream = null;
                conn.disconnect();
                jsonObject = JSONObject.fromObject(buffer.toString());
            } catch (ConnectException ce) {
                log.error("连接超时:{}", ce);
            } catch (Exception e) {
                log.error("https请求异常:{}", e);
            }
            return jsonObject;
        }

    (4)信任管理器工具类

    /**
     * 类名: MyX509TrustManager.java</br> 
     * 描述: 信任管理器</br> 
     */
    public class MyX509TrustManager implements X509TrustManager {
    
        // 检查客户端证书
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }
    
        // 检查服务器端证书
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }
    
        // 返回受信任的X509证书数组
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }

    4 返回说明

    正确时返回的JSON数据包如下:

    { "access_token":"ACCESS_TOKEN",    
     "expires_in":7200,    
     "refresh_token":"REFRESH_TOKEN",    
     "openid":"OPENID",    
     "scope":"SCOPE" } 
    参数 描述
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    expires_in access_token接口调用凭证超时时间,单位(秒)
    refresh_token 用户刷新access_token
    openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
    scope 用户授权的作用域,使用逗号(,)分隔

    这里写图片描述

    错误时微信会返回JSON数据包如下(示例为Code无效错误):

    {"errcode":40029,"errmsg":"invalid code"} 

    三、刷新access_token(如果需要)

    由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。

    1 请求方法

    获取第二步的refresh_token后,请求以下链接获取access_token:  
    https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN 

    2 参数说明

    参数 是否必须 说明
    appid 公众号的唯一标识
    grant_type 填写为refresh_token
    refresh_token 填写通过access_token获取到的refresh_token参数

    3 java接口

    (1)请求方法类

       /**
         * 刷新网页授权凭证
         * @param appId 公众账号的唯一标识
         * @param refreshToken
         * @return WeixinAouth2Token
         */
        public static WeixinOauth2Token refreshOauth2AccessToken(String appId, String refreshToken) {
            WeixinOauth2Token wat = null;
            // 拼接请求地址
            String requestUrl = WeixinConstants.REFRESH_TOKEN_URL;
            requestUrl = requestUrl.replace("APPID", appId);
            requestUrl = requestUrl.replace("REFRESH_TOKEN", refreshToken);
            // 刷新网页授权凭证
            JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);
            if (null != jsonObject) {
                try {
                    wat = new WeixinOauth2Token();
                    wat.setAccessToken(jsonObject.getString("access_token"));
                    wat.setExpiresIn(jsonObject.getInt("expires_in"));
                    wat.setRefreshToken(jsonObject.getString("refresh_token"));
                    wat.setOpenId(jsonObject.getString("openid"));
                    wat.setScope(jsonObject.getString("scope"));
                } catch (Exception e) {
                    wat = null;
                    int errorCode = jsonObject.getInt("errcode");
                    String errorMsg = jsonObject.getString("errmsg");
                    log.error("刷新网页授权凭证失败 errcode:{} errmsg:{}", errorCode, errorMsg);
                }
            }
            return wat;
        }

    其他方法同上。

    四、拉取用户信息(需scope为 snsapi_userinfo)

    如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。

    注:还有一个获取用户信息的接口直接传入appid和openid就可以了,这里的接口与另一个接口不同,请注意。

    1 请求方法

    http:GET(请使用https协议) 
    https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN 

    2 参数说明

    参数 描述
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    openid 用户的唯一标识
    lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语

    3 java接口

    (1)返回参数实体类

    /**
     * 类名: SNSUserInfo.java</br> 
     * 描述: 通过网页授权获取的用户信息</br> 
     */
    public class SNSUserInfo {
        // 用户标识
        private String openId;
        // 用户昵称
        private String nickname;
        // 性别(1是男性,2是女性,0是未知)
        private int sex;
        // 国家
        private String country;
        // 省份
        private String province;
        // 城市
        private String city;
        // 用户头像链接
        private String headImgUrl;
        // 用户特权信息
        private List<String> privilegeList;
    
        public String getOpenId() {
            return openId;
        }
    
        public void setOpenId(String openId) {
            this.openId = openId;
        }
    
        public String getNickname() {
            return nickname;
        }
    
        public void setNickname(String nickname) {
            this.nickname = nickname;
        }
    
        public int getSex() {
            return sex;
        }
    
        public void setSex(int sex) {
            this.sex = sex;
        }
    
        public String getCountry() {
            return country;
        }
    
        public void setCountry(String country) {
            this.country = country;
        }
    
        public String getProvince() {
            return province;
        }
    
        public void setProvince(String province) {
            this.province = province;
        }
    
        public String getCity() {
            return city;
        }
    
        public void setCity(String city) {
            this.city = city;
        }
    
        public String getHeadImgUrl() {
            return headImgUrl;
        }
    
        public void setHeadImgUrl(String headImgUrl) {
            this.headImgUrl = headImgUrl;
        }
    
        public List<String> getPrivilegeList() {
            return privilegeList;
        }
    
        public void setPrivilegeList(List<String> privilegeList) {
            this.privilegeList = privilegeList;
        }
    }

    (2)请求方法类

    /**
         * 通过网页授权获取用户信息
         * @param accessToken 网页授权接口调用凭证
         * @param openId 用户标识
         * @return SNSUserInfo
         */
        @SuppressWarnings( { "deprecation", "unchecked" })
        public static SNSUserInfo getSNSUserInfo(String accessToken, String openId) {
            SNSUserInfo snsUserInfo = null;
            // 拼接请求地址
            String requestUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
            requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
            // 通过网页授权获取用户信息
            JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);
    
            if (null != jsonObject) {
                try {
                    snsUserInfo = new SNSUserInfo();
                    // 用户的标识
                    snsUserInfo.setOpenId(jsonObject.getString("openid"));
                    // 昵称
                    snsUserInfo.setNickname(jsonObject.getString("nickname"));
                    // 性别(1是男性,2是女性,0是未知)
                    snsUserInfo.setSex(jsonObject.getInt("sex"));
                    // 用户所在国家
                    snsUserInfo.setCountry(jsonObject.getString("country"));
                    // 用户所在省份
                    snsUserInfo.setProvince(jsonObject.getString("province"));
                    // 用户所在城市
                    snsUserInfo.setCity(jsonObject.getString("city"));
                    // 用户头像
                    snsUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
                    // 用户特权信息
                    snsUserInfo.setPrivilegeList(JSONArray.toList(jsonObject.getJSONArray("privilege"), List.class));
                } catch (Exception e) {
                    snsUserInfo = null;
                    int errorCode = jsonObject.getInt("errcode");
                    String errorMsg = jsonObject.getString("errmsg");
                    log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);
                }
            }
            return snsUserInfo;
        }

    4 返回说明

    正确时返回的JSON数据包如下:

    {    "openid":" OPENID",  
     " nickname": NICKNAME,   
     "sex":"1",   
     "province":"PROVINCE"   
     "city":"CITY",   
     "country":"COUNTRY",    
     "headimgurl":    "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ
    4eMsv84eavHiaiceqxibJxCfHe/46",  
    "privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],    
     "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" 
    } 
    参数 描述
    openid 用户的唯一标识
    nickname 用户昵称
    sex 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
    province 用户个人资料填写的省份
    city 普通用户个人资料填写的城市
    country 国家,如中国为CN
    headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
    privilege 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
    unionid 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。



    错误时微信会返回JSON数据包如下(示例为openid无效):

    {"errcode":40003,"errmsg":" invalid openid "} 

    五、检验授权凭证(access_token)是否有效

    1 请求方法

    http:GET(请使用https协议) https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID 

    2 参数说明

    参数 描述
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    openid 用户的唯一标识

    3 返回说明

    正确的JSON返回结果:
    { "errcode":0,"errmsg":"ok"} 
    错误时的JSON返回示例:
    { "errcode":40003,"errmsg":"invalid openid"}
    展开全文
  • 微信网页登入授权Demo

    2017-10-11 10:06:25
    用JAVA实现的微信网页登入授权,想要学习微信网站开发的朋友可以参考
  • 微信网页授权

    千次阅读 2018-09-12 14:33:48
    微信网页授权 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。 关于网页授权回调域名的说明 1、在微信公众号请求用户网页授权之前,开发者需要...
  • js微信网页授权登录获取详细信息,js微信网页授权登录获取详细信息,企业微信授权登录
  • 微信网页开发

    千次阅读 2016-05-09 15:06:32
    微信网页开发
  • 微信网页版无法登录

    万次阅读 热门讨论 2018-05-15 10:46:16
    扫描微信网页二维码登录时出现错误:当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。你可以通过Windows微信、Mac微信或者手机客户端微信登录导致微信无法登录解决方法:清除浏览器的history然后重新登录...
  • 微信网页授权登录

    万次阅读 2016-11-14 14:33:37
    微信网页授权登录 日期:2016-11-14 作者:normanyang 功能:用于纪录微信网页授权步骤(前提条件:公众号为服务号,且通过认证) 微信网页授权api说明网址:...
  • 微信网页清除缓存

    2019-03-30 15:12:49
    微信网页清除缓存 退出当前登录的微信账号然后重新登录
  • 微信网页登录

    千次阅读 2018-09-03 16:19:14
    微信网页授权 首先要获取appID和appsecret 后台设置授权域名 支持IP 后台设置域名或者IP时不要加http://或者https://  直接填写域名即可 如果使用ip地址调试 直接输入IP即可(211.32.122.77) 如上图 业务...
  • 微信网页授权登录
  • 关键词:微信通信协议,用自己的程序收发微信,微信网页web版分析 这几天因为项目需要用自己的程序发送微信,研究了一下微信网页版的通信协议,自己写了个程序,实现微信的登录、初始化、读取联系人列表、发送...
  • 微信网页授权获取用户OpenID 文章目录微信网页授权获取用户OpenID:pushpin:微信网页授权的前提:boom:网页授权域名配置:boom:前端获取Code前端拉起微信OAuth2.0授权解析codecode 注意事项:boom:后端根据code获取用户...
  • 微信网页授权关于state

    千次阅读 2020-02-08 19:20:44
    认识微信网页授权 微信网页授权(官方文档)是公众号开发者在微信内嵌浏览器中获取用户基本信息的唯一方式,其最关键的就是取得用户的 openid,进而才能实现支付一类的功能,因此微信这个 OAuth 的意义已经不仅仅在于...
  • H5微信网页授权

    万次阅读 2018-11-03 14:27:56
    1.微信网页授权:用于获取用户针对于公众号的唯一标识openid。但只能添加一个域名,通常把它设置为一级域名。网页授权回调域名,首先,在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - ...
  • 微信网页授权与微信H5支付

    千次阅读 2018-04-10 21:38:38
    微信网页授权与微信H5支付 一、微信网页授权 用户在点公众号里的链接时,让用户授权,并以此得到用户的更多信息 完整的介绍见: https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1421140842,...
  • 微信网页授权及使用微信jssdk

    千次阅读 2020-02-20 16:55:50
    微信网页授权 开发场景:公众号商城 网页授权有两种方式 一种为以snsapi_base为scope的网页授权,即静默授权, 优点:用户无感知 缺点:用户需关注公众 另一种为以snsapi_userinfo为scope的授权方式 优点:用户...
  • 微信网页授权流程 时序图
  • weixin_login 微信网页授权实现扫码登录
  • H5微信网页授权接口开发 PHP

    热门讨论 2018-05-14 15:20:58
    微信网页授权接口,开发语言是PHP,通过两次跳转实现。通过接口获取用户信息,并追加用户信息(如:openid、昵称、头像等)地址参数跳回前端页面。 具体说明:...
  • chrome调试微信网页

    2019-03-01 09:42:00
    选择【信息】 勾选 打开TBS内核Inspector调试功能 勾选 打开TBS内核X5jscore Inspector调试功能 ...打开微信网页 Remot target下面会显示当前微信打开的网页 转载于:https://www.cnblogs....
  • 基于ThinkPHP3.2.3的微信OAuth2.0微信网页授权
  • 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。 现在,我们要实现一个微信内网页,通过微信访问网页时,网页会展示微信用户的个人信息。因为涉及...
  • 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。 关于网页授权回调域名的说明 1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台...
  • 微信网页授权登录官方文档 微信网页授权登录的方法–推荐文章一 微信网页授权登录的方法–推荐文章二 总结: 微信授权方式(scope的属性值控制): 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能...
  • 微信网页授权流程

    万次阅读 2017-08-30 10:54:00
    如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。 一、 配置网页授权域名   在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,007
精华内容 8,002
关键字:

微信网页