1:大綱介紹

2:微信支付項(xiàng)目效果演示

3:SpringBoot2.x的基礎(chǔ)

4:開(kāi)發(fā)環(huán)境 jdk8 idea maven git mysql




項(xiàng)目的開(kāi)" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁(yè) > 營(yíng)銷資訊 > 網(wǎng)站運(yùn)營(yíng) > 在線教育項(xiàng)目實(shí)戰(zhàn)(微信支付)目錄-上

在線教育項(xiàng)目實(shí)戰(zhàn)(微信支付)目錄-上

時(shí)間:2022-08-06 22:27:02 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2022-08-06 22:27:02 來(lái)源:網(wǎng)站運(yùn)營(yíng)

第一章 項(xiàng)目介紹和前期準(zhǔn)備

簡(jiǎn)介:課程介紹,項(xiàng)目的搭建

1:大綱介紹

2:微信支付項(xiàng)目效果演示

3:SpringBoot2.x的基礎(chǔ)

4:開(kāi)發(fā)環(huán)境 jdk8 idea maven git mysql




簡(jiǎn)介:介紹一個(gè)項(xiàng)目如何從零到上線,步驟和流程

1:從需求調(diào)研到項(xiàng)目上線

2:需求評(píng)審(產(chǎn)品-設(shè)計(jì)-前端-后臺(tái)-測(cè)試-運(yùn)營(yíng))-》ui設(shè)計(jì)-》開(kāi)發(fā)(前端和后臺(tái)架構(gòu)開(kāi)發(fā))-》前后端聯(lián)調(diào)-》項(xiàng)目體側(cè)-》-》bugFix-》回歸測(cè)試-》運(yùn)維開(kāi)發(fā)部署上線-》灰度發(fā)布-》全量發(fā)布-》維護(hù)和運(yùn)營(yíng)




簡(jiǎn)介:分析開(kāi)發(fā)功能點(diǎn)和系統(tǒng)架構(gòu)應(yīng)該怎么架構(gòu)

開(kāi)發(fā)功能點(diǎn):首頁(yè)視頻列表、視頻詳情、微信掃碼支付、我的訂單

1、架構(gòu)設(shè)計(jì):

前后點(diǎn)分離(方案:node渲染)

動(dòng)靜分離(方案:靜態(tài)資源放到cdn或者nginx服務(wù)器上)

后端技術(shù)(springboot2.x+redis4.x+httpclient+mysql+activieMq)

前端技術(shù)(html5+bootstrap+jquery)

2、測(cè)試要求:首頁(yè)和視頻詳情頁(yè)qps單機(jī)qps 2000+




簡(jiǎn)介:講解后臺(tái)數(shù)據(jù)庫(kù)設(shè)計(jì),字段冗余的好處,以及常見(jiàn)注意事項(xiàng)

數(shù)據(jù)庫(kù)設(shè)計(jì):er圖

字段的冗余

部分測(cè)試數(shù)據(jù)的導(dǎo)入

第二章 項(xiàng)目基礎(chǔ)環(huán)境搭建和逆向工程構(gòu)建

spring-boot-starter-web spring-boot-starter-data-redis mybatis-spring-boot-starter mysql-connector-javaIntelliJ IDEA使用教程_IntelliJ IDEA開(kāi)發(fā)中文手冊(cè)[PDF]下載-極客學(xué)院Wiki

相關(guān)偏好里開(kāi)啟自動(dòng)編譯

Shift+Ctrl+Alt+/,選擇Registry

選 compiler.automake.allow.when.app.running 重啟項(xiàng)目就可以了

基本目錄結(jié)構(gòu) controller service impl mapper utils domain config interceptorer dto簡(jiǎn)介:講解開(kāi)源工具的好處和弊端,如pageHeper分頁(yè)攔截器,tk自動(dòng)生成工具,抽象方法的利弊等

1、開(kāi)源工具:

2、好處:開(kāi)發(fā)方便,使用簡(jiǎn)單,使用aop方式進(jìn)行分頁(yè),只需要引入相關(guān)依賴,然后PageHelper.startPage(page, size); 開(kāi)啟分頁(yè)

