Java支付全家桶--企业级各类支付手段一站式解决方案

248 阅读2分钟

Java支付全家桶:企业级各类支付手段一站式解决方案

第一章我们将对Java企业级支付一站式解决方案有一个初步的认识和了解。第二章我们将进行一个学前的准备,学前准备一共分为4节。我们需要学习并掌握微信、支付宝、银联三种支付方式的区别和差异,学习创建数据库,安装好我们需要用到的开发工具。

创建数据库,以下是sql代码:

```DROP TABLE IF EXISTS tb_order; CREATE TABLE tb_order ( id int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', code varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '流水号', user_id int(10) UNSIGNED NULL DEFAULT NULL COMMENT '会员ID', amount decimal(10, 2) UNSIGNED NOT NULL COMMENT '总金额', payment_type tinyint(3) UNSIGNED NOT NULL COMMENT '支付方式:1微信,2支付宝,3银联', status tinyint(3) UNSIGNED NOT NULL COMMENT '状态:1未付款,2已付款,3已发货,4已签收', create_time timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (id) USING BTREE, UNIQUE INDEX unq_code(code) USING BTREE, INDEX idx_customer_id(user_id) USING BTREE, INDEX idx_status(status) USING BTREE, INDEX idx_create_time(create_time) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '订单表' ROW_FORMAT = Dynamic;


学习了创建数据库之后我们接下来要学习安装并配置好开发环境了,我们需要下载HBuilderX,去官网下载最新版本就行,安装很简单的就是点下一步、下一步就行。接下来我们还需要下载以下这些东西。

![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fc1adfb2eae4490ab66103e1ae94f2e1~tplv-k3u1fbpfcp-watermark.image)

![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fbe1e1cde90b43c1a0173938fac5b8c9~tplv-k3u1fbpfcp-watermark.image)
第三章就是要学习微信支付的种类、注册微信公众平台账号、
开通小程序支付业务、小程序支付接口原理说明、后端项目用户管理模块、先创建小程序项目、上手体验UNI-APP框架、获取微信登陆临时凭证、编写后端获取open_id程序、提交微信账号登陆请求、执行登陆与注册功能
需要用到的部分代码如下:
1、demo.zip\demo\App.vue

```<script>
	export default {
		onLaunch: function() {
			console.log('App Launch')
		},
		onShow: function() {
			console.log('App Show')
		},
		onHide: function() {
			console.log('App Hide')
		}
	}
</script>

<style>
	/*每个页面公共css */
</style>

