微信支付之公众号支付(java实现)

  

最近两周实现了调用微信接口使用微信进行支付的需求,包含公众号支付及扫码支付两种方式,由于微信文档写的较为简略,现将调用微信接口进行支付流程进行记录及分享。
  

  

本文旨在对公众号支付的实现流程进行介绍,即微信用户从公众号中点击链接进入商品编辑页面,选择商品后点击支付按钮后弹出微信支付页面,输入支付密码,支付成功后跳转到全部商品页面的整个过程。微信扫码支付请参看后续文章。

  

1,首先,商户需申请微信公众号,微信商户号及微信支付权限。开发过程中需参照公众号及商户平台提供如下参数:
  

  

①appid:公众号id,登录微信公众号——开发-基本配置中获得;
  ②mch_id:收款商家商户号;
  ③APP_SECRET:第三方唯一凭证密码;
  ④关键:收款商户后台进行配置,登录微信商户平台,账户设置,安全设置api安全,设置32位关键值。

  

2,登录微信公众号,进行开发相关设置:
  

  

①获取用户基本信息(主要是openid)权限配置:微信公众平台,开发——接口权限——网页授权——网页授权域名(不接受IP地址,需通过ICP备案验证,不带http):
  

  

微信支付之公众号支付(java实现),
  

  

②支付测试目录及测试白名单设置:微信公众平台——微信支付——开发配置,测试授权目录具体到最后一级。

  

3,获取用户openid, openid是公众号一对一对应用户身份的标识:
  

  

①微信网页授权获取用户信息文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/functions/userinfo.html。根据文档拼装url,引导用户在微信上点击该链接,获取用户openid等基本信息;
  

  

②引导用户点击url(例如公众号推送该链接),形式如下:
  https://open.weixin.qq.com/connect/oauth3/authorize& # 63; appid=APPID& redirect_uri=REDIRECT_URI& response_type=code&范围=SCOPE&状态=# wechat_redirect
  

  

各个参数需替换,含义如下:
  REDIRECT_URI:重定向URL,可为商品列表页面或商品页面,用户授权成功即转到该URL指向页面
  范围:snsapi_base和snsapi_userinfo两种,snsapi_base为用户静默授权,snsapi_userinfo需要用户进行授权确认,可以获得更多用户信息。本文选择后者
  状态:重定向后会带上此参数
  

  

③用户授权后,重定向的页面获得代码参数(若用户禁止授权,则重定向后不会带上代码参数,仅会带上状态参数redirect_uri& # 63;状态=状态),官方对于代码参数的说明如下:

  
  

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

     

重定向页面对应控制器中通过<代码>字符串代码=getPara(“代码”);获取代码参数。
  

  

④控制器中同时利用WxPayUtil中方法,调用微信接口,获取当前用户openid,将该openid存入会话:

        setSessionAttr (“openid”(WxPayUtil.getOpenIdByCode(代码)). get (" openid "));      

4,用户选择商品点击付款,在商家提供编辑页面确认支付对应控制器中,进行统一下单,获得prepay_id(这里需要注意,订单金额转换成以分为单位)。统一下单的官方文档地址为:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php& # 63;=9章_1

     //统一下单,返回xml,用return_code判断统一下单结果,获取prepay_id等预支付成功信息   字符串prePayInfoXml=WxPayUtil。unifiedOrder (“WxPay userOrder.getStr (“orderNo”), (entity.getBigDecimal (“orderMoney”)。乘(新BigDecimal (100))) .intValue (), WxPayUtil.getIpAddr (getRequest ()), getSessionAttr (openid) .toString ());//生成包含prepay_id的地图,地图传入前端   地图=WxPayUtil.getPayMap (prePayInfoXml);//将订单号放入地图,用以支付后处理   map.put (“orderNo”, userOrder.getStr (“orderNo "));      

5,前端获得上一步中的地图后,调用微信支付JSAPI,前端js代码如下所示:

        & lt;脚本type=" text/javascript祝辞   函数payPublic () {   Common.AjaxSubmitBind(“了saveForm函数(){   saveIndex=Common.Loading(“正在付款中“);   }、功能(数据){   prepay_id=data.prepay_id;   paySign=data.paySign;   appId=data.appId;   时间戳=data.timeStamp;   nonceStr=data.nonceStr;   packageStr=data.packageStr;   signType=data.signType;   orderNo=data.orderNo;   callpay ();   }、功能(errMsg errCode) {   Common.Alert (errMsg);   });   }   var prepay_id;   var paySign;   var appId;   var时间戳;   var nonceStr;   var packageStr;   var signType;   var orderNo;      函数rel=巴獠縩ofollow”;   }   如果(res.err_msg==癵et_brand_wcpay_request:取消”){   alert("交易取消”);   window.location.href=" https://www.yisu.com/zixun/${基地}/测试/取消”rel=巴獠縩ofollow”;   }   如果(res.err_msg==癵et_brand_wcpay_request:失败”){   alert("支付失败”);   window.location.href=" https://www.yisu.com/zixun/${基地}/测试/失败”rel=巴獠縩ofollow”;   }   }   );   }   函数callpay () {   如果(typeof WeixinJSBridge==岸ㄒ濉?{   如果文档。addEventListener) {   document.addEventListener (‘WeixinJSBridgeReady’,>   公共空间notify () {   System.out.print(“微信支付回调获取数据开始”);   HttpServletRequest请求=getRequest ();   字符串resXml=WxPayUtil.getNotifyResult(请求);//向微信输出处理结果,如果成功(成功),微信就不会继续调用了,否则微信会连续调用8次   renderText (resXml“text/xml”);   }

微信支付之公众号支付(java实现)