3、弊端:對(duì)于分庫(kù)分表等情況下使用有問(wèn)題,深度分頁(yè)邏輯判斷會(huì)復(fù)雜

4、mysql資料:

深度分頁(yè):

MySQL大數(shù)據(jù)量分頁(yè)性能優(yōu)化 - lpfuture - 博客園

MySQL 百萬(wàn)級(jí)分頁(yè)優(yōu)化(Mysql千萬(wàn)級(jí)快速分頁(yè))

5、封裝的好壞:

關(guān)于抽象和不抽象的選擇,比如tk這些工具,通用mapper,service,controller

代碼量大大減少,開(kāi)發(fā)新模塊可以馬上進(jìn)行使用,對(duì)應(yīng)過(guò)度封裝,新手等比較難理

不 能保證團(tuán)隊(duì)里面所有人都有對(duì)應(yīng)的水平,或者有高度封裝的思想,也不是過(guò)度封

裝,項(xiàng)目通用工具使用緩存操作、切換緩存等。

第三章 開(kāi)發(fā)在線教育視頻站點(diǎn)核心業(yè)務(wù)視頻列表相關(guān)接口開(kāi)發(fā)

簡(jiǎn)介:整合mysql加入mybatis依賴,加入druid數(shù)據(jù)源

依賴:

<!-- 引入starter--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <!-- MySQL的JDBC驅(qū)動(dòng)包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- 引入第三方數(shù)據(jù)源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency> 加入配置文件 #可以自動(dòng)識(shí)別 #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 開(kāi)啟類增加mapper掃描 @MapperScan("net.xdclass.xdvideo.mapper")參考語(yǔ)法 mybatis - MyBatis 3

xml配置:mybatis - MyBatis 3




簡(jiǎn)介:使用mybatis3.x注解方式,增刪改查,控制臺(tái)打印sql語(yǔ)句

1、控制臺(tái)打印sql語(yǔ)句,用于本地測(cè)試

2、mapper代碼編寫(xiě)

3、數(shù)據(jù)庫(kù)字段和java實(shí)體類的映射配置




簡(jiǎn)介:完善相關(guān)接口、協(xié)議規(guī)范講解

1、save接口保存對(duì)象 @RequestParam(value = "page", defaultValue)int videoI 可以設(shè)置默認(rèn)值,比如分頁(yè)

)@RequestBody 請(qǐng)求體映射實(shí)體類,需要指定http頭為 content-type為application/json charset=utf-8

2、統(tǒng)一入?yún)f(xié)議




簡(jiǎn)介:什么是動(dòng)態(tài)sql以及使用

1、參考資料Mybatis之動(dòng)態(tài)構(gòu)建SQL語(yǔ)句 - 叼煙斗的纖夫 - 博客園
依賴

<!-- 分頁(yè)插件依賴 --> <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; }基本原理:通過(guò)mybatis plugin 增加攔截器,然后拼裝分頁(yè)

第四章 jwt微服務(wù)下的用戶登錄權(quán)限校驗(yàn)

簡(jiǎn)介:?jiǎn)螜C(jī)和分布式應(yīng)用下的登錄校驗(yàn),session共享,緩存使用

1、單機(jī):

sesssion保存在瀏覽器和應(yīng)用服務(wù)器會(huì)話之間

用戶登錄成功,服務(wù)端會(huì)保證一個(gè)session,當(dāng)然會(huì)給客戶端一個(gè)sessionId,客戶端會(huì)把sessionId保存在cookie中,每次請(qǐng)求都會(huì)攜帶這個(gè)sessionId

2、分布式應(yīng)用中session共享

真實(shí)的應(yīng)用不可能單節(jié)點(diǎn)部署,所以就有個(gè)多節(jié)點(diǎn)登錄session共享的問(wèn)題需要解決

tomcat支持session共享,但是有廣播風(fēng)暴;用戶量大的時(shí)候,占用資源就嚴(yán)重,不推薦

使用redis存儲(chǔ)token:

