参考网上博客:https://blog.csdn.net/shaomiaojava/article/details/50562550
import java.io.*;
import java.math.BigDecimal;
import java.security.KeyStore;
import java.util.Map;
import java.util.UUID;import javax.net.ssl.SSLContext;import com.dingyi.common.base.CommonConstant;
import com.dingyi.common.model.member.PlatformWeixinCheckTransfer;
import com.dingyi.common.model.member.PlatformWeixinMoneyRecord;
import com.dingyi.common.model.member.PlatformWeixinTransfer;
import com.dingyi.common.util.MD5Util;
import com.dingyi.common.util.XMLUtil;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;@Component
public class RedPacketUtil {@Value("${weixin.mch_appid}")private String APPID;@Value("${weixin.mchid}")private String partnerId; //商户号@Value("${weixin.mchkey}")private String partnerKey; //支付key@Autowired
    private XMLUtil xmlUtil;@Autowired
    private AlipayUtil alipayUtil;/*进行付款*/
    public Map<String, String> sendRed(PlatformWeixinMoneyRecord record) {PlatformWeixinTransfer transfers = new PlatformWeixinTransfer();//把以元为单位的金额改成以分为单位
        BigDecimal total = record.getAmount();int amount = total.multiply(new BigDecimal("100")).intValue();String nonce = UUID.randomUUID().toString().substring(0, 30);String partnerTradeNo = alipayUtil.getTradeNo(CommonConstant.WEIXIN_REDPACKET);//生成唯一订单号,可以用随机数+时间戳替代transfers.setMch_appid(APPID);// 自己的公众账号
        transfers.setMchid(partnerId);//自己的 商户号
        transfers.setNonce_str(nonce);// 随机字符串
        transfers.setOpenid(record.getOpenid());// 用户openId
        transfers.setCheck_name("NO_CHECK");// 校验用户姓名选项
        transfers.setAmount(amount);// 付款金额
        transfers.setDesc(record.getDesc());// 企业付款描述信息
        transfers.setSpbill_create_ip("116.62.61.25");// 调用接口的机器Ip地址
        transfers.setPartner_trade_no(partnerTradeNo);// 商户订单号
        String sign = createSendRedPackOrderSign(transfers);transfers.setSign(sign);// 签名

        xmlUtil.xstream().alias("xml", transfers.getClass());String xml = xmlUtil.xstream().toXML(transfers);String sendEedPackUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";String response = ssl(sendEedPackUrl, xml);Map<String, String> responseMap = null;try {responseMap = xmlUtil.parseXml(response);} catch (Exception e) {e.printStackTrace();}String return_msg = responseMap.get("return_msg");System.out.println(return_msg);return  responseMap;}/* 查询付款结果*/
    public Map<String, String> checkSuccess(PlatformWeixinMoneyRecord record) {PlatformWeixinCheckTransfer checkTransfer = new PlatformWeixinCheckTransfer();String nonce = UUID.randomUUID().toString().substring(0, 30);checkTransfer.setAppid(APPID);// 自己的公众账号
        checkTransfer.setMch_id(partnerId);//自己的 商户号
        checkTransfer.setNonce_str(nonce);// 随机字符串
        checkTransfer.setPartner_trade_no(record.getPartnerTradeNo());// 商户订单号
        String sign = createCheckOrderSign(checkTransfer);checkTransfer.setSign(sign);// 签名

        xmlUtil.xstream().alias("xml", checkTransfer.getClass());String xml = xmlUtil.xstream().toXML(checkTransfer);System.out.println(xml);String sendEedPackUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo";String response = ssl(sendEedPackUrl, xml);Map<String, String> responseMap = null;try {responseMap = xmlUtil.parseXml(response);} catch (Exception e) {e.printStackTrace();}String return_msg = responseMap.get("return_msg");System.out.println(return_msg);return  responseMap;}/*查询付款结果的签名*/
    private String createCheckOrderSign(PlatformWeixinCheckTransfer checkTransfer) {StringBuffer sign = new StringBuffer();sign.append("appid=").append(checkTransfer.getAppid());sign.append("&mch_id=").append(checkTransfer.getMch_id());sign.append("&nonce_str=").append(checkTransfer.getNonce_str());sign.append("&partner_trade_no=").append(checkTransfer.getPartner_trade_no());sign.append("&key=").append(partnerKey);System.out.println(sign.toString());return   MD5Util.MD5Encode(sign.toString(), null).toUpperCase();}/*付款的签名*/
    public String createSendRedPackOrderSign(PlatformWeixinTransfer transfers){StringBuffer sign = new StringBuffer();sign.append("amount=").append(transfers.getAmount());sign.append("&check_name=").append(transfers.getCheck_name());sign.append("&desc=").append(transfers.getDesc());sign.append("&mch_appid=").append(transfers.getMch_appid());sign.append("&mchid=").append(transfers.getMchid());sign.append("&nonce_str=").append(transfers.getNonce_str());sign.append("&openid=").append(transfers.getOpenid());sign.append("&partner_trade_no=").append(transfers.getPartner_trade_no());sign.append("&spbill_create_ip=").append(transfers.getSpbill_create_ip());sign.append("&key=").append(partnerKey);System.out.println(sign.toString());return   MD5Util.MD5Encode(sign.toString(), null).toUpperCase();}private String ssl(String url,String data){StringBuffer message = new StringBuffer();try {KeyStore keyStore  = KeyStore.getInstance("PKCS12");ClassPathResource classPathResource = new ClassPathResource("apiclient_cert.p12");InputStream instream = classPathResource.getInputStream();keyStore.load(instream, partnerId.toCharArray());// Trust own CA and all self-signed certs
            SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, partnerId.toCharArray()).build();// Allow TLSv1 protocol only
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,new String[] { "TLSv1" },null,SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();HttpPost httpost = new HttpPost(url);httpost.addHeader("Connection", "keep-alive");httpost.addHeader("Accept", "*/*");httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");httpost.addHeader("Host", "api.mch.weixin.qq.com");httpost.addHeader("X-Requested-With", "XMLHttpRequest");httpost.addHeader("Cache-Control", "max-age=0");httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");httpost.setEntity(new StringEntity(data, "UTF-8"));//System.out.println("executing request" + httpost.getRequestLine());

            CloseableHttpResponse response = httpclient.execute(httpost);try {HttpEntity entity = response.getEntity();//System.out.println("----------------------------------------");
                //System.out.println(response.getStatusLine());
                if (entity != null) {//System.out.println("Response content length: " + entity.getContentLength());
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"));String text;while ((text = bufferedReader.readLine()) != null) {message.append(text);}}EntityUtils.consume(entity);} catch (IOException e) {e.printStackTrace();} finally {response.close();}} catch (Exception e1) {e1.printStackTrace();}return message.toString();}}
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.stereotype.Component;import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.naming.NoNameCoder;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
import com.thoughtworks.xstream.io.xml.XppDriver;/**
 * XML工具包
 *
 * XMLUtil
 *
 * @author zdl
 * @version 1.0.0
 *
 */
@Component
public class XMLUtil {/**
     * 解析字符串(XML)
     *
     * @return
     * @throws Exception
     */
    @SuppressWarnings("unchecked")public Map<String, String> parseXml(String msg) throws Exception {// 将解析结果存储在HashMap中
        Map<String, String> map = new HashMap<String, String>();// 从request中取得输入流
        InputStream inputStream = new ByteArrayInputStream(msg.getBytes("UTF-8"));// 读取输入流
        SAXReader reader = new SAXReader();Document document = reader.read(inputStream);// 得到xml根元素
        Element root = document.getRootElement();// 得到根元素的所有子节点
        List<Element> elementList = root.elements();// 遍历所有子节点
        for (Element e : elementList)map.put(e.getName(), e.getText());// 释放资源
        inputStream.close();inputStream = null;return map;}/**
     * 扩展xstream,使其支持CDATA块
     */
    private XStream xstream = new XStream(new XppDriver(new NoNameCoder()) {@Override
        public HierarchicalStreamWriter createWriter(Writer out) {return new PrettyPrintWriter(out) {// 对所有xml节点的转换都增加CDATA标记
                boolean cdata = true;@Override
                @SuppressWarnings("rawtypes")public void startNode(String name, Class clazz) {super.startNode(name, clazz);}@Override
                public String encodeNode(String name) {return name;}@Override
                protected void writeText(QuickWriter writer, String text) {if (cdata) {writer.write("<![CDATA[");writer.write(text);writer.write("]]>");} else {writer.write(text);}}};}});private XStream inclueUnderlineXstream = new XStream(new DomDriver(null,new XmlFriendlyNameCoder("_-", "_")));public XStream getXstreamInclueUnderline() {return inclueUnderlineXstream;}public XStream xstream() {return xstream;}}

注意事项:

1. 小程序需要开通微信支付,此处appid既为小程序appid。

2.商户号,是商户平台中的商户号。在小程序开通微信支付的时候,这些信息会被以邮件的形式发送给用户

3.支付key和安全证书(“apiclient_cert.p12”)都是在商户平台-账户中心-API安全 中设置和获取

【微信小程序】企业付款接口相关推荐

  1. 微信小程序支付-付款(Java后台)

    微信小程序支付-付款(Java后台) 一.概述 接触微信小程序支付有一段时间,趁着项目上线空闲期,来总结一下付款.退款.提现到银行卡.查询流水等步骤过程,涉及到的知识,以及编程过程中需要注意的问题. ...

  2. 微信小程序之获取接口数据展示

    上篇说到获取编辑框文本,没看过去看看. 本片介绍简单的接口数据获取,并且展示,采取模拟数据,拉取数据方式方法.文章最后附上DEMO 本篇暂未考虑美化问题,只看功能.如图: 一.简单介绍 1> w ...

  3. 微信小程序调用支付接口支付(tp5、小程序)

    微信小程序调用支付接口支付 今天记录一下学习的小程序调用微信支付接口 一.先理清一下调起微信支付的整个流程. 1.就是先调用微信的支付统一下单api获取到prepay_id 2.然后后端再将这个pre ...

  4. 微信小程序接入第三方接口

    史上最全,最简单微信小程序实现第三方接口 本文以第三方(聚合新闻头条)接口为例. 聚合接口基本上都是免费的.例如,天气查询,新闻.笑话,万年历等. 1.先去聚合官网注册账号 ,然后申请新闻头条接口.如 ...

  5. 微信小程序链接后台接口,进行数据交互

    微信小程序链接后台接口,进行数据交互 新手学微信小程序,设计页面还可以,有没有让进行数据交互的时候就不知道怎么弄了,下面就记录一下我是怎么进行交互的 1.登陆微信小程序平台,进入首页,点击开发设置 2 ...

  6. 微信小程序 直播商品接口 上传图片 300006 goods img upload fail

    微信小程序 直播商品接口 上传图片 300006 goods img upload fail 官方文档:https://developers.weixin.qq.com/miniprogram/dev ...

  7. 微信小程序直播状态接口如何获取

    现如今,小程序直播非常的红火,越来越多的商家开通了微信小程序直播,但是在直播的过程中,偶尔会出现一些小问题,如禁播,异常状态等等,下面小编就来介绍一下微信小程序直播状态接口如何获取. 一.微信小程序直 ...

  8. 微信小程序快递java_java调用微信小程序统一下单接口

    java调用微信小程序统一下单接口 今天项目中对接微信支付这一块,记录一下 这是对接微信支付的开发文档地址 微信支付流程 流程分析: 我们可以看到,前端人员只用给我们一个code,我们通过code去获 ...

  9. 微信小程序访问WebService接口返回500错误解决过程

    背景:     新手,第一次尝试使用微信小程序访问WebService接口.     使用Microsoft Visual Studio新建了一个WebService项目,发布后,按照常规流程部署到I ...

  10. 微信小程序wx.request接口

    微信小程序wx.request接口 wx.request是小程序客户端与服务器端交互的接口 HTTPS 请求 一个微信小程序,只能同时(同时不能大于5个)有5个网络请求 wx.request(OBJE ...

最新文章

  1. 蛋白Ramachandran(拉氏图、拉曼图)的绘制和可视化
  2. mlxtend对sklearn进行扩展
  3. Flask+gunicorn部署HTTP服务
  4. 【深度学习问题整理】
  5. CentOS环境搭建
  6. JS 实现2+2=5的代码 实现原理解析
  7. 戏说云栖,如果这些名人参加云栖大会。。。
  8. angular学习笔记(六)-非入侵式javascript
  9. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法...
  10. 以太网帧分析与IP报文结构分析(二)
  11. 如何用计算机管理员权限,怎么打开管理员权限,电脑怎么用管理员权限
  12. innodb system table
  13. deepIn 、 DDE 系统桌面黑屏解决方案
  14. 英文名称来源 男英文名 女英文名
  15. 理解Java虚拟机(七)低延迟垃圾收集器-Shenandoah
  16. ubuntu 17.10安装64位Chrome浏览器
  17. UE4 创建暂停和结束游戏UI
  18. Tracert 抓包测试
  19. 【封神台】无WAF的SQL注入
  20. human3.6源文件处理 简单解析

热门文章

  1. 如何解决苹果公司开发者账号重设手机号的问题
  2. ClickHouse快速安装-可视化工具连接-创建第一个ck库表(一)
  3. hdu2072单词数(思维)
  4. python如何回退_Pycharm技巧之代码跳转该如何回退
  5. 治理通胀首先要控制货币发行
  6. 爬虫学习笔记(用python爬取东方财富网实验)
  7. 中考计算机易错知识点,【中考备考】易错知识点归类
  8. 高德地图定位获取当前地址城市街道等详细信息(全部代码)
  9. 自然语言处理训练营NLP--笔记
  10. 处女座与小姐姐(三)