欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-15 13:25:16
本文为学习记录weixin-java-tools实现公众号微信支付. 码云地址: // 授权登录用到 ...

本文为学习记录weixin-java-tools实现公众号微信支付.

码云地址:

    // 授权登录用到
    <dependency>
      <groupid>com.github.binarywang</groupid>
      <artifactid>weixin-java-mp</artifactid>
      <version>3.1.0</version>
    </dependency>
    // 微信支付用到
    <dependency>
      <groupid>com.github.binarywang</groupid>
      <artifactid>weixin-java-pay</artifactid>
      <version>3.1.0</version>
    </dependency>

授权登录官方 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后的支付和授权还是很方便的,麻烦的是微信方面的一些配置和流程... 很坑。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。