服務(wù)端使用UUID生成隨機(jī)64位或者128位token,放入redis中,然后返回給客戶端

并存儲(chǔ)在cookie中

用戶每次訪問(wèn)都攜帶此token,服務(wù)端去redis中校驗(yàn)是否有此用戶即可




簡(jiǎn)介:微服務(wù)下登錄檢驗(yàn)解決方案 JWT講解 json wen token

1、 jwt是一個(gè)開(kāi)放標(biāo), 定義一種用于簡(jiǎn)介的用于通信雙方以json對(duì)象形式安全傳遞信息的方法。jwt可以使用HMAC算法或者RSA算法的公鑰秘鑰對(duì)進(jìn)行簽名。

簡(jiǎn)單來(lái)說(shuō),就是通過(guò)一定規(guī)范來(lái)生成token,然后可以通過(guò)解密算法逆向解密token,這樣 就可以獲取用戶信息

{ id:888, name:'小D', expire:10000 } funtion 加密(object, appsecret){ xxxx return base64( token); } function 解密(token ,appsecret){ xxxx //成功返回true,失敗返回false }2、優(yōu)點(diǎn):

生產(chǎn)的token可以包含基本信息,比如id、用戶昵稱、頭像等信息,避免再次查庫(kù)

存儲(chǔ)在客戶端,不占用服務(wù)端的內(nèi)存資源

3、 缺點(diǎn):

token是經(jīng)過(guò)base64編碼,所以可以解碼,因此token加密前的對(duì)象不應(yīng)該包含

敏感信息。 如用戶權(quán)限,密碼等

4、jwt格式:header+payload+signature

頭部:主要是描述簽名算法

負(fù)載:主要描述是加密對(duì)象的信息,如用戶的id等,也可以加些規(guī)范里面的東西

如iss簽發(fā)者,exp 過(guò)期時(shí)間,sub 面向的用戶

簽名:主要是把前面兩部分進(jìn)行加密,防止別人拿到token進(jìn)行base解密后篡改

jwt客戶端存儲(chǔ)

可以存儲(chǔ)在cookie,localstorge,sessionstorage里面

登錄jwt實(shí)戰(zhàn)通用方法

引入依賴

<!-- JWT相關(guān) --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.7.0</version> </dependency>開(kāi)發(fā)生產(chǎn)token的方法

開(kāi)發(fā)校驗(yàn)token的方法

第五章 微信授權(quán)用戶接口開(kāi)發(fā)

簡(jiǎn)介:登錄方式優(yōu)缺點(diǎn)和一鍵授權(quán)功能介紹

1、企業(yè)獲取了用戶的基本資料信息,利于后續(xù)業(yè)務(wù)發(fā)推送營(yíng)銷類信息

用戶可以用個(gè)手機(jī)號(hào)或者郵箱獲取對(duì)應(yīng)的app福利注冊(cè)送優(yōu)惠券

反饋信息的時(shí)候方便,直接報(bào)手機(jī)號(hào)即可賬戶出問(wèn)題,被盜等

2、步驟多

如果站點(diǎn)不安全,如站點(diǎn)被攻擊,泄漏了個(gè)人信息,如手機(jī)號(hào),密碼等

少量不良企業(yè)販賣(mài)個(gè)人信息,如手機(jī)號(hào)

使用快捷,用戶體驗(yàn)好,數(shù)據(jù)相對(duì)安全

反饋問(wèn)題麻煩,比較難知道唯一標(biāo)識(shí)

如果是企業(yè)下面有多個(gè)應(yīng)用,其中有應(yīng)用不支持Auth2.0登錄,則沒(méi)法做到用戶信息打 通,積分不能復(fù)用等

如app接入了微信授權(quán)登錄,但是網(wǎng)站沒(méi)有,則打不通,

或者授權(quán)方只提供了一種終端授權(quán),則信息無(wú)法打通,

務(wù)必區(qū)分,普通密碼和核心密碼

簡(jiǎn)介:講解微信掃一掃功能相關(guān)開(kāi)發(fā)流程和資料準(zhǔn)備

1、微信開(kāi)放平臺(tái)介紹(申請(qǐng)里面的網(wǎng)站應(yīng)用需要企業(yè)資料)

網(wǎng)站:微信開(kāi)放平臺(tái)

2、什么是appid、appsecret、授權(quán)碼code

appid和appsecret是 資源所有者向申請(qǐng)人分配的一個(gè)id和秘鑰

code是授權(quán)憑證,A->B 發(fā)起授權(quán),想獲取授權(quán)用戶信息,那a必須攜帶授權(quán)碼,才可

以向B獲取授權(quán)信息。

3、區(qū)分角色 用戶,第三應(yīng)用,微信開(kāi)放平臺(tái)時(shí)序圖知識(shí)講解

簡(jiǎn)介:獲取微信開(kāi)放平臺(tái)掃碼連url地址

1、增加結(jié)果工具類,JsonData; 增加application.properties配置

#微信開(kāi)放平臺(tái)配置

#微信開(kāi)放平臺(tái)配置 wxopen.appid= wxopen.appsecret= #重定向url wxopen.redirect_url=http://test/pub/api/v1/wechat/user/callback1 wechatConfig里面增加屬性/** * 微信開(kāi)放平臺(tái)二維碼連接 */ 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

簡(jiǎn)介:講解httpClient4.x相關(guān)依賴,并封裝基本方法。

<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的時(shí)候使用 --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version> </dependency>簡(jiǎn)介:講解微信掃碼回調(diào)本地域名ngrock講解

1、為什么要用這個(gè),微信掃碼需要配置回調(diào),需要配置對(duì)應(yīng)的域名

在本地電腦開(kāi)發(fā),微信沒(méi)法回調(diào),所以需要配置個(gè)地址映射,就是微信服務(wù)器

可以通過(guò)這個(gè)地址訪問(wèn)當(dāng)前開(kāi)發(fā)電腦的地址

2、使用文檔 微信開(kāi)發(fā)地址映射工具下載及使用

簡(jiǎn)介:講解使用授權(quán)碼code獲取用戶個(gè)人信息接口

1、通過(guò)code獲取access_token

2、通過(guò)access_token獲取微信用戶頭像和昵稱等基本信息

簡(jiǎn)介:開(kāi)發(fā)User數(shù)據(jù)訪問(wèn)層,保存微信用戶信息

1、微信回調(diào) 用戶昵稱亂碼

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

2、插入數(shù)據(jù)庫(kù)

獲取openid后,查詢是否有此用戶,如果有則不發(fā)請(qǐng)求去獲取用戶信息

方法:保存用戶,根據(jù)id查詢用戶,根據(jù)openid查詢用戶

簡(jiǎn)介:講解用戶授權(quán)登錄后,需要生成登錄憑證重定向到頁(yè)面上

1、獲取當(dāng)前頁(yè)面訪問(wèn)地址

2、根據(jù)User基本信息生成token

3、重定向到指定頁(yè)面

實(shí)戰(zhàn)開(kāi)發(fā)用戶登錄攔截器攔截器 LoginInterceptor

1、實(shí)現(xiàn)接口 LoginInterceptor implements HandlerInterceptor

2、重寫(xiě)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、響應(yīng)前端數(shù)據(jù)

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(); }

