精华内容
下载资源
问答
  • java实现微信企业付款

    2018-01-30 16:33:37
    java实现微信企业付款到个人的银行卡,可以参照https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1
  • 微信企业付款到个人的php实现代码,供大家参考,具体内容如下企业付款实现企业向个人付款,实现付款到用户零钱。项目实现了企业付款到个人和企业付款个人账单查询。代码包括签名实现,双向证书验证,付款功能等支付...

    微信企业付款到个人的php实现代码,供大家参考,具体内容如下

    企业付款实现企业向个人付款,实现付款到用户零钱。项目实现了企业付款到个人和企业付款个人账单查询。代码包括签名实现,双向证书验证,付款功能等

    支付流程

    付款功能

    企业付款到授权用户的零钱

    企业付款注意注意:

    1、所有接口需要双向证书验证

    2、需要设置接口秘钥,签名用

    详细参考:微信企业付款开发文档

    项目结构

    和上一篇一样,需要配置证书以及商户id、appid等

    4c35ffaf762a1ed987b7d08797afa0c1.png

    支付功能

    包含企业转账和企业转账查询

    package org.andy.wxpay.controller;

    import java.util.HashMap;

    import java.util.Map;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import org.andy.wxpay.model.jsonResult;

    import org.andy.wxpay.model.ResponseData;

    import org.andy.wxpay.utils.CollectionUtil;

    import org.andy.wxpay.utils.ConfigUtil;

    import org.andy.wxpay.utils.HttpUtils;

    import org.andy.wxpay.utils.PayUtil;

    import org.andy.wxpay.utils.SerializerFeatureUtil;

    import org.andy.wxpay.utils.StringUtil;

    import org.andy.wxpay.utils.WebUtil;

    import org.andy.wxpay.utils.XmlUtil;

    import org.apache.log4j.Logger;

    import org.springframework.stereotype.Controller;

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RequestMethod;

    import com.alibaba.fastjson.JSON;

    /**

    * 创建时间:2016年11月9日 下午5:49:00

    *

    * @author andy

    * @version 2.2

    */

    @Controller

    @RequestMapping("/transfer")

    public class TransferController {

    private static final Logger LOG = Logger.getLogger(TransferController.class);

    private static final String TRANSFERS_PAY = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; // 企业付款

    private static final String TRANSFERS_PAY_QUERY = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo"; // 企业付款查询

    private static final String RFLhvhUtil.getTransferNo()); //商户订单号

    parm.put("openid", openid); //用户openid

    parm.put("check_name", "NO_CHECK"); //校验用户姓名选项 OPTION_CHECK

    //parm.put("re_user_name", "安迪"); //check_name设置为FORCE_CHECK或OPTION_CHECK,则必填

    parm.put("amount", "100"); //转账金额

    parm.put("desc", "测试转账到个人"); //企业付款描述信息

    parm.put("spbill_create_ip", PayUtil.getLocalIp(request)); //服务器Ip地址

    parm.put("sign", PayUtil.getSign(parm, API_SECRET));

    String restxml = HttpUtils.posts(TRANSFERS_PAY, XmlUtil.xmlFormat(parm, false));

    restmap = XmlUtil.xmlParse(restxml);

    } catch (Exception e) {

    LOG.error(e.getMessage(), e);

    }

    if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {

    LOG.info("转账成功:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));

    Map transferMap = new HashMap<>();

    transferMap.put("partner_trade_no", restmap.get("partner_trade_no"));//商户www.cppcns.com转账订单号

    transferMap.put("payment_no", restmap.get("payment_no")); //微信订单号

    transferMap.put("payment_time", restmap.get("payment_time")); //微信支付成功时间

    WebUtil.response(response,

    WebUtil.packJsonp(callback,

    JSON.toJSONString(new JsonResult(1, "转账成功", new ResponseData(null, transferMap)),

    SerializerFeatureUtil.FEATURES)));

    }else {

    if (CollectionUtil.isNotEmpty(restmap)) {

    LOG.info("转账失败:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));

    }

    WebUtil.response(response, WebUtil.packJsonp(callback, JSON

    .toJSONString(new JsonResult(-1, "转账失败", new ResponseData()), SerializerFeatureUtil.FEATURES)));

    }

    }

    /**

    * 企业向个人转账查询

    * @param request

    * @param response

    * @param tradeno 商户转账订单号

    * @param callback

    */

    @RequestMapping(value = "/pay/query", method = RequestMethod.POST)

    public void orderPayQuery(HttpServletRequest request, HttpServletResponse response, String tradeno,

    String callback) {

    LOG.info("[/transfer/pay/query]");

    if (StringUtil.isEmpty(tradeno)) {

    WebUtil.response(response, WebUtil.packJsonp(callback, JSON

    http://www.cppcns.com;String, String> parm = new HashMap();

    parm.put("appid", APP_ID);

    parm.put("mch_id", MCH_ID);

    parm.put("partner_trade_no", tradeno);

    parm.put("nonce_str", PayUtil.getNonceStr());

    parm.put("sign", PayUtil.getSign(parm, API_SECRET));

    String restxml = HttpUtils.posts(TRANSFERS_PAY_QUERY, XmlUtil.xmlFormat(parm, true));

    restmap = XmlUtil.xmlParse(restxml);

    } catch (Exception e) {

    LOG.error(e.getMessage(), e);

    }

    if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {

    // 订单查询成功 处理业务逻辑

    LOG.info("订单查询:订单" + restmap.get("partner_trade_no") + "支付成功");

    Map transferMap = new HashMap<>();

    transferMap.put("partner_trade_no", restmap.get("partner_trade_no"));//商户转账订单号

    transferMap.put("openid", restmap.get("openid")); //收款微信号

    transferMap.put("payment_amount", restmap.get("payment_amount")); //转账金额

    transferMap.put("transfer_time", restmap.get("transfer_time")); //转账时间

    transferMap.put("desc", restmap.get("desc")); //转账描述

    WebUtil.response(response, WebUtil.packJsonp(callback, JSON

    .toJSONString(new JsonResult(1, "订单转账成功", new ResponseData(null, transferMap)), SerializerFeatureUtil.FEATURES)));

    }else {

    if (CollectionUtil.isNotEmpty(restmap)) {

    LOG.info("订单转账失败:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));

    }

    WebUtil.response(response, WebUtil.packJsonp(callback, JSON

    .toJSONString(new JsonResult(-1, "订单转账失败", new ResponseData()), SerializerFeatureUtil.FEATURES)));

    }

    }

    }

    其他代码参考上一篇 微信支付-App支付服务端详解

    支付结果

    支付成功后会将金额支付到用户余额中

    7b9206bfbdff7f0aed9c5227fc675c92.png

    功能实际很简单,需要自己看一下文档。

    源代码地址:微信企业付款

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

    本文标题: java实现微信企业付款到个人

    本文地址: http://www.cppcns.com/ruanjian/java/240941.html

    展开全文
  • 主要为大家详细介绍了java实现微信企业付款到个人功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要为大家详细介绍了java实现微信企业付款到个人功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java实现微信企业付款到个人发布时间:2020-10-24 12:45:58来源:脚本之家阅读:105作者:Andyzty微信企业付款到个人的PHP实现代码,供大家参考,具体内容如下企业付款实现企业向个人付款,实现付款到用户零钱。...

    java实现微信企业付款到个人

    发布时间:2020-10-24 12:45:58

    来源:脚本之家

    阅读:105

    作者:Andyzty

    微信企业付款到个人的PHP实现代码,供大家参考,具体内容如下

    企业付款实现企业向个人付款,实现付款到用户零钱。项目实现了企业付款到个人和企业付款个人账单查询。代码包括签名实现,双向证书验证,付款功能等

    支付流程

    付款功能

    企业付款到授权用户的零钱

    企业付款注意注意:

    1、所有接口需要双向证书验证

    2、需要设置接口秘钥,签名用

    详细参考:微信企业付款开发文档

    项目结构

    和上一篇一样,需要配置证书以及商户id、appid等

    31e5cb56f271ad02c4c89e23be821fd2.png

    支付功能

    包含企业转账和企业转账查询

    package org.andy.wxpay.controller;

    import java.util.HashMap;

    import java.util.Map;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import org.andy.wxpay.model.JsonResult;

    import org.andy.wxpay.model.ResponseData;

    import org.andy.wxpay.utils.CollectionUtil;

    import org.andy.wxpay.utils.ConfigUtil;

    import org.andy.wxpay.utils.HttpUtils;

    import org.andy.wxpay.utils.PayUtil;

    import org.andy.wxpay.utils.SerializerFeatureUtil;

    import org.andy.wxpay.utils.StringUtil;

    import org.andy.wxpay.utils.WebUtil;

    import org.andy.wxpay.utils.XmlUtil;

    import org.apache.log4j.Logger;

    import org.springframework.stereotype.Controller;

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RequestMethod;

    import com.alibaba.fastjson.JSON;

    /**

    * 创建时间:2016年11月9日 下午5:49:00

    *

    * @author andy

    * @version 2.2

    */

    @Controller

    @RequestMapping("/transfer")

    public class TransferController {

    private static final Logger LOG = Logger.getLogger(TransferController.class);

    private static final String TRANSFERS_PAY = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; // 企业付款

    private static final String TRANSFERS_PAY_QUERY = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo"; // 企业付款查询

    private static final String APP_ID = ConfigUtil.getProperty("wx.appid");

    private static final String MCH_ID = ConfigUtil.getProperty("wx.mchid");

    private static final String API_SECRET = ConfigUtil.getProperty("wx.api.secret");

    /**

    * 企业向个人支付转账

    * @param request

    * @param response

    * @param openid 用户openid

    * @param callback

    */

    @RequestMapping(value = "/pay", method = RequestMethod.POST)

    public void transferPay(HttpServletRequest request, HttpServletResponse response, String openid, String callback) {

    LOG.info("[/transfer/pay]");

    //业务判断 openid是否有收款资格

    Map restmap = null;

    try {

    Map parm = new HashMap();

    parm.put("mch_appid", APP_ID); //公众账号appid

    parm.put("mchid", MCH_ID); //商户号

    parm.put("nonce_str", PayUtil.getNonceStr()); //随机字符串

    parm.put("partner_trade_no", PayUtil.getTransferNo()); //商户订单号

    parm.put("openid", openid); //用户openid

    parm.put("check_name", "NO_CHECK"); //校验用户姓名选项 OPTION_CHECK

    //parm.put("re_user_name", "安迪"); //check_name设置为FORCE_CHECK或OPTION_CHECK,则必填

    parm.put("amount", "100"); //转账金额

    parm.put("desc", "测试转账到个人"); //企业付款描述信息

    parm.put("spbill_create_ip", PayUtil.getLocalIp(request)); //服务器Ip地址

    parm.put("sign", PayUtil.getSign(parm, API_SECRET));

    String restxml = HttpUtils.posts(TRANSFERS_PAY, XmlUtil.xmlFormat(parm, false));

    restmap = XmlUtil.xmlParse(restxml);

    } catch (Exception e) {

    LOG.error(e.getMessage(), e);

    }

    if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {

    LOG.info("转账成功:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));

    Map transferMap = new HashMap<>();

    transferMap.put("partner_trade_no", restmap.get("partner_trade_no"));//商户转账订单号

    transferMap.put("payment_no", restmap.get("payment_no")); //微信订单号

    transferMap.put("payment_time", restmap.get("payment_time")); //微信支付成功时间

    WebUtil.response(response,

    WebUtil.packJsonp(callback,

    JSON.toJSONString(new JsonResult(1, "转账成功", new ResponseData(null, transferMap)),

    SerializerFeatureUtil.FEATURES)));

    }else {

    if (CollectionUtil.isNotEmpty(restmap)) {

    LOG.info("转账失败:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));

    }

    WebUtil.response(response, WebUtil.packJsonp(callback, JSON

    .toJSONString(new JsonResult(-1, "转账失败", new ResponseData()), SerializerFeatureUtil.FEATURES)));

    }

    }

    /**

    * 企业向个人转账查询

    * @param request

    * @param response

    * @param tradeno 商户转账订单号

    * @param callback

    */

    @RequestMapping(value = "/pay/query", method = RequestMethod.POST)

    public void orderPayQuery(HttpServletRequest request, HttpServletResponse response, String tradeno,

    String callback) {

    LOG.info("[/transfer/pay/query]");

    if (StringUtil.isEmpty(tradeno)) {

    WebUtil.response(response, WebUtil.packJsonp(callback, JSON

    .toJSONString(new JsonResult(-1, "转账订单号不能为空", new ResponseData()), SerializerFeatureUtil.FEATURES)));

    }

    Map restmap = null;

    try {

    Map parm = new HashMap();

    parm.put("appid", APP_ID);

    parm.put("mch_id", MCH_ID);

    parm.put("partner_trade_no", tradeno);

    parm.put("nonce_str", PayUtil.getNonceStr());

    parm.put("sign", PayUtil.getSign(parm, API_SECRET));

    String restxml = HttpUtils.posts(TRANSFERS_PAY_QUERY, XmlUtil.xmlFormat(parm, true));

    restmap = XmlUtil.xmlParse(restxml);

    } catch (Exception e) {

    LOG.error(e.getMessage(), e);

    }

    if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {

    // 订单查询成功 处理业务逻辑

    LOG.info("订单查询:订单" + restmap.get("partner_trade_no") + "支付成功");

    Map transferMap = new HashMap<>();

    transferMap.put("partner_trade_no", restmap.get("partner_trade_no"));//商户转账订单号

    transferMap.put("openid", restmap.get("openid")); //收款微信号

    transferMap.put("payment_amount", restmap.get("payment_amount")); //转账金额

    transferMap.put("transfer_time", restmap.get("transfer_time")); //转账时间

    transferMap.put("desc", restmap.get("desc")); //转账描述

    WebUtil.response(response, WebUtil.packJsonp(callback, JSON

    .toJSONString(new JsonResult(1, "订单转账成功", new ResponseData(null, transferMap)), SerializerFeatureUtil.FEATURES)));

    }else {

    if (CollectionUtil.isNotEmpty(restmap)) {

    LOG.info("订单转账失败:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));

    }

    WebUtil.response(response, WebUtil.packJsonp(callback, JSON

    .toJSONString(new JsonResult(-1, "订单转账失败", new ResponseData()), SerializerFeatureUtil.FEATURES)));

    }

    }

    }

    其他代码参考上一篇 微信支付-App支付服务端详解

    支付结果

    支付成功后会将金额支付到用户余额中

    d44e13844515f34dbf9ffc386fd6a0a3.png

    功能实际很简单,需要自己看一下文档。

    源代码地址:微信企业付款

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持亿速云。

    展开全文
  • 微信企业付款到个人的PHP实现代码,供大家参考,具体内容如下企业付款实现企业向个人付款,实现付款到用户零钱。项目实现了企业付款到个人和企业付款个人账单查询。代码包括签名实现,双向证书验证,付款功能等支付...

    微信企业付款到个人的PHP实现代码,供大家参考,具体内容如下

    企业付款实现企业向个人付款,实现付款到用户零钱。项目实现了企业付款到个人和企业付款个人账单查询。代码包括签名实现,双向证书验证,付款功能等

    支付流程

    付款功能

    企业付款到授权用户的零钱

    企业付款注意注意:

    1、所有接口需要双向证书验证

    2、需要设置接口秘钥,签名用

    详细参考:微信企业付款开发文档

    项目结构

    和上一篇一样,需要配置证书以及商户id、appid等

    2e783e604d270a706af3cedba6766a22.png

    支付功能

    包含企业转账和企业转账查询

    package org.andy.wxpay.controller;

    import java.util.HashMap;

    import java.util.Map;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import org.andy.wxpay.model.JsonResult;

    import org.andy.wxpay.model.ResponseData;

    import org.andy.wxpay.utils.CollectionUtil;

    import org.andy.wxpay.utils.ConfigUtil;

    import org.andy.wxpay.utils.HttpUtils;

    import org.andy.wxpay.utils.PayUtil;

    import org.andy.wxpay.utils.SerializerFeatureUtil;

    import org.andy.wxpay.utils.StringUtil;

    import org.andy.wxpay.utils.WebUtil;

    import org.andy.wxpay.utils.XmlUtil;

    import org.apache.log4j.Logger;

    import org.springframework.stereotype.Controller;

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RequestMethod;

    import com.alibaba.fastjson.JSON;

    /**

    * 创建时间:2016年11月9日 下午5:49:00

    *

    * @author andy

    * @version 2.2

    */

    @Controller

    @RequestMapping("/transfer")

    public class TransferController {

    private static final Logger LOG = Logger.getLogger(TransferController.class);

    private static final String TRANSFERS_PAY = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; // 企业付款

    private static final String TRANSFERS_PAY_QUERY = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo"; // 企业付款查询

    private static final String APP_ID = ConfigUtil.getProperty("wx.appid");

    private static final String MCH_ID = ConfigUtil.getProperty("wx.mchid");

    private static final String API_SECRET = ConfigUtil.getProperty("wx.api.secret");

    /**

    * 企业向个人支付转账

    * @param request

    * @param response

    * @param openid 用户openid

    * @param callback

    */

    @RequestMapping(value = "/pay", method = RequestMethod.POST)

    public void transferPay(HttpServletRequest request, HttpServletResponse response, String openid, String callback) {

    LOG.info("[/transfer/pay]");

    //业务判断 openid是否有收款资格

    Map restmap = null;

    try {

    Map parm = new HashMap();

    parm.put("mch_appid", APP_ID); //公众账号appid

    parm.put("mchid", MCH_ID); //商户号

    parm.put("nonce_str", PayUtil.getNonceStr()); //随机字符串

    parm.put("partner_trade_no", PayUtil.getTransferNo()); //商户订单号

    parm.put("openid", openid); //用户openid

    parm.put("check_name", "NO_CHECK"); //校验用户姓名选项 OPTION_CHECK

    //parm.put("re_user_name", "安迪"); //check_name设置为FORCE_CHECK或OPTION_CHECK,则必填

    parm.put("amount", "100"); //转账金额

    parm.put("desc", "测试转账到个人"); //企业付款描述信息

    parm.put("spbill_create_ip", PayUtil.getLocalIp(request)); //服务器Ip地址

    parm.put("sign", PayUtil.getSign(parm, API_SECRET));

    String restxml = HttpUtils.posts(TRANSFERS_PAY, XmlUtil.xmlFormat(parm, false));

    restmap = XmlUtil.xmlParse(restxml);

    } catch (Exception e) {

    LOG.error(e.getMessage(), e);

    }

    if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {

    LOG.info("转账成功:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));

    Map transferMap = new HashMap<>();

    transferMap.put("partner_trade_no", restmap.get("partner_trade_no"));//商户转账订单号

    transferMap.put("payment_no", restmap.get("payment_no")); //微信订单号

    transferMap.put("payment_time", restmap.get("payment_time")); //微信支付成功时间

    WebUtil.response(response,

    WebUtil.packJsonp(callback,

    JSON.toJSONString(new JsonResult(1, "转账成功", new ResponseData(null, transferMap)),

    SerializerFeatureUtil.FEATURES)));

    }else {

    if (CollectionUtil.isNotEmpty(restmap)) {

    LOG.info("转账失败:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));

    }

    WebUtil.response(response, WebUtil.packJsonp(callback, JSON

    .toJSONString(new JsonResult(-1, "转账失败", new ResponseData()), SerializerFeatureUtil.FEATURES)));

    }

    }

    /**

    * 企业向个人转账查询

    * @param request

    * @param response

    * @param tradeno 商户转账订单号

    * @param callback

    */

    @RequestMapping(value = "/pay/query", method = RequestMethod.POST)

    public void orderPayQuery(HttpServletRequest request, HttpServletResponse response, String tradeno,

    String callback) {

    LOG.info("[/transfer/pay/query]");

    if (StringUtil.isEmpty(tradeno)) {

    WebUtil.response(response, WebUtil.packJsonp(callback, JSON

    .toJSONString(new JsonResult(-1, "转账订单号不能为空", new ResponseData()), SerializerFeatureUtil.FEATURES)));

    }

    Map restmap = null;

    try {

    Map parm = new HashMap();

    parm.put("appid", APP_ID);

    parm.put("mch_id", MCH_ID);

    parm.put("partner_trade_no", tradeno);

    parm.put("nonce_str", PayUtil.getNonceStr());

    parm.put("sign", PayUtil.getSign(parm, API_SECRET));

    String restxml = HttpUtils.posts(TRANSFERS_PAY_QUERY, XmlUtil.xmlFormat(parm, true));

    restmap = XmlUtil.xmlParse(restxml);

    } catch (Exception e) {

    LOG.error(e.getMessage(), e);

    }

    if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {

    // 订单查询成功 处理业务逻辑

    LOG.info("订单查询:订单" + restmap.get("partner_trade_no") + "支付成功");

    Map transferMap = new HashMap<>();

    transferMap.put("partner_trade_no", restmap.get("partner_trade_no"));//商户转账订单号

    transferMap.put("openid", restmap.get("openid")); //收款微信号

    transferMap.put("payment_amount", restmap.get("payment_amount")); //转账金额

    transferMap.put("transfer_time", restmap.get("transfer_time")); //转账时间

    transferMap.put("desc", restmap.get("desc")); //转账描述

    WebUtil.response(response, WebUtil.packJsonp(callback, JSON

    .toJSONString(new JsonResult(1, "订单转账成功", new ResponseData(null, transferMap)), SerializerFeatureUtil.FEATURES)));

    }else {

    if (CollectionUtil.isNotEmpty(restmap)) {

    LOG.info("订单转账失败:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));

    }

    WebUtil.response(response, WebUtil.packJsonp(callback, JSON

    .toJSONString(new JsonResult(-1, "订单转账失败", new ResponseData()), SerializerFeatureUtil.FEATURES)));

    }

    }

    }

    其他代码参考上一篇 微信支付-App支付服务端详解

    支付结果

    支付成功后会将金额支付到用户余额中

    5f4e436931ec2471be8c57dabb10abe7.png

    功能实际很简单,需要自己看一下文档。

    上面即是这篇文章的内容,希望对各位的学习有所启发,也希望大家多多支持学猫在线(shtml.net)。

    本文来源:https://blog.csdn.net/fengshizty/article/details/53204566

    展开全文
  • java实现微信企业付款到个人零钱(微信红包)

    万次阅读 热门讨论 2018-09-08 15:54:04
    今天公司打算做一个活动,就是可以让用户领取平台发送的红包,根据微信官方文档实现微信企业付款到零钱(因为商户号不满足一些条件无法使用红包,红包跟零钱实现方法基本一样),然后又加入了一些简单的红包算法。...

            今天公司打算做一个活动,就是可以让用户领取平台发送的红包,根据微信官方文档实现微信企业付款到零钱(因为商户号不满足一些条件无法使用红包,红包跟零钱实现方法基本一样),然后又加入了一些简单的红包算法。微信官方文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1

            红包发送的规则:总共有100个红包,总金额100元,最小红包0.05,最大红包3,也就是说100元,发100次基本上能领完。红包领取的规则:在移动端页面上展示红包,用户领取的时候,调用后台接口领取红包(一些领取规则可以自己添加)。

            零钱(红包)发放接口如下

        @ResponseBody
        @RequestMapping("wxSendWallet")
        public void wxSendWallet(String openid) {
            //微信金额的单位是分 所以这里要*100 
            float money = getRedPack();
            BigDecimal df = new BigDecimal(money+"");
         	df = df.multiply(new BigDecimal("100"));
         	int fee = df.intValue();
         	//创建一个唯一订单号
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
            String time = sdf.format(new Date());
         	String orderId = time + (int)(Math.random()*1000000);
            String xml = WeixinCore.wxSendWallet(orderId,openid,String.valueOf(fee));
            try {
                //指定读取证书格式为PKCS12
                KeyStore keyStore = KeyStore.getInstance("PKCS12");
                //windows系统
                //FileInputStream instream = new FileInputStream(new File("D:\\cert\\apiclient_cert.p12"));
                //linux系统,读取本机存放的PKCS12证书文件
                FileInputStream instream = new FileInputStream(new File("/alidata/opt/paycert/apiclient_cert.p12"));
                try {
                	//指定PKCS12的密码(商户ID)
                    //keyStore.load(instream, accountUtil.getWxPartnerId().toCharArray());
                	keyStore.load(instream, "微信商户号".toCharArray());
                }finally {
                    instream.close();
                }
                // Trust own CA and all self-signed certs
                SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, "微信商户号".toCharArray()).build();
            	//指定TLS版本, Allow TLSv1 protocol only
                SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                        sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
                //设置httpclient的SSLSocketFactory
                CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
                HttpPost httppost = new HttpPost("https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers");
            	//这里要设置编码,不然xml中有中文的话会提示签名失败或者展示乱码
                httppost.addHeader("Content-Type", "text/xml");
                StringEntity se = new StringEntity(xml,"UTF-8");
                httppost.setEntity(se);
                CloseableHttpResponse responseEntry = httpclient.execute(httppost);
                try {
                    HttpEntity entity = responseEntry.getEntity();
                    if (entity != null) {
                        System.out.println("响应内容长度 : "+ entity.getContentLength());
                        SAXReader saxReader = new SAXReader();
                        Document document = saxReader.read(entity.getContent());
                        Element rootElt = document.getRootElement();
                        String resultCode = rootElt.elementText("result_code");
                        if(resultCode.equals("SUCCESS")){
                        	//保存红包信息到数据库
                            //保存用户领取记录
                        }else{
                        	System.out.println(rootElt.elementText("err_code_des"));
                        }
                    }
                    EntityUtils.consume(entity);
                }catch(Exception e){
                	System.out.println("请求失败");
                }
                finally {
                    responseEntry.close();
                }
            }catch(Exception e){
            	System.out.println("请求失败");
            }
        }

           getRedPack方法如下, 假如第一次领取(后台获取表示从后台查询所得)

        public float getRedPack(){
    		//红包数   (后台获取)
            int number = 100;    
            //剩余红包总额    (后台获取)
            float total = 100;  
    		float money = 0f;    
            //最小红包    (后台获取)
            double min = 0.05;    
            //系统最大红包(后台获取)
            float systemMax = 3;
            //最大红包
            double max;
            //剩余领取次数(后台获取)
            int surplusNumber = 100;
            
            //本次领取之后,剩余领取次数减一
            surplusNumber--;
            
            DecimalFormat df = new DecimalFormat("###.##");    
            if (surplusNumber > 0) {     
                //保证即使一个红包是最大的了,后面剩下的红包,每个红包也不会小于最小值      
                max = total - min * surplusNumber;      
                int k = (int)surplusNumber / 2;      
                //保证最后两个人拿的红包不超出剩余红包     
                if (surplusNumber <= 2) {      
                    k = surplusNumber;      
                }     
                //最大的红包限定的平均线上下      
                max = max / k;     
                //保证每个红包大于最小值,又不会大于最大值      
                money = (int) (min * 100 + Math.random() * (max * 100 - min * 100 + 1));    
                money = (float)money / 100;     
                //保留两位小数      
                money = Float.parseFloat(df.format(money));    
                //如果红包大于默认最大值,将红包职位默认最大值
                if(money > systemMax){
                	money = systemMax;
                }
                total=(int)(total*100 - money*100);     
                total = total/100;
                System.out.println("第" + (number - surplusNumber) + "个人拿到" + money + "剩下" + total);     
            } else if(surplusNumber == 0){//如果是最后一次,不需要计算
            	//如果最后一次红包超过系统最大红包,设置为系统默认最大红包
            	if(total > systemMax){
            		money = systemMax;
            		total=(int)(total*100 - money*100);
            		total = total/100;
            		System.out.println("最后一个人拿到" + money + "剩下"+total);  
            	}else{
            		money = total;
            		System.out.println("最后一个人拿到" + money + "剩下0");  
            	}
            }else{
            	System.out.println("红包已发放完毕");
            }
            return money;
        }

            进行签名,将参数排序并拼接成xml

        public static String wxSendWallet(String partner_trade_no, String openid,String total_amount) {
            String data = null;
            try {
                String nonceStr = genNonceStr();
                //SortedMap接口主要提供有序的Map实现,默认的排序是根据key值进行升序排序
                SortedMap<String,String> parameters = new TreeMap<String,String>();
                parameters.put("mch_appid", "商户appid");
                parameters.put("mchid", "商户号");
                parameters.put("nonce_str", nonceStr);
                parameters.put("partner_trade_no", partner_trade_no);
                parameters.put("openid", openid);
                parameters.put("check_name", "NO_CHECK");
                parameters.put("amount", total_amount);
                parameters.put("spbill_create_ip", WeChatPayUtil.getLocalIP());
                parameters.put("desc", "福利红包");
                //签名
                parameters.put("sign", createSign(parameters, "商户的key"));
                data =SortedMaptoXml(parameters);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return data;
        }

    getLocalIp() 获取ip地址

        public static String getLocalIP() {   
            InetAddress addr = null;   
            try {
                addr = InetAddress.getLocalHost();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }         
            byte[] ipAddr = addr.getAddress();   
            String ipAddrStr = "";   
            for (int i = 0; i < ipAddr.length; i++) {   
                if (i > 0) {   
                    ipAddrStr += ".";   
                }   
                ipAddrStr += ipAddr[i] & 0xFF;   
            }   
            return ipAddrStr;   
        } 

    createSign() 签名算法

        /**
         * @Title: createSign
         * @Description: 签名算法,创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
         * 参照:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3
         */
        public static String createSign(SortedMap<String, String> packageParams, String AppKey) {
            StringBuffer sb = new StringBuffer();
            Set es = packageParams.entrySet();
            Iterator it = es.iterator();
            while (it.hasNext()) {
                Map.Entry entry = (Map.Entry) it.next();
                String k = (String) entry.getKey();
                String v = (String) entry.getValue();
                if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
                    sb.append(k + "=" + v + "&");
                }
            }
            sb.append("key=" + AppKey);
            String sign = MD5Util.MD5Encode(sb.toString(), "UTF-8").toUpperCase();
            return sign;
        }

    MD5Encode() 常见md5摘要

        public static String MD5Encode(String origin, String charsetname) {  
               String resultString = null;  
            try {  
                resultString = new String(origin);  
                MessageDigest md = MessageDigest.getInstance("MD5");  
                if (charsetname == null || "".equals(charsetname))  
                    resultString = byteArrayToHexString(md.digest(resultString  
                            .getBytes()));  
                else  
                    resultString = byteArrayToHexString(md.digest(resultString  
                            .getBytes(charsetname)));  
            } catch (Exception exception) {  
            }  
            return resultString;  
        }

    请求值转换为xml格式 SortedMap转xml

    private static String SortedMaptoXml(SortedMap<String,String> params) {
            StringBuilder sb = new StringBuilder();
            Set es = params.entrySet();
            Iterator it = es.iterator();
            sb.append("<xml>\n");
            while(it.hasNext()) {
                Map.Entry entry = (Map.Entry)it.next();
                String k = (String)entry.getKey();
                Object v = entry.getValue();
                sb.append("<"+k+">");
                sb.append(v);
                sb.append("</"+k+">\n");
            }
            sb.append("</xml>");
            return sb.toString();
        }

    上面的就是整个的逻辑,需要的方法都在这里了,配置好了运行肯定是没问题的,测试的效果如下:

    随笔记录一下,如果有问题请留言

    展开全文
  • 微信企业付款到个人的PHP实现代码,供大家参考,具体内容如下企业付款实现企业向个人付款,实现付款到用户零钱。项目实现了企业付款到个人和企业付款个人账单查询。代码包括签名实现,双向证书验证,付款功能等支付...
  • 微信官方提供了微信企业账户付款到微信个人零钱接口,提供企业向用户付款的功能,支持企业通过API接口付款,或通过微信支付商户平台网页功能操作付款。该接口并不是直接所有的商户都拥有,企业要开启必须满足以下两...
  • 微信企业付款到个人的php实现代码,供大家参考,具体内容如下企业付款实现企业向个人付款,实现付款到用户零钱。项目实现了企业付款到个人和企业付款个人账单查询。代码包括签名实现,双向证书验证,付款功能等支付...
  • 微信规定使用条件 开通微信支付满3个月 连续一个月有流水等 具体查看微信官方文档 才能商户后台开通付款到零钱业务
  • java实现微信企业付款到个人账户

    万次阅读 热门讨论 2018-07-26 10:44:22
    微信官方提供了微信企业账户付款到微信个人零钱接口,提供企业向用户付款的功能,支持企业通过API接口付款,或通过微信支付商户平台网页功能操作付款。该接口并不是直接所有的商户都拥有,企业要开启必须满足以下两...
  • 5001002testso40iz98I8P5DRdMpOqYK/SOWdDhW8fQhlCQEuxV//LLvRZs51B4z8yeIe3X7aYyRdJGdYy18RLpJAZEYrZ9y981pB55aU9ZqT1So7Ypc1URahkLAOggUk/nKur750Lei6D0QQ1Q/B1aiYHA+IPwZH1YEjsIra9tvY7LjYgBjUsEnWx51piaL/Bv4gLvK...
  • 首先说一下微信支付已上线企业付款至银行卡功能。商户可以将商户号余额付款至指定的收款银行账户。通过指定收款银行账户户名、卡号,以及收款银行信息即可实现付款。但是功能目前为灰度开放,已灰度新资金流直连普通...
  • https://blog.csdn.net/daotiao0199/article/details/85319451?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-6&utm_source=distribute.pc_relevant.none-task-blog-BlogComm...

空空如也

空空如也

1 2 3 4
收藏数 62
精华内容 24
关键字:

java实现微信企业付款

java 订阅