资讯专栏INFORMATION COLUMN

使用 weixin-java-tools 完成微信授权登录、微信支付

Martin91 / 941人阅读

摘要:统一下单方法注商户中心支付路径设置所有调起微信支付的页面都要在此注册,否则微信支付会一闪而过。至此微信支付完成。

作者码云地址:点我

        // 授权登录用到
        
            com.github.binarywang
            weixin-java-mp
            3.1.0
        
        // 微信支付用到
        
            com.github.binarywang
            weixin-java-pay
            3.1.0
        

授权登录官方 api:点我

个人理解的授权登录流程:引导用户点击唤起授权登录的地址,打开页面后携带微信返回的code参数;使用code参数获取AccessToken;获取用户数据。
引导客户打开授权登录地址后,携带code跳转到指定页面在指定页面调用方法:

public Result getAccessToken(@RequestParam(name = "code") String code, HttpServletRequest request, HttpServletResponse response) {
        if (StringUtils.isBlank(code)) {
            return Result.error("code不存在");
        }
        try {
            WxMpOAuth2AccessToken wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
            String accessToken = wxMpOAuth2AccessToken.getAccessToken();
            // 获取用户微信账户信息
            WxMpUser wxMpUser = wxMpService.getUserService().userInfo(wxMpOAuth2AccessToken.getOpenId());
            if (StringUtils.isBlank(wxMpUser.getOpenId())) {
                return Result.error("用户数据不存在");
            }
            return Result.success(wxMpUser);
        } catch (WxErrorException e) {
            e.printStackTrace();
            log.info("授权异常:{}", e);
            return Result.error("授权登录失败");
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("登录失败");
        }
    }

前端保存下用户信息就完事了。

个人理解的微信支付流程:用户页面点击<微信支付>按钮 后端调用 <微信统一下单> 统一下单返回参数 ,前端使用 <统一下单>返回的参数唤起微信支付。
商户中需要在api安全中设置很多东西... 就不一一赘述了
微信支付官方api 前端:点我
后端api点我
商户登录地址 点我

public Result pay(Long orderNo, HttpServletRequest request) {
        
        //查询订单信息
        Order order = orderService.findByOrderNo(orderNo);

        try {
            WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
            //获取当前用户
            UserInfo userInfo = RequestContextHolderUtil.getUserInfo();
            orderRequest.setBody("支付内容的说明");
            //商户号
            orderRequest.setMchId(mchId);
            orderRequest.setAttach("xxx公司");
            orderRequest.setOutTradeNo(orderNo.toString());
            orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(order.getPayment().toString()));//元转成分
            orderRequest.setOpenid(userInfo.getOpenId());
            orderRequest.setSpbillCreateIp(HttpUtils.getIp(request));
            //我这里是微信公众号内打开的h5页面 type使用 JSAPI  根据业务场景变更
            orderRequest.setTradeType(WxPayConstants.TradeType.JSAPI);

            // 支付成功后跳转页面   这里需要对url进行编码
            orderRequest.setNotifyUrl("http://xxxxxxxxx");
            orderRequest.setAppid(appId);
            
            // 调用sdk提供的统一下单方法  createOrder会返回重新组装后的对象  建议使用这个 
            Object unOrder = wxService.createOrder(orderRequest);
            // 这个可能是偏向原生一点的统一下单,返回的参数有很多没用的 或者null值  建议使用 createOrder下单
            // wxService.unifiedOrder(orderRequest); 
            
            return Result.success(unOrder);
        } catch (Exception e) {
            log.error("微信支付失败!订单号:{},原因:{}", orderNo, e.getMessage());
            e.printStackTrace();
            return Result.error("支付失败,请稍后重试!");
        }
    }

前端js代码:
前端唤起微信支付的时候可能会出一些问题,这里建议使用 console.log(res.err_desc);输出错误信息
res.err_msg 只会提示支付失败... desc会提示一些具体信息