第六章 從零基礎(chǔ)接入 微信掃一掃網(wǎng)頁(yè)支付

簡(jiǎn)介:介紹微信商戶平臺(tái),支付方式和使用場(chǎng)景,申請(qǐng)微信支付流程

1、什么是微信商戶平臺(tái):地址:

提供給商家使用,用于查看交易數(shù)據(jù),提現(xiàn)等信息

2、常用的支付方式 公眾號(hào)支付,掃碼支付,app支付,小程序支付

官方地址:

案例演示:

3、微信支付申請(qǐng)流程

申請(qǐng)公眾號(hào)(服務(wù)號(hào)) 認(rèn)證費(fèi) 300

開(kāi)通微信支付

簡(jiǎn)介:講解微信網(wǎng)頁(yè)掃碼支付

1、掃碼支付文檔

2、名稱理解

appid:公眾號(hào)唯一標(biāo)識(shí)appsecret:公眾號(hào)的秘鑰mch_id:商戶號(hào),申請(qǐng)微信支付的時(shí)候分配的key:支付交易過(guò)程生成簽名的秘鑰,設(shè)置路徑 微信商戶平臺(tái)(pay.weixin.qq.com)-->賬戶中心-->賬戶設(shè)置-->API安全-->密鑰設(shè)置3、和微信支付交互方式

