专栏首页业余草Java 后端微信支付demo

Java 后端微信支付demo

一、导入微信SDK

二、在微信商户平台下载证书放在项目的resources目录下的cert文件夹下(cert文件夹需要自己建)

三、实现微信的WXPayConfig接口

package com.ieou.demo.common;


import com.github.wxpay.sdk.WXPayConfig;
import org.apache.commons.io.IOUtils;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

/** 配置我们自己的信息  */

public class OurWxPayConfig implements WXPayConfig {

    /** 加载证书  这里证书需要到微信商户平台进行下载*/
    private byte [] certData;

    public OurWxPayConfig() throws  Exception{
        InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("cert/wxpay/apiclient_cert.p12");
        this.certData = IOUtils.toByteArray(certStream);
        certStream.close();
    }

    /** 设置我们自己的appid
     * 商户号
     * 秘钥
     * */

    @Override
    public String getAppID() {
        return "wx7494893843843c";
    }

    @Override
    public String getMchID() {
        return "4672984344";
    }

    @Override
    public String getKey() {
        return "qbH5l4N3468798dfgK";
    }

    @Override
    public InputStream getCertStream() {
        return new ByteArrayInputStream(this.certData);
    }

    @Override
    public int getHttpConnectTimeoutMs() {
        return 0;
    }

    @Override
    public int getHttpReadTimeoutMs() {
        return 0;
    }
}

四、构建自己的参数

package com.ieou.demo.common;

import java.math.BigDecimal;

public class WxpayParam {


    /** 微信支付的金额是String类型 并且是以分为单位
     * 下面举个例子单位是元是怎么转为分的
     * */
    BigDecimal totalPrice  = new BigDecimal(1); //此时的单位是元

    private String body = "xxx等商品信息";
    private String totalFee = totalPrice.multiply(new BigDecimal(100)).toBigInteger().toString();
    /** 随机数字字符串*/
    private String outTradeNo = "4784984230432842944";

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getTotalFee() {
        return totalFee;
    }

    public void setTotalFee(String totalFee) {
        this.totalFee = totalFee;
    }

    public String getOutTradeNo() {
        return outTradeNo;
    }

    public void setOutTradeNo(String outTradeNo) {
        this.outTradeNo = outTradeNo;
    }
}

五、配置微信统一下单接口需要的参数,并调用微信统一下单接口

package com.ieou.demo.controller;

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;
import com.ieou.demo.common.OurWxPayConfig;
import com.ieou.demo.common.WxpayParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;


@RestController
@RequestMapping("/")
public class WxPayController {

    @GetMapping("/pay")
    public Map<String,String> wxPayFunction() throws Exception{

        WxpayParam wxpayParam = new WxpayParam();
        String notifyUrl = "www.baidu.com";  //我这里的回调地址是随便写的,到时候需要换成处理业务的回调接口

        OurWxPayConfig ourWxPayConfig = new OurWxPayConfig();
        WXPay wxPay = new WXPay(ourWxPayConfig);

        //根据微信支付api来设置
        Map<String,String> data = new HashMap<>();
        data.put("appid",ourWxPayConfig.getAppID());
        data.put("mch_id",ourWxPayConfig.getMchID());         //商户号
        data.put("trade_type","APP");                         //支付场景 APP 微信app支付 JSAPI 公众号支付  NATIVE 扫码支付
        data.put("notify_url",notifyUrl);                     //回调地址
        data.put("spbill_create_ip","127.0.0.1");             //终端ip
        data.put("total_fee",wxpayParam.getTotalFee());       //订单总金额
        data.put("fee_type","CNY");                           //默认人民币
        data.put("out_trade_no",wxpayParam.getOutTradeNo());   //交易号
        data.put("body",wxpayParam.getBody());
        data.put("nonce_str","bfrhncjkfdkfd");   // 随机字符串小于32位
        String s = WXPayUtil.generateSignature(data, ourWxPayConfig.getKey());  //签名
        data.put("sign",s);
        
        /** wxPay.unifiedOrder 这个方法中调用微信统一下单接口 */
        Map<String, String> respData = wxPay.unifiedOrder(data); 
        if (respData.get("return_code").equals("SUCCESS")){

            //返回给APP端的参数,APP端再调起支付接口
            Map<String,String> repData = new HashMap<>();
            repData.put("appid",ourWxPayConfig.getAppID());
            repData.put("mch_id",ourWxPayConfig.getMchID());
            repData.put("prepayid",respData.get("prepay_id"));
            repData.put("package","WXPay");
            repData.put("noncestr",respData.get("nonce_str"));
            repData.put("timestamp",String.valueOf(System.currentTimeMillis()/1000));
            String sign = WXPayUtil.generateSignature(repData,ourWxPayConfig.getKey()); //签名
            respData.put("sign",sign);
            respData.put("timestamp",repData.get("timestamp"));
            respData.put("package","WXPay");
            return respData;
        }
        throw new Exception(respData.get("return_msg"));
    }
}

六、至此,后端代码已经结束,前端拿到返回值调用微信发起支付接口就可以了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • jdk中的简单并发,需要掌握

        小时候有一次爸爸带我去偷村头别人家的梨子,我上树摘,爸爸在下面放风,正摘着主人来了,爸爸指着我破口大骂:臭小子,赶紧给我滚下来,敢偷吃别人家梨子,看我不...

  • Cassandra应用实践

    执行bin/cqlsh ip即可cassandra的shell客户端,可以执行的CQL命令和mysql比较类似。

    用户2003442
  • Dart 笔记 5 - 控制流

    switch 语句使用 == 运算来比较整数,字符串或者编译时常量。被比较对象必须:

    七适散人
  • Dart 笔记 8 - 类(1)

    Dart 是一种面向对象的语言,具有类和基于 mixin 的继承。每个对象都是一个类的实例,所有的类都是 Object 的子类。

    七适散人
  • PHP6个基础语法梳理(附Demo)

    就如编写JavaScript脚本语言需要写在<script></script >标签之间一样, 在页面中编写的PHP代码写在<?php?>标签之间,但注意后面...

    凌川江雪
  • java 调优概要

    分为两类,一种是boolean类型,设置生效不生效,另一类是设置值。-XX:<name>=<value>

    birdskyws
  • Java :: 用法

    JDK8中有双冒号的用法,就是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下。

    赵哥窟
  • java使用netty的模型总结

    由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面。

    ydymz
  • 聊聊flink的NetworkBufferPool

    flink-release-1.7.2/flink-runtime/src/main/java/org/apache/flink/runtime/io/netw...

    codecraft
  • Java 代理模式

    代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理...

    赵哥窟

扫码关注云+社区

领取腾讯云代金券