zoukankan      html  css  js  c++  java
  • Java 后端微信支付demo

    Java 后端微信支付demo

    一、导入微信SDK

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

    三、实现微信的WXPayConfig接口

     1 package com.ieou.demo.common;
     2 
     3 
     4 import com.github.wxpay.sdk.WXPayConfig;
     5 import org.apache.commons.io.IOUtils;
     6 
     7 import java.io.ByteArrayInputStream;
     8 import java.io.InputStream;
     9 
    10 /** 配置我们自己的信息  */
    11 
    12 public class OurWxPayConfig implements WXPayConfig {
    13 
    14     /** 加载证书  这里证书需要到微信商户平台进行下载*/
    15     private byte [] certData;
    16 
    17     public OurWxPayConfig() throws  Exception{
    18         InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("cert/wxpay/apiclient_cert.p12");
    19         this.certData = IOUtils.toByteArray(certStream);
    20         certStream.close();
    21     }
    22 
    23     /** 设置我们自己的appid
    24      * 商户号
    25      * 秘钥
    26      * */
    27 
    28     @Override
    29     public String getAppID() {
    30         return "wx7494893843843c";
    31     }
    32 
    33     @Override
    34     public String getMchID() {
    35         return "4672984344";
    36     }
    37 
    38     @Override
    39     public String getKey() {
    40         return "qbH5l4N3468798dfgK";
    41     }
    42 
    43     @Override
    44     public InputStream getCertStream() {
    45         return new ByteArrayInputStream(this.certData);
    46     }
    47 
    48     @Override
    49     public int getHttpConnectTimeoutMs() {
    50         return 0;
    51     }
    52 
    53     @Override
    54     public int getHttpReadTimeoutMs() {
    55         return 0;
    56     }
    57 }

    四、构建自己的参数

    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;
        }
    }

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

     1 package com.ieou.demo.controller;
     2 
     3 import com.github.wxpay.sdk.WXPay;
     4 import com.github.wxpay.sdk.WXPayUtil;
     5 import com.ieou.demo.common.OurWxPayConfig;
     6 import com.ieou.demo.common.WxpayParam;
     7 import org.springframework.web.bind.annotation.GetMapping;
     8 import org.springframework.web.bind.annotation.RequestMapping;
     9 import org.springframework.web.bind.annotation.RestController;
    10 
    11 import java.util.HashMap;
    12 import java.util.Map;
    13 
    14 
    15 @RestController
    16 @RequestMapping("/")
    17 public class WxPayController {
    18 
    19     @GetMapping("/pay")
    20     public Map<String,String> wxPayFunction() throws Exception{
    21 
    22         WxpayParam wxpayParam = new WxpayParam();
    23         String notifyUrl = "www.baidu.com";  //我这里的回调地址是随便写的,到时候需要换成处理业务的回调接口
    24 
    25         OurWxPayConfig ourWxPayConfig = new OurWxPayConfig();
    26         WXPay wxPay = new WXPay(ourWxPayConfig);
    27 
    28         //根据微信支付api来设置
    29         Map<String,String> data = new HashMap<>();
    30         data.put("appid",ourWxPayConfig.getAppID());
    31         data.put("mch_id",ourWxPayConfig.getMchID());         //商户号
    32         data.put("trade_type","APP");                         //支付场景 APP 微信app支付 JSAPI 公众号支付  NATIVE 扫码支付
    33         data.put("notify_url",notifyUrl);                     //回调地址
    34         data.put("spbill_create_ip","127.0.0.1");             //终端ip
    35         data.put("total_fee",wxpayParam.getTotalFee());       //订单总金额
    36         data.put("fee_type","CNY");                           //默认人民币
    37         data.put("out_trade_no",wxpayParam.getOutTradeNo());   //交易号
    38         data.put("body",wxpayParam.getBody());
    39         data.put("nonce_str","bfrhncjkfdkfd");   // 随机字符串小于32位
    40         String s = WXPayUtil.generateSignature(data, ourWxPayConfig.getKey());  //签名
    41         data.put("sign",s);
    42         
    43         /** wxPay.unifiedOrder 这个方法中调用微信统一下单接口 */
    44         Map<String, String> respData = wxPay.unifiedOrder(data); 
    45         if (respData.get("return_code").equals("SUCCESS")){
    46 
    47             //返回给APP端的参数,APP端再调起支付接口
    48             Map<String,String> repData = new HashMap<>();
    49             repData.put("appid",ourWxPayConfig.getAppID());
    50             repData.put("mch_id",ourWxPayConfig.getMchID());
    51             repData.put("prepayid",respData.get("prepay_id"));
    52             repData.put("package","WXPay");
    53             repData.put("noncestr",respData.get("nonce_str"));
    54             repData.put("timestamp",String.valueOf(System.currentTimeMillis()/1000));
    55             String sign = WXPayUtil.generateSignature(repData,ourWxPayConfig.getKey()); //签名
    56             respData.put("sign",sign);
    57             respData.put("timestamp",repData.get("timestamp"));
    58             respData.put("package","WXPay");
    59             return respData;
    60         }
    61         throw new Exception(respData.get("return_msg"));
    62     }
    63 }

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

  • 相关阅读:
    Python实例 包机制
    Python实例 类和继承
    python实例 文件处理
    python实例 异常处理
    配置 Apache+php多端口多站点(转载)
    C#中Delegate和Event以及它们的区别(转载)
    LINQ to SQL更新数据库操作(转载)
    创业公司如何实施敏捷开发(转)
    利用ps橡皮擦工具快速抠图
    XP win2003系统 微软雅黑字体的使用方法
  • 原文地址:https://www.cnblogs.com/wang-yaz/p/8632624.html
Copyright © 2011-2022 走看看