15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 在线教育项目实战(微信支付)目录-上

在线教育项目实战(微信支付)目录-上

时间:2022-08-06 22:27:02 | 来源:网站运营

时间:2022-08-06 22:27:02 来源:网站运营

第一章 项目介绍和前期准备

简介:课程介绍,项目的搭建

1:大纲介绍

2:微信支付项目效果演示

3:SpringBoot2.x的基础

4:开发环境 jdk8 idea maven git mysql




简介:介绍一个项目如何从零到上线,步骤和流程

1:从需求调研到项目上线

2:需求评审(产品-设计-前端-后台-测试-运营)-》ui设计-》开发(前端和后台架构开发)-》前后端联调-》项目体侧-》-》bugFix-》回归测试-》运维开发部署上线-》灰度发布-》全量发布-》维护和运营




简介:分析开发功能点和系统架构应该怎么架构

开发功能点:首页视频列表、视频详情、微信扫码支付、我的订单

1、架构设计:

前后点分离(方案:node渲染)

动静分离(方案:静态资源放到cdn或者nginx服务器上)

后端技术(springboot2.x+redis4.x+httpclient+mysql+activieMq)

前端技术(html5+bootstrap+jquery)

2、测试要求:首页和视频详情页qps单机qps 2000+




简介:讲解后台数据库设计,字段冗余的好处,以及常见注意事项

数据库设计:er图

字段的冗余

部分测试数据的导入

第二章 项目基础环境搭建和逆向工程构建

spring-boot-starter-web spring-boot-starter-data-redis mybatis-spring-boot-starter mysql-connector-javaIntelliJ IDEA使用教程_IntelliJ IDEA开发中文手册[PDF]下载-极客学院Wiki

相关偏好里开启自动编译

Shift+Ctrl+Alt+/,选择Registry

选 compiler.automake.allow.when.app.running 重启项目就可以了

基本目录结构 controller service impl mapper utils domain config interceptorer dto简介:讲解开源工具的好处和弊端,如pageHeper分页拦截器,tk自动生成工具,抽象方法的利弊等

1、开源工具:

2、好处:开发方便,使用简单,使用aop方式进行分页,只需要引入相关依赖,然后PageHelper.startPage(page, size); 开启分页

3、弊端:对于分库分表等情况下使用有问题,深度分页逻辑判断会复杂

4、mysql资料:

深度分页:

MySQL大数据量分页性能优化 - lpfuture - 博客园

MySQL 百万级分页优化(Mysql千万级快速分页)

5、封装的好坏:

关于抽象和不抽象的选择,比如tk这些工具,通用mapper,service,controller

代码量大大减少,开发新模块可以马上进行使用,对应过度封装,新手等比较难理

不 能保证团队里面所有人都有对应的水平,或者有高度封装的思想,也不是过度封

装,项目通用工具使用缓存操作、切换缓存等。

第三章 开发在线教育视频站点核心业务视频列表相关接口开发

简介:整合mysql加入mybatis依赖,加入druid数据源

依赖:

<!-- 引入starter--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <!-- MySQL的JDBC驱动包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- 引入第三方数据源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency> 加入配置文件 #可以自动识别 #spring.datasource.driver-class-name =com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/movie?useUnicode=true&characterEncoding=utf-8 spring.datasource.username =root spring.datasource.password =password spring.datasource.type =com.alibaba.druid.pool.DruidDataSource 开启类增加mapper扫描 @MapperScan("net.xdclass.xdvideo.mapper")参考语法 mybatis - MyBatis 3

xml配置:mybatis - MyBatis 3




简介:使用mybatis3.x注解方式,增删改查,控制台打印sql语句

1、控制台打印sql语句,用于本地测试

2、mapper代码编写

3、数据库字段和java实体类的映射配置




简介:完善相关接口、协议规范讲解

1、save接口保存对象 @RequestParam(value = "page", defaultValue)int videoI 可以设置默认值,比如分页

)@RequestBody 请求体映射实体类,需要指定http头为 content-type为application/json charset=utf-8

2、统一入参协议




简介:什么是动态sql以及使用

