高级架构精品主题
微信支付类型
其实微信支付有很多种不同的类型。用哪一个,要看不同的应用场景。官方引用的例子是:
信用卡支付:用户打开微信钱包的信用卡接口,商家扫码提交支付。
微信官方账号支付:用户在微信中进入商家的H5页面,调用JSSDK完成支付。
扫码支付:用户打开“微信扫描”,扫描商家二维码后完成支付。
APP支付:商家APP中集成了微信SDK,用户点击跳转到微信即可完成支付。
H5支付:用户在微信以外的手机浏览器中请求微信支付的场景,唤起微信支付。
小程序支付:用户在微信小程序中使用微信支付的场景。
本文是关于微信官方账号支付的,会用到网页授权和微信JS-SDK的相关知识,但不会详细介绍
建议您先阅读以下文章,了解相关内容:
授权:https://www.jianshu.com/p/94b0e53cccc3
微信-SDK:https://www.jianshu.com/p/b3c4450f845e
实现效果如下:
微信官方账号支付相关配置
本文实现了微信官方账号支付,实现条件如下:
1。需要一个已经微信认证的微信官方账号
2。微信官方账号需要开通微信支付功能
3。在微信商户平台https://pay.weixin.qq.com注册一个商户账号,并与您的微信官方账号关联。如果需要通过小程序实现支付,需要关联小程序。
4。有正规的应用服务器,注册域名
微信涉及大量隐私数据,不允许使用natapp、花生壳等内网渗透工具。它需要正规的服务器环境,需要注册域名,不能使用IP。
例如:http://www.baidu.com
5。相关配置
5.1配置支付授权目录,进入商户平台-->产品中心-->开发
图中配置的例子显示,项目的根路径和web目录中的页面都有支付权限,如果不在该路径的页面中,则无法调用支付功能。
如果页面地址是:http://mywexx.xxxx.com/web/pay.html
它需要配置为:http://mywexx.xxxx.com/web/.
5.2设置API key登录商家平台-->:账户--> API的安全性--> API key
在后面的代码中计算支付签名时,需要使用该键。
5.3配置JS接口安全域名和网页授权域名,并——>
配置网页授权域名:主要用于获取用户的openid,需要识别这是谁。
如果不知道openID,可以参考微信微信官方账号开发文档:https://mp.weixin.qq.com/wiki.
配置JS接口安全域名:在我们的页面上弹出密码输入窗口,需要使用微信提供的JS-SDK工具。如果不配置JS接口安全域名,就不能在页面上使用JS-SDK。
微信官方账号支付实现流程
流程大致参考官方时序图:
流程很多,就不一一演示了。我们将选择核心部分来实现它们。
1。提供商城首页,用户进入后可以通过网页授权获得OpenID
如果不熟悉网页授权的学生首先参考本文:
https://www.jianshu.com/p/94b0e53cccc3
访问主页的地址:http://www.wolfcode.cn/index.do
用户第一次打开主页时,默认没有代码参数。此时,他们将首先被重定向到授权地址。
(如果只需要获取openid,可以使用scope静默授权snsapi_base)
当授权地址重定向到我们的index.do时,会带code参数,然后通过接口就可以获得用户的openid。
@ controller public class index controller { @ request mapping(" index ")public void index(String code,Model model,HttpServletResponse response,HttpServletRequest request) {//如果有代码,可以获取用户的openid if(code!=null) {//用代码交换access _ token JSON对象JSON = wechatutil。getwebaccesstoken(代码);//获取用户OpenID string OpenID = JSON . getstring(" OpenID ");//设置为session request.getsession()。setattribute ("OpenID ",OpenID);//重定向到主页 response . send Redirect("/index . html "); }else{ //重定向到授权页面 response . send redirect(we chat util . web _ redirect _ URL . replace(" appid ",wechatutil.appid) 。replace ("redirect _ uri ",request util . geturl( } } } 注:1 .方法一。关于网页授权的文章中介绍了WeChatUtil.getWebAccessToken。 2。WEB_REDIRECT_URL是网页授权的地址常量: public static final string WEB _ REDIRECT _ URL = " https://open . weixin . QQ . com/connect/oauth 2/authorize?"+ " APPID = APPID & amp;重定向URI & amp;代码& ampscope = snsapi _ base #微信_重定向"; 2。点击产品并跳转到产品详情页面
页面是根据自己的项目添加的。主要原因是页面需要提供立即下单的按钮。(此处不演示加入购物车的功能)
点击“立即购买”按钮,跳转到后台的订单地址,带上当前商品的id。
& lt脚本& gt $(function () {//立即购买按钮 $ ("# orderbtn ")。click(function(){//Get product ID var ID = $(" # product ID ")。val();//提交到order window . location . href = "/order . do?product id = "+id; }) })& lt;/script & gt; 3。接收商品参数,调用微信支付统一订购接口
正常的业务流程是,在这种方法中,获取产品的id,然后通过id在数据库中查询产品的相关属性,如名称、价格等,然后创建业务订单,再调用微信支付的统一下单接口(微信可以生成一个预付款单据,然后才能进行后续支付)。
不过这里强调的是支付流程,商品的属性值和订单相关的值,虚假数据暂且不用。
以及界面参数请参考微信官方提供的统一订购文件:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?.章=9_1
根据文档介绍,当我们调用统一订购接口时,需要携带相关的所需参数如下:
1.PNG
将所需参数封装到相应的实体类中:
接口调用成功后返回的结果也被封装到实体类中:
这个结果中最重要的参数是prepay_id参数,当页面上弹出支付窗口时需要这个参数。
注:下单的业务逻辑正常情况下需要提取到业务层,但是这里为了方便阅读代码,直接写到控制器。
@ controller public class order controller { @ Request mapping(" order ")public String save(Long product id,Model model,Http servlet Request)throws exception {//根据产品id /productservice查询产品详情(虚假数据)。getproductbyid(product id) double price = 0.01;//(0.01元) String product name = " sweety ";//生成订单号 int number = (int) ((math。random()* 9)* 1000);//随机数 date format date format = new simple date format(" yyyymmdd hhmmss ");//Time String顺序号= date format . format(new date())+number;//Get OpenID string OpenID =(string)request . getsession()。get attribute(" OpenID ");//准备调用接口 wxordereentity order = new wxordereentity()所需的参数;//微信官方账号appid order . setappid(wechatutil . appid);//商家号 order . set mch _ ID(we chat util . mch _ ID);//产品描述 order . set body(Product name);//设备编号,通过微信官方账号支付直接填入web order . set device _ info(" web ");//交易类型 order . settle _ type(" JSAPI ");//商家订单号 order.setout _ trade _ no(订单号);//支付金额(单位:分钟) order . set total _ fee((int)(price * 100));//用户ip地址 order . setspbill _ create _ IP(request util . getip address(request));//user OpenID order . set OpenID(OpenID);//接收支付结果的地址 order . set notify _ URL(" http://www . wolf code . com/receive . do ");//32位随机数(去掉UUID后的32位) 字符串UUID = UUID。随机UUID()。Tostring()。替换("-"," "); order . set nonce _ str(uuid);//生成签名 stringsign = wechatutil。getpaysign(订单); order . set sign(sign);//调用微信支付统一订购接口,让微信也生成一个预付款订单 String XML result = http util . post(get _ pay _ URL,XML util . to XML String(order));//将返回的xml字符串转换成对象 WxOrderResultity entity = XML util . to object(xxorderresultity . class);//如果微信预付款单创建成功,跳转到付款单页面支付 if (entity。getreturn _ code()。等于(“成功”)& ampEntity.getresult _ code()。equals(" success "){//jssdk权限验证参数 treemap
官方文件参考:
https://mp.weixin.qq.com/wiki? t = resource/RES _ main & amp;id=mp1421141115
付费:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?章节=4_3
/** *计算jssdk-config的签名 * @ param timestamp * @ param nonce str * @ param URL * @ return */ Public static string get signature(long timestamp,string nonce str,string URL){//将所有要签名的参数按照字段名的ASCII码从小到大排序(字典顺序) map
不了解微信JS-SDK的同学可以先参考一下这篇文章:
https://www.jianshu.com/p/b3c4450f845e
在页面中调用微信JS-SDK,通过config接口注入权限验证配置,添加支付功能。
& lt!-jquery-& gt; & lt;script src = "/js/jquery . min . js " type = " text/JavaScript " charset = " utf-8 " & gt;& lt/script & gt; & lt;!-微信的JSSDK--> & lt;script src = " http://RES . wx . QQ . com/open/js/jweixin-1 . 2 . 0 . js " & gt;& lt/script & gt; & lt;脚本& gt $(function(){ & lt;!-通过config接口注入权限验证配置->: wx.config({ debug: true,//打开调试模式 appid:' $ {configmap.appid} ',//微信官方账号唯一标识符 时间戳:' $ {configmap.timestamp} ',//签名生成时间戳 non centr:' $ { config map . non centr } ',//签名生成随机字符串 签名:' $ {configmap.signature} ',//签名 !- config将在成功验证后调用代码-& gt; wx . ready(function(){ //点击立即支付按钮 $ ("# paybtn ")。点击(function(){ /弹出支付窗口 wx.choosewxpay()。时间戳:“$ {支付地图。时间戳} ',//支付签名时间戳, nonce字符串:' $
',//支付签名随机字符串,长度不超过32位 Package:' $ ',//统一支付接口返回的prepay_id的参数值。提交格式如下:Prepay _ ID = XXXX) Sign Type:' $ { pay map。符号类型}”。//默认情况下,签名方法为“SHA1”。要使用新版本的支付,您需要传入“MD5” pay sign:“$ { pay map。Paysign} ',//支付签名 成功:函数(RES){ /支付成功后回调函数 预警("支付成功!"); } }); }) }); });& lt/script & gt; 点击立即支付打开支付窗口:
付款完成:
5。支付结果的处理[/s2/]
用户支付时,微信会将支付结果发送到前面指定的notify_url地址。我们可以根据支付结果的参数做相关的业务逻辑,但这里暂时不会实现。付款通知结果的具体参数请参考官方文章:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?章节= 9 _ 7 & amp指数=8
作者:陈晖
链接:https://www.jianshu.com/p/9c322b1a5274