【微信小程序】企业付款接口
参考网上博客: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安全 中设置和获取
【微信小程序】企业付款接口相关推荐
- 微信小程序支付-付款(Java后台)
微信小程序支付-付款(Java后台) 一.概述 接触微信小程序支付有一段时间,趁着项目上线空闲期,来总结一下付款.退款.提现到银行卡.查询流水等步骤过程,涉及到的知识,以及编程过程中需要注意的问题. ...
- 微信小程序之获取接口数据展示
上篇说到获取编辑框文本,没看过去看看. 本片介绍简单的接口数据获取,并且展示,采取模拟数据,拉取数据方式方法.文章最后附上DEMO 本篇暂未考虑美化问题,只看功能.如图: 一.简单介绍 1> w ...
- 微信小程序调用支付接口支付(tp5、小程序)
微信小程序调用支付接口支付 今天记录一下学习的小程序调用微信支付接口 一.先理清一下调起微信支付的整个流程. 1.就是先调用微信的支付统一下单api获取到prepay_id 2.然后后端再将这个pre ...
- 微信小程序接入第三方接口
史上最全,最简单微信小程序实现第三方接口 本文以第三方(聚合新闻头条)接口为例. 聚合接口基本上都是免费的.例如,天气查询,新闻.笑话,万年历等. 1.先去聚合官网注册账号 ,然后申请新闻头条接口.如 ...
- 微信小程序链接后台接口,进行数据交互
微信小程序链接后台接口,进行数据交互 新手学微信小程序,设计页面还可以,有没有让进行数据交互的时候就不知道怎么弄了,下面就记录一下我是怎么进行交互的 1.登陆微信小程序平台,进入首页,点击开发设置 2 ...
- 微信小程序 直播商品接口 上传图片 300006 goods img upload fail
微信小程序 直播商品接口 上传图片 300006 goods img upload fail 官方文档:https://developers.weixin.qq.com/miniprogram/dev ...
- 微信小程序直播状态接口如何获取
现如今,小程序直播非常的红火,越来越多的商家开通了微信小程序直播,但是在直播的过程中,偶尔会出现一些小问题,如禁播,异常状态等等,下面小编就来介绍一下微信小程序直播状态接口如何获取. 一.微信小程序直 ...
- 微信小程序快递java_java调用微信小程序统一下单接口
java调用微信小程序统一下单接口 今天项目中对接微信支付这一块,记录一下 这是对接微信支付的开发文档地址 微信支付流程 流程分析: 我们可以看到,前端人员只用给我们一个code,我们通过code去获 ...
- 微信小程序访问WebService接口返回500错误解决过程
背景: 新手,第一次尝试使用微信小程序访问WebService接口. 使用Microsoft Visual Studio新建了一个WebService项目,发布后,按照常规流程部署到I ...
- 微信小程序wx.request接口
微信小程序wx.request接口 wx.request是小程序客户端与服务器端交互的接口 HTTPS 请求 一个微信小程序,只能同时(同时不能大于5个)有5个网络请求 wx.request(OBJE ...
最新文章
- 蛋白Ramachandran(拉氏图、拉曼图)的绘制和可视化
- mlxtend对sklearn进行扩展
- Flask+gunicorn部署HTTP服务
- 【深度学习问题整理】
- CentOS环境搭建
- JS 实现2+2=5的代码 实现原理解析
- 戏说云栖,如果这些名人参加云栖大会。。。
- angular学习笔记(六)-非入侵式javascript
- Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法...
- 以太网帧分析与IP报文结构分析(二)
- 如何用计算机管理员权限,怎么打开管理员权限,电脑怎么用管理员权限
- innodb system table
- deepIn 、 DDE 系统桌面黑屏解决方案
- 英文名称来源 男英文名 女英文名
- 理解Java虚拟机(七)低延迟垃圾收集器-Shenandoah
- ubuntu 17.10安装64位Chrome浏览器
- UE4 创建暂停和结束游戏UI
- Tracert 抓包测试
- 【封神台】无WAF的SQL注入
- human3.6源文件处理 简单解析