• 微信支付业务


    目录

    1.微信支付流程图

    2.微信接口查询官网

    3.根据订单生成微信二维码

    4.前端二维码及查询订单的展示

    5.后台查询订单状态

    6.展示实体类及依赖


    1.微信支付流程图

     2.微信接口查询官网

    https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1

     3.根据订单生成微信二维码

    controller层

    1. @CrossOrigin//解决跨域问题
    2. @RestController
    3. @RequestMapping("/order")
    4. public class OrderController {
    5. @Resource
    6. private OrderService orderService;
    7. @RequestMapping("/createNavite/{orderNo}")
    8. public CommonResult createNavite(@PathVariable String orderNo){
    9. return orderService.createNative(orderNo);
    10. }
    11. }

    配置文件

    1. server.port=8807
    2. spring.datasource.druid.url=jdbc:mysql://localhost:3306/project?serverTimezone=Asia/Shanghai
    3. spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
    4. spring.datasource.druid.username=root
    5. spring.datasource.druid.password=123456
    6. # 微信的appid 商家id 密钥---申请你无法申请因为需要营业执照--这里一个老师的
    7. weixin.appid=wx8087d8149331d27c
    8. weixin.mch_id=1532192611
    9. weixin.api_key=Cc158380629071583806290715838062

    service层

    1. @Service
    2. public class OrderService {
    3. @Resource
    4. private OrderMapper orderMapper;
    5. //配置文件中有
    6. @Value("${weixin.appid}")
    7. private String appId;
    8. @Value("${weixin.mch_id}")
    9. private String mchId;
    10. @Value("${weixin.api_key}")
    11. private String apiKey;
    12. public CommonResult createNative(String orderNo) {
    13. //1.根据订单号查询订单信息
    14. QueryWrapper queryWrapper=new QueryWrapper<>();
    15. queryWrapper.eq("order_no",orderNo);
    16. //0代表未支付
    17. queryWrapper.eq("status",0);
    18. Order order = orderMapper.selectOne(queryWrapper);
    19. if(order!=null){
    20. try{
    21. Map params=new HashMap<>();//请求参数
    22. params.put("appid",appId);
    23. params.put("mch_id",mchId);
    24. params.put("nonce_str", WXPayUtil.generateNonceStr());
    25. params.put("body",order.getCourseTitle());
    26. params.put("out_trade_no",orderNo);
    27. //这是真实数据
    28. //params.put("total_fee",new BigDecimal(order.getTotalFee()).multiply(new BigDecimal(100)).longValue()+"");
    29. //测试金额数据,现在是1分
    30. params.put("total_fee",new BigDecimal(0.01).multiply(new BigDecimal(100)).longValue()+"");
    31. params.put("spbill_create_ip","127.0.0.1");//未来写成项目部署的ID
    32. params.put("notify_url","http://localhost:8080/pay/back");
    33. params.put("trade_type","NATIVE");
    34. //创建httpClient对象 作为远程调用
    35. HttpClient client=new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
    36. //支持https协议
    37. client.setHttps(true);
    38. //设置请求的参数---格式为xml
    39. client.setXmlParam(WXPayUtil.generateSignedXml(params,apiKey));
    40. //发送请求
    41. client.post();
    42. //获取请求响应结果
    43. String content = client.getContent();
    44. System.out.println(content);
    45. Map map=WXPayUtil.xmlToMap(content);
    46. if(map.get("result_code").equals("SUCCESS")){
    47. Map result=new HashMap<>();
    48. result.put("codeUrl",map.get("code_url"));
    49. result.put("price",order.getTotalFee());
    50. result.put("orderNo",orderNo);
    51. return new CommonResult(2000,"生成二维码成功",result);
    52. }
    53. }catch (Exception e){
    54. e.printStackTrace();
    55. }
    56. }
    57. return new CommonResult(5000,"订单失效",null);
    58. }
    59. }

    4.前端二维码及查询订单的展示

     注意下载vue-qr

    npm install vue-qr

    1. <template>
    2. <div id="app">
    3. <el-button type="primary" @click="pay">支付el-button>
    4. <el-dialog
    5. title="收银台"
    6. :visible.sync="dislogVisible"
    7. width="30%">
    8. <div style="text-align: center">
    9. <p>微信支付{{payResult.price}}元

    10. <div style="border: 1px solid #f3f3f3; width: 220px;padding: 0px;margin: 0px auto">
    11. <vue-qr
    12. :text="payResult.codeUrl"
    13. :margin="0"
    14. colorDark="green"
    15. :logo="require('@/assets/logo.png')"
    16. colorLight="#fff"
    17. :size="200">
    18. vue-qr>
    19. div>
    20. div>
    21. <el-divider>el-divider>
    22. <div style="font-size: 13px;">
    23. 提示:<br>
    24. 二维码两小时内有效,请及时扫码支付<br>
    25. div>
    26. el-dialog>
    27. div>
    28. template>
    29. <script>
    30. import vueQr from 'vue-qr'
    31. export default {
    32. name: 'app',
    33. components:{
    34. vueQr
    35. },
    36. data(){
    37. return{
    38. orderNo:"222111111",
    39. payResult:{
    40. price:0,
    41. //借助vue-qr 可以把二维码地址转换为二维码图片
    42. codeUrl:'',
    43. },
    44. dislogVisible:false,
    45. timer1:""
    46. }
    47. },
    48. methods:{
    49. //根据订单号查询支付状态
    50. queryPayStatus(orderNo){
    51. this.$http.post("/order/queryPayStatus/"+orderNo).then(result=>{
    52. if(result.data.code===2000){
    53. //消除定时器
    54. clearInterval(this.timer1)
    55. this.timer1=null;
    56. this.$message.success("支付成功");
    57. this.dislogVisible=false;
    58. }
    59. })
    60. },
    61. pay(){
    62. this.dislogVisible=true;
    63. this.$http.post("/order/createNavite/"+this.orderNo).then(result=>{
    64. if(result.data.code===2000){
    65. this.payResult=result.data.data;
    66. // //设置一个定时任务,每隔3秒调用一次
    67. this.timer1=setInterval(()=>{
    68. this.queryPayStatus(this.payResult.out_trade_no)
    69. },3000);
    70. }
    71. })
    72. }
    73. }
    74. }
    75. script>
    76. <style>
    77. style>

     5.后台查询订单状态

    controller层

    1. @RequestMapping("/queryPayStatus/{orderNo}")
    2. public CommonResult queryPayStatus(@PathVariable String orderNo){
    3. return orderService.queryPayStatus(orderNo);
    4. }

    service层

    1. public CommonResult queryPayStatus(String orderNo) {
    2. try{
    3. //1.根据订单状态查询微信的支付情况
    4. HttpClient client=new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
    5. Map params=new HashMap<>();
    6. params.put("appid",appId);
    7. params.put("mch_id",mchId);
    8. params.put("out_trade_no",orderNo);
    9. params.put("nonce_str",WXPayUtil.generateNonceStr());
    10. client.setHttps(true);
    11. client.setXmlParam(WXPayUtil.generateSignedXml(params,apiKey));
    12. client.post();
    13. String content = client.getContent();
    14. System.out.println(content);
    15. Map map=new HashMap<>();
    16. map = WXPayUtil.xmlToMap(content);
    17. if(map.get("trade_state").equals("SUCCESS")){
    18. //1.修改订单状态
    19. Order order=new Order();
    20. order.setStatus(1);
    21. order.setGmtModified(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    22. QueryWrapper queryWrapper=new QueryWrapper<>();
    23. queryWrapper.eq("order_no",orderNo);
    24. queryWrapper.eq("status",0);
    25. orderMapper.update(order,queryWrapper);
    26. return new CommonResult(2000,"支付成功",null);
    27. }
    28. }catch (Exception e){
    29. }
    30. return new CommonResult(5000,"支付失败",null);
    31. }

    6.展示实体类及依赖

    order类

    1. @Data
    2. @TableName(value = "t_order")
    3. public class Order {
    4. @TableId(type = IdType.ASSIGN_ID)
    5. private String id;
    6. private String orderNo;
    7. private String courseId;
    8. private String courseTitle;
    9. private String teacherName;
    10. private String memberId;
    11. private String nickname;
    12. private String mobile;
    13. private Double totalFee;
    14. private Integer payType;
    15. private Integer status;
    16. private Integer isDeleted;
    17. private String gmtCreate;
    18. private String gmtModified;
    19. }

    依赖

    1. dependencies>
    2. <dependency>
    3. <groupId>org.springframework.bootgroupId>
    4. <artifactId>spring-boot-starter-webartifactId>
    5. dependency>
    6. <dependency>
    7. <groupId>mysqlgroupId>
    8. <artifactId>mysql-connector-javaartifactId>
    9. <scope>runtimescope>
    10. dependency>
    11. <dependency>
    12. <groupId>org.projectlombokgroupId>
    13. <artifactId>lombokartifactId>
    14. <optional>trueoptional>
    15. dependency>
    16. <dependency>
    17. <groupId>org.springframework.bootgroupId>
    18. <artifactId>spring-boot-starter-testartifactId>
    19. <scope>testscope>
    20. dependency>
    21. <dependency>
    22. <groupId>com.alibabagroupId>
    23. <artifactId>druid-spring-boot-starterartifactId>
    24. <version>1.1.9version>
    25. dependency>
    26. <dependency>
    27. <groupId>com.baomidougroupId>
    28. <artifactId>mybatis-plus-boot-starterartifactId>
    29. <version>3.5.2version>
    30. dependency>
    31. <dependency>
    32. <groupId>com.github.wxpaygroupId>
    33. <artifactId>wxpay-sdkartifactId>
    34. <version>0.0.3version>
    35. dependency>
    36. <dependency>
    37. <groupId>org.apache.httpcomponentsgroupId>
    38. <artifactId>httpclientartifactId>
    39. <version>4.5.3version>
    40. dependency>
    41. dependencies>

     

  • 相关阅读:
    51单片机-串口通信
    vue3 封装 naive input 组件
    静态应用程序安全测试(SAST)的autofix的挑战
    java毕业生设计园艺生活网站计算机源码+系统+mysql+调试部署+lw
    梯度消失和梯度爆炸原理
    元数据简析:定义及管理
    SQL的编写需要注意的问题
    支持CAN FD的Kvaser PCIEcan 4xCAN v2编码: 73-30130-01414-5如何应用?
    淘宝Tmall,1688,拼多多API商品详情接口
    excel计算时间差
  • 原文地址:https://blog.csdn.net/qq_50896786/article/details/126322033