效果如下:(百度云服务器微信支付demo前端展示) 请勿付款功能正常
创建一个Java的SpringBoot的项目,导入微信官方sdk和 httpclient 依赖
<!-- 微信支付sdk-->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
<!-- httpclient-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
在这里SpringBoot的项目的version可以低一点,高点的会出现一个报错启动不了的问题
后端代码:
完整Java后端项目代码 -> gitee地址:https://gitee.com/D0uZi/wxpay_01.githttps://gitee.com/D0uZi/wxpay_01.git
问题处理:
此处填写自己的 ------------------ 关于下面代码里的参数可以看官方文档介绍:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1
package com.example.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.dao.OrderMapper;
import com.example.enetity.Order;
import com.example.untils.CommonResult;
import com.example.untils.HttpClient;
import com.github.wxpay.sdk.WXPayUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @author DouZi
* @Blog areone.top
*/
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Value("${weixin.appid}")
private String appId;
@Value("${weixin.mch_id}")
private String mchId;
@Value("${weixin.api_key}")
private String apiKey;
public CommonResult createNavite(String orderNo) {
//根据订单号查询出订单信息
QueryWrapper<Order> wrapper = new QueryWrapper<>();
wrapper.eq("order_no", orderNo);
wrapper.eq("status", 0);
Order order = orderMapper.selectOne(wrapper);
if (order != null) {
try {
Map<String, String> param = new HashMap<>();
param.put("appid", appId);
param.put("mch_id", mchId);
param.put("nonce_str", WXPayUtil.generateNonceStr());
param.put("body", order.getCourseTitle());
param.put("out_trade_no", orderNo);
// param.put("total_fee", new BigDecimal(order.getTotalFee())
// .multiply(new BigDecimal(100)).longValue() + "");
param.put("total_fee", new BigDecimal(0.01)
.multiply(new BigDecimal(100)).longValue() + "");
param.put("spbill_create_ip", "127.0.0.1");
param.put("notify_url", "http://127.0.0.1:8809/pay/back");
param.put("trade_type", "NATIVE");
HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
client.setHttps(true);//支持Https协议
client.setXmlParam(WXPayUtil.generateSignedXml(param, apiKey));
//发送请求
client.post();
//获取请求的相应结果
String content = client.getContent();
// System.out.println(content);
Map<String, String> map = WXPayUtil.xmlToMap(content);
if (map.get("result_code").equals("SUCCESS")) {
Map<String, Object> map1 = new HashMap<>();
map1.put("codeUrl", map.get("code_url"));
map1.put("price", order.getTotalFee());
map1.put("orderNo", orderNo);
return new CommonResult(2000, "成功生成二维码", map1);
}
} catch (Exception e) {
}
}
return new CommonResult(5000, "订单失效", null);
}
public CommonResult queryPayStatus(String orderNo) {
try {
//根据订饭状态查询微信支付情况
HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
Map<String, String> map = new HashMap<>();
map.put("appid", appId);
map.put("mch_id", mchId);
map.put("out_trade_no", orderNo);
map.put("nonce_str", WXPayUtil.generateNonceStr());
client.setHttps(true);//支持Https协议
client.setXmlParam(WXPayUtil.generateSignedXml(map, apiKey));
//发送请求
client.post();
//获取请求的相应结果
String content = client.getContent();
// System.out.println(content+"订单状态===============================");
Map<String, String> map1 = WXPayUtil.xmlToMap(content);
if (map1.get("trade_state").equals("SUCCESS")) {
//支付通过修改订单状态,往支付记录表添加支付记录
Order order = new Order();
order.setStatus(1);
order.setGmtModified(
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Date())
);
QueryWrapper<Order> wrapper = new QueryWrapper<>();
wrapper.eq("order_no", orderNo);
wrapper.eq("status", 0);
orderMapper.update(order, wrapper);
return new CommonResult(2000,"微信支付成功",null);
}
} catch (Exception e) {
}
return new CommonResult(5000,"微信支付失败",null);
}
}
前端vue代码:https://pan.livemz.cn/微信支付demo[vue+SpringBoot]
https://pan.livemz.cn/%E5%BE%AE%E4%BF%A1%E6%94%AF%E4%BB%98demo%5Bvue+SpringBoot%5D
在代码目录下执行
安装相关的依赖
启动代码:
完成:
注意:
前端代码此处为检测支付的状态
使用 Jenkins 服务器 自动部署项目从A服务器到B服务器
首先准备A,B两台服务器
先做A,B无密登陆:
在jenkins所在的服务器(A服务器)上输入如下命令
ssh-keygen -t rsa
(2)接下来需要将公钥导入到认证文件中
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys(3)给对应文件授权
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys(4)把A服务器上的公钥复制到B服务器上
scp -p ~/.ssh/id_rsa.pub root@B服务器的ip地址:/root/.ssh/authorized_keys测试A登录B服务器
ssh B服务器的ip
在A机器上安装Jenkins
启动该war包
nohup java -jar /usr/local/jenkins.war --httpPort=8777 --httpsPort=8778 > /usr/local/jenkins.log 2>&1 &
-- nohup:如果虚拟机休眠时不关闭jenkins
-- >: 启动时生成的日志放入
-- &: 后台运行
访问jenkins :
ip:8777
查看首次登录的密码:
选择默认安装等待即可
选择
修改Jenkins后台密码:
集成jdk(如下图)
在jenkins所在的服务上安装jdk并配置环境变量。
【1】解压jdk软件
[2]vi /etc/profile
export JAVA_HOME=JDK的安装路径
export PATH=$PATH:$JAVA_HOME/bin
[3] source /etc/profile
集成maven :
必须在我们jenkins所在的服务器,安装maven.
安装包解压
配置maven的环境变量
修改maven的镜像
安装Maven插件
集成git:
在jenkins所在的服务器上安装git软件
yum install -y git查看是否安装git
git --version
测试jenkins会不会从gitee拉取代码
记得去安装maven依赖和gitee依赖否则上边的不会显示 :
shell脚本如下:
#!/bin/bash
echo "部署的目录和项目名称"
DIR="/data/app"
projectName="my-boot02"
echo "待部署的应用服务器,可多台"
#你的 B服务器的ip 不需要部署Jenkins
server_ips="43.xxxxxxx"
for server_ip in ${server_ips[@]}
do
echo "ssh连接进行备份操作"
ssh -Tq -oStrictHostKeyChecking=no root@${server_ip} <<EOF
mkdir -p $DIR/backup/${projectName}
mkdir -p $DIR/${projectName}
if [ -f "$DIR/${projectName}/${projectName}.jar" ];then
mv $DIR/${projectName}/${projectName}.jar $DIR/backup/${projectName}/${projectName}-`date "+%Y%m%d_%H%M%S"`.jar
fi
EOF
echo "拷贝jar包到目标服务器的tmp目录"
scp -q -oStrictHostKeyChecking=no ${WORKSPACE}/target/*.jar root@${server_ip}:/tmp/${projectName}.jar
echo "ssh远程连接进行发布操作"
ssh -q -oStrictHostKeyChecking=no root@${server_ip} <<EOF
mv /tmp/${projectName}.jar $DIR/${projectName}/${projectName}.jar
sh $DIR/${projectName}/stop.sh
sh $DIR/${projectName}/start.sh
EOF
done
echo "success"
自动拉取gitee
获取自动拉取的密钥:
对应你的gitee后端代码仓库:
点击测试Jenkins会自动编译
编译完成即可访问B服务器这个项目:
通过A服务器的前端访问B服务器的项目,Jenkins搭建后一劳永逸,很巴适的.全自动操作节省很多时间和步骤