1、参考资料Mybatis之动态构建SQL语句 - 叼烟斗的纤夫 - 博客园
依赖

<!-- 分页插件依赖 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.1.0</version> </dependency> 增加配置文件 @Configuration public class MyBatisConfig { @Bean public PageHelper pageHelper(){ PageHelper pageHelper = new PageHelper(); Properties p = new Properties(); p.setProperty("offsetAsPageNum","true"); p.setProperty("rowBoundsWithCount","true"); p.setProperty("reasonable","true"); pageHelper.setProperties(p); return pageHelper; }基本原理:通过mybatis plugin 增加拦截器,然后拼装分页

第四章 jwt微服务下的用户登录权限校验

简介:单机和分布式应用下的登录校验,session共享,缓存使用

1、单机:

sesssion保存在浏览器和应用服务器会话之间

用户登录成功,服务端会保证一个session,当然会给客户端一个sessionId,客户端会把sessionId保存在cookie中,每次请求都会携带这个sessionId

2、分布式应用中session共享

真实的应用不可能单节点部署,所以就有个多节点登录session共享的问题需要解决

tomcat支持session共享,但是有广播风暴;用户量大的时候,占用资源就严重,不推荐

使用redis存储token:

服务端使用UUID生成随机64位或者128位token,放入redis中,然后返回给客户端

并存储在cookie中

用户每次访问都携带此token,服务端去redis中校验是否有此用户即可




简介:微服务下登录检验解决方案 JWT讲解 json wen token

1、 jwt是一个开放标, 定义一种用于简介的用于通信双方以json对象形式安全传递信息的方法。jwt可以使用HMAC算法或者RSA算法的公钥秘钥对进行签名。

简单来说,就是通过一定规范来生成token,然后可以通过解密算法逆向解密token,这样 就可以获取用户信息

{ id:888, name:'小D', expire:10000 } funtion 加密(object, appsecret){ xxxx return base64( token); } function 解密(token ,appsecret){ xxxx //成功返回true,失败返回false }2、优点:

生产的token可以包含基本信息,比如id、用户昵称、头像等信息,避免再次查库

存储在客户端,不占用服务端的内存资源

3、 缺点:

token是经过base64编码,所以可以解码,因此token加密前的对象不应该包含

敏感信息。 如用户权限,密码等

4、jwt格式:header+payload+signature

头部:主要是描述签名算法

负载:主要描述是加密对象的信息,如用户的id等,也可以加些规范里面的东西

如iss签发者,exp 过期时间,sub 面向的用户

签名:主要是把前面两部分进行加密,防止别人拿到token进行base解密后篡改

jwt客户端存储

可以存储在cookie,localstorge,sessionstorage里面

登录jwt实战通用方法

引入依赖

<!-- JWT相关 --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.7.0</version> </dependency>开发生产token的方法

开发校验token的方法

第五章 微信授权用户接口开发

简介:登录方式优缺点和一键授权功能介绍

1、企业获取了用户的基本资料信息,利于后续业务发推送营销类信息

用户可以用个手机号或者邮箱获取对应的app福利注册送优惠券

反馈信息的时候方便,直接报手机号即可账户出问题,被盗等

2、步骤多

如果站点不安全,如站点被攻击,泄漏了个人信息,如手机号,密码等

少量不良企业贩卖个人信息,如手机号

使用快捷,用户体验好,数据相对安全

反馈问题麻烦,比较难知道唯一标识

如果是企业下面有多个应用,其中有应用不支持Auth2.0登录,则没法做到用户信息打 通,积分不能复用等

如app接入了微信授权登录,但是网站没有,则打不通,

或者授权方只提供了一种终端授权,则信息无法打通,

务必区分,普通密码和核心密码

简介:讲解微信扫一扫功能相关开发流程和资料准备

1、微信开放平台介绍(申请里面的网站应用需要企业资料)

网站:微信开放平台

2、什么是appid、appsecret、授权码code

appid和appsecret是 资源所有者向申请人分配的一个id和秘钥

code是授权凭证,A->B 发起授权,想获取授权用户信息,那a必须携带授权码,才可

以向B获取授权信息。

3、区分角色 用户,第三应用,微信开放平台时序图知识讲解

简介:获取微信开放平台扫码连url地址

1、增加结果工具类,JsonData; 增加application.properties配置

#微信开放平台配置

#微信开放平台配置 wxopen.appid= wxopen.appsecret= #重定向url wxopen.redirect_url=http://test/pub/api/v1/wechat/user/callback1 wechatConfig里面增加属性/** * 微信开放平台二维码连接 */ private final static String OPEN_QRCODE_URL= "https://open.weixin.qq.com/connect/qrconnect?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_login&state=%s#wechat_redirect";2、拼接URL

简介:讲解httpClient4.x相关依赖,并封装基本方法。

<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.5.2</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> </dependency> <!-- gson工具,封装http的时候使用 --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version> </dependency>简介:讲解微信扫码回调本地域名ngrock讲解

1、为什么要用这个,微信扫码需要配置回调,需要配置对应的域名

在本地电脑开发,微信没法回调,所以需要配置个地址映射,就是微信服务器

可以通过这个地址访问当前开发电脑的地址

2、使用文档 微信开发地址映射工具下载及使用

简介:讲解使用授权码code获取用户个人信息接口

1、通过code获取access_token

2、通过access_token获取微信用户头像和昵称等基本信息

简介:开发User数据访问层,保存微信用户信息

1、微信回调 用户昵称乱码

nickname = new String(nickname.getBytes("ISO-8859-1"), "UTF-8");

2、插入数据库

获取openid后,查询是否有此用户,如果有则不发请求去获取用户信息

方法:保存用户,根据id查询用户,根据openid查询用户

简介:讲解用户授权登录后,需要生成登录凭证重定向到页面上

1、获取当前页面访问地址

2、根据User基本信息生成token

3、重定向到指定页面

实战开发用户登录拦截器拦截器 LoginInterceptor

1、实现接口 LoginInterceptor implements HandlerInterceptor

2、重写preHandler

String accessToken = request.getHeader("token"); if(accessToken == null){ accessToken = request.getParameter("token"); } if (accessToken != null ) { Claims claims = JWTUtils.checkJWT(accessToken); Integer id = (Integer)claims.get("id"); String name = (String)claims.get("name"); request.setAttribute("user_id",id); request.setAttribute("name",name); //普通用户 return true; } return false;3、配置拦截器

@Configuration InterceptorConfig implements WebMvcConfigurer @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/api/v1/*/**"); WebMvcConfigurer.super.addInterceptors(registry);4、响应前端数据

public static void sendJsonMessage(HttpServletResponse response, Object obj) throws Exception { Gson g = new Gson(); response.setContentType("application/json; charset=utf-8"); PrintWriter writer = response.getWriter(); writer.print(g.toJson(obj)); writer.close(); response.flushBuffer(); }

第六章 从零基础接入 微信扫一扫网页支付

简介:介绍微信商户平台,支付方式和使用场景,申请微信支付流程

1、什么是微信商户平台:地址:

提供给商家使用,用于查看交易数据,提现等信息

2、常用的支付方式 公众号支付,扫码支付,app支付,小程序支付

官方地址:

案例演示:

3、微信支付申请流程

申请公众号(服务号) 认证费 300

开通微信支付

简介:讲解微信网页扫码支付

1、扫码支付文档

2、名称理解

appid:公众号唯一标识appsecret:公众号的秘钥mch_id:商户号,申请微信支付的时候分配的key:支付交易过程生成签名的秘钥,设置路径 微信商户平台(pay.weixin.qq.com)-->账户中心-->账户设置-->API安全-->密钥设置3、和微信支付交互方式

post方式提交 xml格式的协议 签名算法MD5

交互业务规则 先判断协议字段返回,再判断业务返回,最后判断交易状态

接口交易单位为 分

交易类型:JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付

商户支付的订单号由商户自定义生成,仅支持使用字母、数字、中划线-、下划线_、竖

竖线|、星号*这些英文半角字符的组合,请勿使用汉字或全角等特殊字符,

安全规范:签名算法:

校验工具:

采用微信支付扫码模式二(不依赖商户平台设置回调url)

简介:讲解什么是时序图,为啥要看时序图

微信支付时序图 官方文档:

参考:

简介:讲解微信网页扫码支付时序图讲解和统一下单接口

1、 时序图地址:

2、统一下单接口介绍:

商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易

会话标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付

简介:微信扫码支付之统一下单接口开发之订单增删改查

Dao层VideoOrder增删改查开发 @Insert("") @Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id") //keyProperty java对象的属性;keyColumn表示数据库的字段 int insert(VideoOrder order); @Select("SELECT * FROM video_order WHERE id = #{id}") VideoOrder findById(int id); @Select("SELECT * FROM video_order WHERE id = #{id}") VideoOrder findByOutTradeNo(String outTradeNo); @Delete("DELETE FROM video_order WHERE id =#{id}") int delete(int id);简介:讲解使用IDE生成单元测试和基本流程

1、核心注解 @RunWith(SpringRunner.class) @SpringBootTest

2、根据公司情况,写单元测试,核心接口一定要写,非核心的尽量写

3、断言类型,可以细化

简介:封装常用工具类CommonUtils和WXpayUtils

从微信开发者文档获取部分代码

1、CommonUtils包含方法 md5,uuid等

//生成 uuid, 即用来标识一笔单,也用做 nonce_str public static String generateUUID() { return UUID.randomUUID().toString().replaceAll("-", "") .substring(0, 32); } //MD5工具类 public static String MD5(String data) { try { java.security.MessageDigest md = MessageDigest.getInstance("MD5"); byte[] array = md.digest(data.getBytes("UTF-8")); StringBuilder sb = new StringBuilder(); for (byte item : array) { sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); } return sb.toString().toUpperCase(); } catch (Exception exception) { } return null; }2、WXPayUtil包含方法 xmlToMap,mapToXml,createSign,isCorrectPaySign

简介:讲解下单接口开发,开发技巧和支付配置文件设置

1、开发controller,开发期间不加入拦截器登录校验

2、iputils工具类介绍

3、加入微信支付配置

#微信商户平台wxpay.mer_id=1503808832wxpay.key=xdclasss20182018xdclass2018x018dwxpay.callback=16web.tunnel.qydev.com/pub/api/v1/wechat/order/callback1简介:下单接口开发和微信支付签名生成开发,并设置微信回调地址(用于用户微信支付成 功后,通知我们服务器完成更新订单状态)

1、统一下单参数需要微信签名

文档地址:

用步骤如下:

第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置参数SortedMap<String, String> params = new TreeMap<>(); params.put("appid", wxPayConfig.getAppId()); //公众账号ID params.put("mch_id", wxPayConfig.getMchId()); //商户号 params.put("nonce_str", CommonUtil.generateNonceStr()); //随机字符串 params.put("body", videoOrder.getVideoTitle()); // 商品描述 params.put("out_trade_no", videoOrder.getOutTradeNo()); //商户订单号,商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|* 且在同一个商户号下唯一 params.put("total_fee", videoOrder.getTotalFee().toString()); //标价金额 分params.put("spbill_create_ip", videoOrder.getIp()); params.put("notify_url", wxPayConfig.getDomain()+wxPayConfig.getCallbackUrl()); //通知地址 params.put("trade_type", "NATIVE"); //交易类型 JSAPI 公众号支付 NATIVE 扫码支付 APP APP支付 //生成签名 String sign = WXPayUtil.createSign(params, wxPayConfig.getKey());params.put("sign", sign); //参数转xmlString requestXMl = WXPayUtil.mapToXml(params);生成签名后,通过工具去校验https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=20_1简介:调用微信统一下单接口实战,发送post请求,并获取响应转成map,获取交易会话的二维码链接code_url。

1、配置统一下单接口

2、发送请求验证 微信统一下单响应

<xml><return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx5beac15ca207c40c]]></appid> <mch_id><![CDATA[1503809911]]></mch_id> <nonce_str><![CDATA[Go5gDC2CYL5HvizG]]></nonce_str> <sign><![CDATA[BC62592B9A94F5C914FAAD93ADE7662B]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <prepay_id><![CDATA[wx262207318328044f75c9ebec2216783076]]></prepay_id> <trade_type><![CDATA[NATIVE]]></trade_type> <code_url><![CDATA[weixin://wxpay/bizpayurl?pr=hFq9fX6]]></code_url> </xml>3、获取code_url

遇到问题,根据错误码解决

简介:使用谷歌二维码工具根据code_url生成扫一扫支付二维码

1、生成二维码返回页端

加入依赖 <!-- google二维码生成包 --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>2.0</version> </dependency>2、使用微信扫码完成支付

参考资料:




二维码知识:

简介:使用Ngrock本地接收微信回调,并开发回调接口

文档:

1、开发支付回调接口

//读取回调输入流 StringBuffer sb = new StringBuffer(); InputStream inputStream = request.getInputStream(); String line ; BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); while ((line = in.readLine()) != null){ sb.append(line); } in.close(); inputStream.close(); //解析xml成map //{transaction_id=4200000141201805266700247361, nonce_str=cbb67accd8044c9ea48f3318b99d88e4, bank_type=CFT, openid=oiNKG03vVY4PHlGUEwT-ztFo8K8Y, sign=0575804DBE4E9FFF6545046FA062BC4C, fee_type=CNY, mch_id=1503809911, cash_fee=1, out_trade_no=78902e694bab485b8e7745b61e05dbfe, appid=wx5beac15ca207c40c, total_fee=1, trade_type=NATIVE, result_code=SUCCESS, time_end=20180526162759, is_subscribe=Y, return_code=SUCCESS} Map<String, String> callbackMap = WXPayUtil.xmlToMap(sb.toString()); //获取有序map SortedMap<String, String> sortedMap = CommonUtil.getSortedMap(callbackMap) ; 回调数据: <xml><appid><![CDATA[wx5beac15ca207c40c]]></appid><bank_type><![CDATA[CFT]]></bank_type><cash_fee><![CDATA[10]]></cash_fee><fee_type><![CDATA[CNY]]></fee_type><is_subscribe><![CDATA[Y]]></is_subscribe><mch_id><![CDATA[1503809911]]></mch_id><nonce_str><![CDATA[de019d5f1e5d40649cd76de33f18b13e]]></nonce_str><openid><![CDATA[oiNKG03vVY4PHlGUEwT-ztFo8K8Y]]></openid><out_trade_no><![CDATA[4d8cea4a916440368583edaf82488624]]></out_trade_no><result_code><![CDATA[SUCCESS]]></result_code><return_code><![CDATA[SUCCESS]]></return_code><sign><![CDATA[FA799B7DF70C2BAC558E839E01EF341A]]></sign><time_end><![CDATA[20180626230347]]></time_end><total_fee>10</total_fee><trade_type><![CDATA[NATIVE]]></trade_type><transaction_id><![CDATA[4200000142201806264038572903]]></transaction_id></xml> 转成map: {transaction_id=4200000142201806264038572903, nonce_str=de019d5f1e5d40649cd76de33f18b13e, bank_type=CFT, openid=oiNKG03vVY4PHlGUEwT-ztFo8K8Y, sign=FA799B7DF70C2BAC558E839E01EF341A, fee_type=CNY, mch_id=1503809911, cash_fee=10, out_trade_no=4d8cea4a916440368583edaf82488624, appid=wx5beac15ca207c40c, total_fee=10, trade_type=NATIVE, result_code=SUCCESS, time_end=20180626230347, is_subscribe=Y, return_code=SUCCESS}2、注意点:

回调要用post方式,微信文档没有写回调的通知方式

可以用这个注解 @RequestMapping

简介:微信支付回调处理之更新订单状态和讲解什么是接口的幂等性

微信回调通知规则(通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)

幂等性: 同样的参数和值,不管调用你的接口多少次,响应结果都和调用一次是一样的

1、校验签名是否正确,防止伪造回调

2、查询订单是否已经更新

3、若没更新则更新订单状态

4、回应微信,SUCCESS 或者 FAIL

response.setContentType("text/xml"); response.getWriter().println("success");

关键词:支付,目录,实战,教育,项目

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