post方式提交 xml格式的協(xié)議 簽名算法MD5

交互業(yè)務(wù)規(guī)則 先判斷協(xié)議字段返回,再判斷業(yè)務(wù)返回,最后判斷交易狀態(tài)

接口交易單位為 分

交易類型:JSAPI--公眾號(hào)支付、NATIVE--原生掃碼支付、APP--app支付

商戶支付的訂單號(hào)由商戶自定義生成,僅支持使用字母、數(shù)字、中劃線-、下劃線_、豎

豎線|、星號(hào)*這些英文半角字符的組合,請(qǐng)勿使用漢字或全角等特殊字符,

安全規(guī)范:簽名算法:

校驗(yàn)工具:

采用微信支付掃碼模式二(不依賴商戶平臺(tái)設(shè)置回調(diào)url)

簡(jiǎn)介:講解什么是時(shí)序圖,為啥要看時(shí)序圖

微信支付時(shí)序圖 官方文檔:

參考:

簡(jiǎn)介:講解微信網(wǎng)頁(yè)掃碼支付時(shí)序圖講解和統(tǒng)一下單接口

1、 時(shí)序圖地址:

2、統(tǒng)一下單接口介紹:

商戶系統(tǒng)先調(diào)用該接口在微信支付服務(wù)后臺(tái)生成預(yù)支付交易單,返回正確的預(yù)支付交易

會(huì)話標(biāo)識(shí)后再按掃碼、JSAPI、APP等不同場(chǎng)景生成交易串調(diào)起支付

簡(jiǎn)介:微信掃碼支付之統(tǒng)一下單接口開(kāi)發(fā)之訂單增刪改查

Dao層VideoOrder增刪改查開(kāi)發(fā) @Insert("") @Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id") //keyProperty java對(duì)象的屬性;keyColumn表示數(shù)據(jù)庫(kù)的字段 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);簡(jiǎn)介:講解使用IDE生成單元測(cè)試和基本流程

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

2、根據(jù)公司情況,寫(xiě)單元測(cè)試,核心接口一定要寫(xiě),非核心的盡量寫(xiě)

3、斷言類型,可以細(xì)化

簡(jiǎn)介:封裝常用工具類CommonUtils和WXpayUtils

從微信開(kāi)發(fā)者文檔獲取部分代碼

1、CommonUtils包含方法 md5,uuid等

//生成 uuid, 即用來(lái)標(biāo)識(shí)一筆單,也用做 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

簡(jiǎn)介:講解下單接口開(kāi)發(fā),開(kāi)發(fā)技巧和支付配置文件設(shè)置

1、開(kāi)發(fā)controller,開(kāi)發(fā)期間不加入攔截器登錄校驗(yàn)

2、iputils工具類介紹

3、加入微信支付配置

#微信商戶平臺(tái)wxpay.mer_id=1503808832wxpay.key=xdclasss20182018xdclass2018x018dwxpay.callback=16web.tunnel.qydev.com/pub/api/v1/wechat/order/callback1簡(jiǎn)介:下單接口開(kāi)發(fā)和微信支付簽名生成開(kāi)發(fā),并設(shè)置微信回調(diào)地址(用于用戶微信支付成 功后,通知我們服務(wù)器完成更新訂單狀態(tài))

1、統(tǒng)一下單參數(shù)需要微信簽名

文檔地址:

用步驟如下:

第一步,設(shè)所有發(fā)送或者接收到的數(shù)據(jù)為集合M,將集合M內(nèi)非空參數(shù)值的參數(shù)按照參數(shù)名ASCII碼從小到大排序(字典序),使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串stringA。第二步,在stringA最后拼接上key得到stringSignTemp字符串,并對(duì)stringSignTemp進(jìn)行MD5運(yùn)算,再將得到的字符串所有字符轉(zhuǎn)換為大寫(xiě),得到sign值signValue。key設(shè)置路徑:微信商戶平臺(tái)(pay.weixin.qq.com)-->賬戶設(shè)置-->API安全-->密鑰設(shè)置參數(shù)SortedMap<String, String> params = new TreeMap<>(); params.put("appid", wxPayConfig.getAppId()); //公眾賬號(hào)ID params.put("mch_id", wxPayConfig.getMchId()); //商戶號(hào) params.put("nonce_str", CommonUtil.generateNonceStr()); //隨機(jī)字符串 params.put("body", videoOrder.getVideoTitle()); // 商品描述 params.put("out_trade_no", videoOrder.getOutTradeNo()); //商戶訂單號(hào),商戶系統(tǒng)內(nèi)部訂單號(hào),要求32個(gè)字符內(nèi),只能是數(shù)字、大小寫(xiě)字母_-|* 且在同一個(gè)商戶號(hào)下唯一 params.put("total_fee", videoOrder.getTotalFee().toString()); //標(biāo)價(jià)金額 分params.put("spbill_create_ip", videoOrder.getIp()); params.put("notify_url", wxPayConfig.getDomain()+wxPayConfig.getCallbackUrl()); //通知地址 params.put("trade_type", "NATIVE"); //交易類型 JSAPI 公眾號(hào)支付 NATIVE 掃碼支付 APP APP支付 //生成簽名 String sign = WXPayUtil.createSign(params, wxPayConfig.getKey());params.put("sign", sign); //參數(shù)轉(zhuǎn)xmlString requestXMl = WXPayUtil.mapToXml(params);生成簽名后,通過(guò)工具去校驗(yàn)https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=20_1簡(jiǎn)介:調(diào)用微信統(tǒng)一下單接口實(shí)戰(zhàn),發(fā)送post請(qǐng)求,并獲取響應(yīng)轉(zhuǎn)成map,獲取交易會(huì)話的二維碼鏈接code_url。

1、配置統(tǒng)一下單接口

2、發(fā)送請(qǐng)求驗(yàn)證 微信統(tǒng)一下單響應(yīng)

<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

遇到問(wèn)題,根據(jù)錯(cuò)誤碼解決

簡(jiǎn)介:使用谷歌二維碼工具根據(jù)code_url生成掃一掃支付二維碼

1、生成二維碼返回頁(yè)端

加入依賴 <!-- 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、使用微信掃碼完成支付

參考資料:




二維碼知識(shí):

簡(jiǎn)介:使用Ngrock本地接收微信回調(diào),并開(kāi)發(fā)回調(diào)接口

文檔:

1、開(kāi)發(fā)支付回調(diào)接口

//讀取回調(diào)輸入流 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) ; 回調(diào)數(shù)據(jù): <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> 轉(zhuǎn)成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、注意點(diǎn):

回調(diào)要用post方式,微信文檔沒(méi)有寫(xiě)回調(diào)的通知方式

可以用這個(gè)注解 @RequestMapping

簡(jiǎn)介:微信支付回調(diào)處理之更新訂單狀態(tài)和講解什么是接口的冪等性

微信回調(diào)通知規(guī)則(通知頻率為15/15/30/180/1800/1800/1800/1800/3600,單位:秒)

冪等性: 同樣的參數(shù)和值,不管調(diào)用你的接口多少次,響應(yīng)結(jié)果都和調(diào)用一次是一樣的

1、校驗(yàn)簽名是否正確,防止偽造回調(diào)

2、查詢訂單是否已經(jīng)更新

3、若沒(méi)更新則更新訂單狀態(tài)

4、回應(yīng)微信,SUCCESS 或者 FAIL

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

關(guān)鍵詞:支付,目錄,實(shí)戰(zhàn),教育,項(xiàng)目

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