function onBridgeReady(){
    WeixinJSBridge.invoke(
        "getBrandWCPayRequest", {
            "appId":"wx31fd1e1bad23db37",     //公众号名称,由商户传入
            "timeStamp":wxData.timeStamp,         //时间戳,自1970年以来的秒数
            "nonceStr":wxData.nonceStr, //随机串
            "package":wxData.packageValue,
            "signType":wxData.signType,         //微信签名方式:
            "paySign":wxData.paySign //微信签名

        },
        function(res){
            console.log(res.err_desc)
            if(res.err_msg == "get_brand_wcpay_request:ok" ){
                // 使用以上方式判断前端返回,微信团队郑重提示:
                //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
            }
        });
}
var wxData={};
function pay(orderId){
    $.ajax({
        url:"统一下单方法url",
        type:"get",
        data:{orderNo:orderId},
        beforeSend: function (xhr) {
            xhr.setRequestHeader("token", $.cookie("token"));
        },
        crossDomain: true,
        success:function(result){
            wxData=result.data;
            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();
            }
        }
    });
}

注:商户中心支付路径设置 所有调起微信支付的页面都要在此注册,否则微信支付会一闪而过。
微信开发工具上可以模拟授权登录,但是无法模拟微信支付,所以微信支付在微信开发工具上出现的错误都不用管,直接拿到真机上去测试!

使用了sdk后的支付和授权还是很方便的,麻烦的是微信方面的一些配置和流程... 很坑。
感谢sdk作者。
至此微信支付完成。
记录下代码方便下次使用。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76993.html

相关文章

  • 浅析微信支付微信支付简单介绍(小程序、公众号、App、H5)

    摘要:本文是浅析微信支付系列文章的第二篇,主要讲解一下普通商户接入的支付方式以及其中的不同之处。浅析微信支付前篇大纲微信支付是集成在微信客户端的支付功能,用户可以通过手机完成快速的支付流程。目前微信支付支持手机系统有苹果安卓和。 本文是【浅析微信支付】系列文章的第二篇,主要讲解一下普通商户接入的支付方式以及其中的不同之处。 上篇文章讲了本系列的大纲,没有看过的朋友们可以看一下。 浅析微信支...

    shadowbook 评论0 收藏0
  • 推荐10个Java方向最热门的开源项目(8月)

    摘要:设计模式可以通过提供经过验证的经过验证的开发范例来加速开发过程。将流程作为突破点,并在多个领域工作,包括流量控制,并发,断路和负载保护,以保护服务稳定性。 1. JCSprout(Java核心知识库) Github地址: https://github.com/crossoverJie/JCSprout star: 12k 介绍: 处于萌芽阶段的 Java 核心知识库。 2....

    wushuiyong 评论0 收藏0
  • 浅析微信支付微信公众号网页授权

    摘要:浅析微信支付微信公众号网页授权本文是浅析微信支付系列文章的第四篇,主要讲解微信支付前如何获取获取网页授权及用户信息获取。浅析微信支付系列已经更新三篇了哟,没有看过的朋友们可以看一下哦。 浅析微信支付:微信公众号网页授权 本文是【浅析微信支付】系列文章的第四篇,主要讲解微信支付前如何获取获取网页授权及用户信息获取。 浅析微信支付系列已经更新三篇了哟~,没有看过的朋友们可以看一下哦。 浅...

    tinyq 评论0 收藏0
  • 浅析微信支付:开通免充值产品功能及如何进行接口升级指引

    摘要:本文是浅析微信支付系列文章的第十五篇,主要讲解如何开通免充值产品功能流程和其中的注意事项,对于接口升级会重要讲解,避免爬坑。 本文是【浅析微信支付】系列文章的第十五篇,主要讲解如何开通免充值产品功能流程和其中的注意事项,对于接口升级会重要讲解,避免爬坑。 浅析微信支付系列已经更新十五篇了哟~,没有看过的朋友们可以看一下哦。 浅析微信支付:商户平台代金券或立减优惠开通、指定用户代金券发...

    NicolasHe 评论0 收藏0
  • vue项目接入微信JSSDK的坑

    摘要:微信说明文档分享的坑根据的文档,很多人都是在初始化的配置的时候,传入的当前的地址不正确。同样的,给微信初始化的加入对应的参数。 date: 2018-12-13 15:23:09 用于记录接入微信JS-SDK的坑,以后方便查询第一次接入公众号微信支付、分享、定位等等的坑的时候,心里是迷茫而又恐惧。因为,听说坑特别多,后来发现自己的亲身体验到了这一点。 支付的坑 1、当前URL未注册 ...

    lieeps 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<