2、demo.zip\demo\pages\order\order.vue

	<view class="page">
		<view class="order" v-for="one in list" :key="one">
			<view class="line-1">
				<text>订单号:{{one.code}}</text>
				<text>{{one.status}}</text>
			</view>
			<view class="line-2">
				<text>假设这里是商品简要信息</text>
			</view>
			<view class="line-3">
				<text>金额:{{one.amount}}元</text>
				<button class="pay-btn" type="primary" v-if="one.status=='未付款'" @tap="pay(one.id)">付款</button>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				list: [],
				token: ""
			}
		},
		methods: {
			pay: function(id) {
				let that = this
				if (that.appEnv == '微信小程序') {
					uni.request({
						url: that.url.wx.microAppPayOrder,
						method: "POST",
						header: {
							"token": uni.getStorageSync("token")
						},
						data: {
							"orderId": id
						},
						success: function(resp) {
							// console.log(resp)
							let timeStamp = resp.data.timeStamp
							let nonceStr = resp.data.nonceStr
							let pk = resp.data.package
							let paySign = resp.data.paySign
							uni.requestPayment({
								"timeStamp": timeStamp,
								"nonceStr": nonceStr,
								"package": pk,
								"signType": "MD5",
								"paySign": paySign,
								success: function() {
									uni.showToast({
										title: "支付成功"
									})
									//主动发起请求
									uni.request({
										url: that.url.wx.updateOrderStatus,
										method: "POST",
										header: {
											"token": uni.getStorageSync("token")
										},
										data: {
											"orderId": id
										},
										success: function(resp) {
											let pages = getCurrentPages()
											let page = pages[pages.length - 1]
											page.onShow()
										},
										fail: function() {
											console.log("更新订单状态失败")
										}
									})
								},
								fail: function() {
									uni.showToast({
										title: "支付失败"
									})
								}
							})
						}
					})
				} else if (that.appEnv == '支付宝小程序') {
					uni.request({
						url: that.url.zfb.microAppPayOrder,
						method: "POST",
						header: {
							// "token": uni.getStorageSync("token")
							"token": that.token
						},
						data: {
							"orderId": id
						},
						success: function(resp) {
							// console.log(resp)
							let prepayId = resp.data.prepayId
							uni.requestPayment({
								provider: "alipay",
								orderInfo: prepayId,
								success: function(resp) {
									if (resp.resultCode == 9000) {
										uni.showToast({
											title: "支付成功"
										})
										uni.request({
											url: that.url.zfb.updateOrderStatus,
											method: "POST",
											header: {
												// "token":uni.getStorageSync("token")
												"token": that.token
											},
											data: {
												"orderId": id
											},
											success: function(resp) {
												let pages = getCurrentPages()
												let page = pages[pages.length - 1]
												page.onShow()
											},
											fail: function() {
												console.log("更新订单状态失败")
											}
										})
									}

								}
							})
						},
					})
				}
				else if (that.appEnv == 'H5APP') {
					uni.request({
						url: that.url.zfb.appPayOrder,
						method: "POST",
						header: {
							"token": uni.getStorageSync("token")
						},
						data: {
							"orderId": id
						},
						success: function(resp) {
							let orderString = resp.data.orderString
							const jyAliPay = uni.requireNativePlugin('JY-ALIPAY')
							jyAliPay.show({ // 发起支付
								if_sanbox: true,
								auto_create_order_info: false,
								appid: that.zfb.app.appid,
								rsa2_private: that.zfb.app.privateKey,
								order_info: orderString
							}, function(result) { // 支付完成回调
								// console.log(result)
								if (result.resultStatus == '9000') {
									uni.showToast({
										title: "付款成功"
									})
									uni.request({
										url: that.url.zfb.updateOrderStatus,
										method: "POST",
										header: {
											"token": uni.getStorageSync("token")
										},
										data: {
											"orderId": id
										},
										success: function(resp) {
											that.loadData()
										}
									})
								} else {
									uni.showToast({
										title: "付款失败",
										icon: "none"
									})
								}
							});
							// uni.requestPayment({
							// 	provider:"alipay",
							// 	orderInfo:orderString,
							// 	success:function(){

							// 	},
							// 	fail:function(){

							// 	}
							// })
						}
					})
				}



			},
			loadData: function() {
				let that = this
				uni.request({
					url: that.url.searchUserOrderList,
					method: "POST",
					header: {
						"token": uni.getStorageSync("token")
						//"token":that.token
					},
					data: {
						"page": 1,
						"length": 20
					},
					success: function(resp) {
						console.log(resp)
						let list = resp.data.list
						for (let one of list) {
							if (one.status == 1) {
								one.status = "未付款"
							} else if (one.status == 2) {
								one.status = "已付款"
							} else if (one.status == 3) {
								one.status = "已发货"
							} else if (one.status == 4) {
								one.status = "已签收"
							}
							one.code = one.code.substr(0, 16)
						}
						that.list = list

					}
				})
			}
		},
		onShow: function() {
			this.loadData()
		}
	}
</script>

<style>
	.page {
		padding: 10px;
	}

	.order {
		padding: 10px;
		border-bottom: solid 1px #e0e0e0;
		font-size: 16px;
	}

	.line-1 {
		display: flex;
		justify-content: space-between;
		padding-bottom: 5px;
	}

	.line-2 {
		padding-bottom: 5px;
	}

	.line-3 {
		display: flex;
		justify-content: space-between;
		align-items: baseline;
	}

	.pay-btn {
		margin: 0;
		font-size: 14px;
		min-width: 80px;
		line-height: 35px;
		height: 35px;
		border: none;
	}
</style>


3、demo.zip\demo\pages\login\login.vue

