2023最新微信支付(小程序、H5等)项目wechatpay-java实战,一步一步带你完成项目前后端逻辑

专栏背景

大家好! 这是我第一次结合项目实战过程来写本专栏,本专栏也是在做了一些思考后才去写的,其主要目的是为集成微信支付开发者提供一些思路和经验,并讲解一下其中的技术点,并对整体技术有个全面的提升,让更多的童鞋们少走弯路,同时也算是对自己的一次复盘和总结。

专栏主要是结合项目中的用户缴纳保证金功能来围绕叙述。本专栏涉及的业务库表、功能设计、前后端代码开发、功能测试等全部由我一个人完成,项目中本业务点周期大概为2个周的时间(包括开发与测试),当然也有部分是参考了网上给予的解决方案。核心功能点涉及微信支付保证金订单保证金退款保证金现存量更新等功能。

有的朋友可能会说一个微信支付而已,看看微信官方文档就可以了,有必要弄个专栏来详细描述么?一开始我也不服,觉得照着官方的api搞搞就可以了,但是当我在开发项目时,我发现里面涉及的业务设计点、业务关联的技术栈、微信官方提供的sdk源码解读等方面都是有必要讲解的,而新手上来时根本不知道如何下手,尤其是对于那种工作两三年的、想提升自己的设计思路、编码能力、拓宽自己技术面的全栈开发工程师尤为必要。下面举几个例子来说明一下本专栏的必要性。

  • 1、根据项目缴纳保证金业务如何设计,对于行业标准操作逻辑是什么?如何充值保证金、如何申请提现保证金?
  • 2、微信官方api文档中推荐的sdk(wechatpay-java)中,如何实现加签、验签、加密、解密的、是如何封装的?为什么需要加签、签证签名?微信官方提供的密钥、证书、微信平台证书、商户证书又是如何运作的?
  • 3、wechatpay-java中如何初始化config配置类,具体的集成过程是怎样的。
  • 4、如何给微信支付回调或保证金存量数据,设置数据锁进行控制?该使用什么样的锁?可以使用数据库锁么?是否有必要使用分布式锁?什么场景下会使用分布式锁?
  • 5、如何使用spring声明事务,事务的隔离机制具体是如何应用在实际场景中?在事务下使用异步任务会发生什么?编程式事务又是什么

上述几点,我觉得对于新手来说、尤其是没有项目实战的同志们是困难的,当然还有其他的点,后面会写在本专栏的大纲和目录中。

专栏大纲

第一节: 保证金缴纳功能设计
第二节: 接口安全设计原理(加签、验签、加密、解密)
第三节: 微信支付平台接入流程,小程序账号注册、商户注册
第四节: -集成微信支付sdk、微信支付流程、微信支付API安全原理
第五节: 证书申请、微信支付接口开发、SDK源码解读。
第六节: 充值(支付)功能开发前后端
第七节: jvm锁、redis分布式锁、mysql数据库锁的使用
第八节: spring声明式事务、编程式事务、分布式事务
第九节: 保证金提现(退款功能开发)
第十节: 竞拍系统设计支持高并发
第十一节: 压力测试及总结

本大纲共分为11大节,每一节都会是一篇文章:

第一节主要要介绍项目的业务需求、功能设计、库表设计、比如钱包的概念等。

第二节会介绍集成微信支付的具体流程,主要包括微信哪些接口需要我们调用,在每一个接口中如何处理业务数据,为了完成支付业务,都要做哪些校验逻辑,每个微信接口和业务是怎么相互结合的。

第三节会介绍接口安全的概念,为什么会有加签、验签。丛一端到另一端数据是如何进行安全传输的,具体的流程逻辑是什么。

第四节会介绍在微信支付平台中,微信是如何做到数据的安全传输的,集成微信支付都需要申请哪些证书,具体的实现原理和代码是怎么样的。

第五节就进入了正式开发环节了,针对微信接口的返回值、状态数据、api、配置等进行一些封装,供具体业务使用。

第六节会开发微信下单、前端调起支付、支付回调、定时任务查单,订单关闭等功能。并贴出具体的代码逻辑

