微信支付业务

目录

1.微信支付流程图

2.微信接口查询官网

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

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

5.后台查询订单状态

6.展示实体类及依赖


1.微信支付流程图

 2.微信接口查询官网

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

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

controller层

@CrossOrigin//解决跨域问题
@RestController
@RequestMapping("/order")
public class OrderController {
    @Resource
    private OrderService orderService;

    @RequestMapping("/createNavite/{orderNo}")
    public CommonResult createNavite(@PathVariable String orderNo){
        return orderService.createNative(orderNo);
    }
}

配置文件

server.port=8807
spring.datasource.druid.url=jdbc:mysql://localhost:3306/project?serverTimezone=Asia/Shanghai
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.username=root
spring.datasource.druid.password=123456

# 微信的appid 商家id 密钥---申请你无法申请因为需要营业执照--这里一个老师的
weixin.appid=wx8087d8149331d27c
weixin.mch_id=1532192611
weixin.api_key=Cc158380629071583806290715838062

service层

@Service
public class OrderService {

    @Resource
    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 createNative(String orderNo) {
        //1.根据订单号查询订单信息
        QueryWrapper<Order> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("order_no",orderNo);
        //0代表未支付
        queryWrapper.eq("status",0);
        Order order = orderMapper.selectOne(queryWrapper);
        if(order!=null){
            try{
                Map<String,String> params=new HashMap<>();//请求参数
                params.put("appid",appId);
                params.put("mch_id",mchId);
                params.put("nonce_str", WXPayUtil.generateNonceStr());
                params.put("body",order.getCourseTitle());
                params.put("out_trade_no",orderNo);
                //这是真实数据
                //params.put("total_fee",new BigDecimal(order.getTotalFee()).multiply(new BigDecimal(100)).longValue()+"");
                //测试金额数据,现在是1分
                params.put("total_fee",new BigDecimal(0.01).multiply(new BigDecimal(100)).longValue()+"");
                params.put("spbill_create_ip","127.0.0.1");//未来写成项目部署的ID
                params.put("notify_url","http://localhost:8080/pay/back");
                params.put("trade_type","NATIVE");
                //创建httpClient对象 作为远程调用
                HttpClient client=new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
                //支持https协议
                client.setHttps(true);
                //设置请求的参数---格式为xml
                client.setXmlParam(WXPayUtil.generateSignedXml(params,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> result=new HashMap<>();
                    result.put("codeUrl",map.get("code_url"));
                    result.put("price",order.getTotalFee());
                    result.put("orderNo",orderNo);
                    return new CommonResult(2000,"生成二维码成功",result);
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        return new CommonResult(5000,"订单失效",null);
    }
}

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

 注意下载vue-qr

npm install vue-qr

<template>
  <div id="app">
    <el-button type="primary" @click="pay">支付</el-button>
    <!--二维码的弹出层-->
    <el-dialog
            title="收银台"
            :visible.sync="dislogVisible"
            width="30%">
      <div style="text-align: center">
        <p>微信支付{{payResult.price}}元</p >
        <div style="border: 1px solid #f3f3f3; width: 220px;padding: 0px;margin: 0px auto">
          <!--使用vue-qr-->
          <vue-qr
                  :text="payResult.codeUrl"
                  :margin="0"
                  colorDark="green"
                  :logo="require('@/assets/logo.png')"
                  colorLight="#fff"
                  :size="200">

          </vue-qr>
        </div>

      </div>
      <el-divider></el-divider>
      <div style="font-size: 13px;">
        提示:<br>
        二维码两小时内有效,请及时扫码支付<br>
      </div>

    </el-dialog>
  </div>
</template>

<script>

import vueQr from 'vue-qr'
export default {
  name: 'app',
  components:{
    vueQr
  },
  data(){
    return{
      orderNo:"222111111",
      payResult:{
        price:0,
        //借助vue-qr 可以把二维码地址转换为二维码图片
        codeUrl:'',
      },
      dislogVisible:false,
      timer1:""
    }
  },
  methods:{
    //根据订单号查询支付状态
    queryPayStatus(orderNo){
      this.$http.post("/order/queryPayStatus/"+orderNo).then(result=>{
        if(result.data.code===2000){
          //消除定时器
          clearInterval(this.timer1)
          this.timer1=null;
          this.$message.success("支付成功");
          this.dislogVisible=false;
        }
      })
    },
    pay(){
      this.dislogVisible=true;
      this.$http.post("/order/createNavite/"+this.orderNo).then(result=>{
        if(result.data.code===2000){
          this.payResult=result.data.data;
          // //设置一个定时任务,每隔3秒调用一次
          this.timer1=setInterval(()=>{
            this.queryPayStatus(this.payResult.out_trade_no)
          },3000);
        }
      })
    }
  }
}
</script>

<style>

</style>

 5.后台查询订单状态

controller层

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

service层

public CommonResult queryPayStatus(String orderNo) {
        try{
            //1.根据订单状态查询微信的支付情况
            HttpClient client=new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
            Map<String,String> params=new HashMap<>();
            params.put("appid",appId);
            params.put("mch_id",mchId);
            params.put("out_trade_no",orderNo);
            params.put("nonce_str",WXPayUtil.generateNonceStr());

            client.setHttps(true);
            client.setXmlParam(WXPayUtil.generateSignedXml(params,apiKey));
            client.post();

            String content = client.getContent();
            System.out.println(content);

            Map<String,String> map=new HashMap<>();

            map = WXPayUtil.xmlToMap(content);
            
            if(map.get("trade_state").equals("SUCCESS")){
                //1.修改订单状态
                Order order=new Order();
                order.setStatus(1);
                order.setGmtModified(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
                QueryWrapper<Order> queryWrapper=new QueryWrapper<>();
                queryWrapper.eq("order_no",orderNo);
                queryWrapper.eq("status",0);
                orderMapper.update(order,queryWrapper);

                return new CommonResult(2000,"支付成功",null);
            }


        }catch (Exception e){

        }
        return new CommonResult(5000,"支付失败",null);
    }

6.展示实体类及依赖

order类

@Data
@TableName(value = "t_order")
public class Order {
    @TableId(type = IdType.ASSIGN_ID)
    private String id;
    private String orderNo;
    private String courseId;
    private String courseTitle;
    private String teacherName;
    private String memberId;
    private String nickname;
    private String mobile;
    private Double totalFee;
    private Integer payType;
    private Integer status;
    private Integer isDeleted;
    private String gmtCreate;
    private String gmtModified;

}

依赖

dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.9</version>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--微信需要的依赖-->
        <dependency>
            <groupId>com.github.wxpay</groupId>
            <artifactId>wxpay-sdk</artifactId>
            <version>0.0.3</version>
        </dependency>
        <!--Java端发送请求:在Java端模拟浏览器远程访问微信接口-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.3</version>
        </dependency>
    </dependencies>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当然可以!下面是一个简单的Java代码示例,实现微信支付业务功能: ```java import java.util.HashMap; import java.util.Map; public class WeChatPayment { private static Map<String, Double> paymentData = new HashMap<>(); public static void main(String[] args) { // 模拟生成订单 String orderId = generateOrderId(); double totalAmount = 100.00; // 发起微信支付 boolean success = makePayment(orderId, totalAmount); if (success) { System.out.println("支付成功!"); // 更新订单状态为已支付 updateOrderStatus(orderId); } else { System.out.println("支付失败!"); // 取消订单等操作 cancelOrder(orderId); } } private static String generateOrderId() { // 生成订单号的逻辑 // ... return "202201010001"; } private static boolean makePayment(String orderId, double totalAmount) { // 调用微信支付接口进行支付操作 // 这里只是模拟支付成功的情况,实际应该调用微信支付接口 paymentData.put(orderId, totalAmount); return true; } private static void updateOrderStatus(String orderId) { // 更新订单状态为已支付的逻辑 // ... } private static void cancelOrder(String orderId) { // 取消订单的逻辑 // ... } } ``` 这个示例代码中,我们通过调用 `makePayment` 方法模拟了微信支付接口,将订单号和支付金额保存在 `paymentData` 中。你可以根据实际需求,调用真实的微信支付接口完成支付操作,并在支付成功后更新订单状态。 请注意,这只是一个简单的示例,实际的微信支付业务可能涉及更多的参数和逻辑。你可以根据自己的需求进行相应的扩展和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值