<template>
	<view class="page">
		<view class="title">
			小熊商城
		</view>
		<image src="../../static/logo.png" mode="widthFix" class="logo"></image>
		<block v-if="appEnv=='H5APP'">
			<view class="row">
				<input placeholder="用户名" class="input" v-model="username" />
			</view>
			<view class="row">
				<input placeholder="密码" password="password" class="input" v-model="password" />
			</view>
		</block>
		<button @tap="login" open-type="getUserInfo" type="primary" class="btn">登陆系统</button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				username: '',
				password: ''
			}
		},
		methods: {
			login: function() {
				let that = this
				if (that.appEnv == '微信小程序') {
					uni.login({
						success: function(resp) {
							// console.log(resp)
							let code = resp.code
							uni.getUserInfo({
								success: function(resp) {
									//console.log(resp)
									let nickname = resp.userInfo.nickName
									let avatarUrl = resp.userInfo.avatarUrl
									uni.request({
										url: that.url.wx.login,
										method: "POST",
										data: {
											"code": code,
											"nickname": nickname,
											"photo": avatarUrl
										},
										success: function(resp) {
											console.log(resp)
											let token = resp.data.token
											let expire = resp.data.expire
											uni.setStorageSync("token", token)
											uni.setStorageSync("expire", expire)
											uni.switchTab({
												url: "../index/index"
											})

										}
									})
								}
							})
						}
					})
				} 
				else if (that.appEnv == '支付宝小程序') {
					my.getAuthCode({
						scopes: "auth_user",
						success: function(resp) {
							// console.log(resp)
							let authCode = resp.authCode
							my.getAuthUserInfo({
								success: function(resp) {
									// console.log(resp)
									let nickName = resp.nickName
									let avatar = resp.avatar
									uni.request({
										url: that.url.zfb.login,
										method: "POST",
										data: {
											"authCode": authCode,
											"nickname": nickName,
											"photo": avatar
										},
										success: function(resp) {
											console.log(resp)
											let token = resp.data.token
											let expire = resp.data.expire
											console.log(token)
											uni.setStorageSync("token", token)
											uni.setStorageSync("expire", expire)
											uni.switchTab({
												url: "../index/index"
											})

										}
									})
								}
							})
						}
					})
				}
				else if (that.appEnv=="H5APP") {
					if (!/^[A-Za-z0-9]{3,20}$/.test(that.username)) {
						uni.showToast({
							title: "用户名格式错误",
							icon: "none"
						})
					} else if (!/^[A-Za-z0-9]{6,20}$/.test(that.password)) {
						uni.showToast({
							title: "密码格式错误",
							icon: "none"
						})
					} else {
						uni.request({
							url: that.url.login,
							method: "POST",
							data: {
								"username": that.username,
								"password": that.password
							},
							success: function(resp) {
								if (resp.data.code == 0) {
									let token = resp.data.token
									uni.setStorageSync("token", token)
									uni.switchTab({
										url: "../index/index"
									})
								} else {
									uni.showToast({
										title: "登陆失败",
										icon: "none"
									})
								}

							}
						})
					}
				}

			}
		},
		onReady: function() {

		}
	}
</script>

<style>
	.page {
		padding: 0 20%;
	}

	.title {
		font-size: 24px;
		text-align: center;
		font-weight: bold;
		margin-top: 80px;
	}

	.logo {
		width: 100px;
		margin-left: auto;
		margin-right: auto;
		display: block;
		margin-top: 20px;
		margin-bottom: 40px;
	}

	.row {
		padding: 5px 0;
	}

	.input {
		border-bottom: solid 1px #e0e0e0;
		font-size: 16px;
		padding: 8px 10px;
	}

	.btn {
		margin-top: 25px;
	}
</style>

3、demo.zip\demo\pages\index

	<view>
		index
	</view>
</template>

<script>
	export default {
		data() {
			return {
				
			}
		},
		methods: {
			
		}
	}
</script>

<style>

</style>

第4章我们将开始学习开发微信小程序支付模块,每节内容如下: 需要创建小程序订单页面、加载订单数据、渲染订单数据、小程序向商户系统发出支付请求、创建支付订单必备的参数、创建支付订单、完成小程序付款、商户系统接收支付结果、封装主动查询订单支付结果、付款之后请求查询支付结果。学习完这一章我们想要总结一下。 demo.zip\demo\pages\cart

	<view>
		cart
	</view>
</template>

<script>
	export default {
		data() {
			return {
				
			}
		},
		methods: {
			
		}
	}
</script>

<style>

</style>

我们需要学习的内容有很多,一共是17章,我已经学习完。有视频和课件代码。如需代码视频或者课件请联系作者。vx(CML46679910)