最近两周实现了调用微信接口使用微信进行支付的需求,包含公众号支付及扫码支付两种方式,由于微信文档写的较为简略,现将调用微信接口进行支付流程进行记录及分享。
本文旨在对公众号支付的实现流程进行介绍,即微信用户从公众号中点击链接进入商品编辑页面,选择商品后点击支付按钮后弹出微信支付页面,输入支付密码,支付成功后跳转到全部商品页面的整个过程。微信扫码支付请参看后续文章。
1,首先,商户需申请微信公众号,微信商户号及微信支付权限。开发过程中需参照公众号及商户平台提供如下参数:
①appid:公众号id,登录微信公众号——开发-基本配置中获得;
②mch_id:收款商家商户号;
③APP_SECRET:第三方唯一凭证密码;
④关键:收款商户后台进行配置,登录微信商户平台,账户设置,安全设置api安全,设置32位关键值。
2,登录微信公众号,进行开发相关设置:
①获取用户基本信息(主要是openid)权限配置:微信公众平台,开发——接口权限——网页授权——网页授权域名(不接受IP地址,需通过ICP备案验证,不带http):
,
②支付测试目录及测试白名单设置:微信公众平台——微信支付——开发配置,测试授权目录具体到最后一级。
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实现)