第七节会介绍jvm锁、redis分布式锁、mysql数据库锁的原理

第八节会介绍spring事务,主要包括声明式事务、编程式事务的使用。

第九节会介绍将七八两节的内容补充到项目中的更新业务数据的逻辑中。并开发用户提现功能。提现功能包括客户端提交申请,经过两步骤审核到达调用微信退款接口、微信退款回调、更新业务数据等流程,并详细讲解业务发生异常时如何进行处理。

第十节将介绍竞拍系统在瞬时并发较高的情况下如何支持大的并发数。如果服务器数量少的情况下,如何使用redis锁、信号量、限流等机制来保证并发。竞拍系统如何设计与开发,我也会把我所想的方案和思路和大家共享。最后再穿插描述一下实际的秒杀系统又是如何设计的。

第十一节将介绍如何使用jmeter来对竞拍系统进行压测,具体的压测步骤、压测参数的配置及含义。

以上十一节的内容我认为涉及了很多技术栈,如:redis缓存、分布式锁、事务、异步队列、安全认证、微信接口的封装、业务异常处理等。在开发过程中我也在细节上犯了很多错误,比如spring 事务那里。在高并发这里和压测这里我也学到了不少知识。开发完这个项目后,我感觉不管是设计方面还是对技术的掌握上都有了很多提升,同时也踩了不少坑,尤其是对技术栈细节的把握上深有感受。所以这里我想以项目实战的方式将这些知识点串起来,并形成文档,分享给自己和大家。

项目框架

项目使用
后端:springboot+shiro+mybatisplus+eurak+zuul+mysql
前端:小程序(uniapp)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
注意要点: 1,Topay里面的参数要填好:appid,appsecret,mch_id,partnerkey,spbill_create_ip 2,openid 需要微信授权获取到 3,每次支付orderNo要不同 openid参考实例: 1,授权链接地址:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxba3445566677&redirect_uri=http://www.acc.com/weixin/pay/paydispatcher&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect 2,转向处理地址:通过第一个链接微信会把code传过来,之前参数获取就行 @RequestMapping(value = "/paydispatcher", method = { RequestMethod.GET }) public void payDispatcher(HttpServletRequest request, HttpServletResponse response) throws Exception { String code = request.getParameter("code"); String msg=""; if(code==null||code.equals("")){ msg="获取微信Code失败!"; request.setAttribute("msg" ,msg); request.getRequestDispatcher("/jsp/login.jsp").forward(request,response); }else{ WeixinUtil util = new WeixinUtil(); UserAccessToken token = (UserAccessToken) request.getSession().getAttribute("UserAccessToken"); if(null==token){ token = util.getAccessToken3(Constants.APPID, Constants.SECRET,code); request.getSession().setAttribute("UserAccessToken",token); } request.setAttribute("openid", token.getOpenid()); request.setAttribute("accessToken", token.getAccessToken()); request.setAttribute("refreshToken", token.getRefreshToken()); request.setAttribute("expiresIn", token.getExpiresIn()); request.getRequestDispatcher("/pay/index.jsp").forward(request,response); } } // 获取用户openid accesstoken public static UserAccessToken getAccessToken3(String appid , String appsecret,String code) { UserAccessToken accessToken = null; String requestUrl = Constants.GET_OPENID_ACCESSTOKEN_URL.replace("APPID" , appid).replace("APPSECRET" , appsecret).replace("CODE" , code); String json = httpRequest(requestUrl , "GET" , null); JSONObject jsonObject = JSONObject.fromObject(json); // 如果请求成功 if (null != jsonObject) { try { accessToken = new UserAccessToken(); accessToken.setAccessToken(jsonObject.getString("access_token")); accessToken.setRefreshToken(jsonObject.getString("refresh_token")); accessToken.setExpiresIn(jsonObject.getInt("expires_in")); accessToken.setOpenid(jsonObject.getString("openid")); accessToken.setScope(jsonObject.getString("scope")); } catch (Exception e) { accessToken = null; // 获取token失败 System.out.println("获取token失败 errcode:{} errmsg:{}"); } } return accessToken; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

senda66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值