1. 程式人生 > >java微信-企業付款api

java微信-企業付款api

最近有弄服務號的現金紅包和企業付款,和微信支付 弄完之後發現其實這些基本都差不多.

所有我這裡就把微信企業付款記錄一樣

首先  還是先看一下文件  https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2  點選開啟連結

在文件中我們可以看到,企業付款需要呼叫的url和所有引數的說明,這裡的話就需要自己去看去理解了。

如果要使用 現金紅包和企業付款 要先去開通在產品中心裡面 就要 點選進去開通就行了 ,順便填寫一下機器ip地址

之後我要提一下的是機器ip是外網ip,如果是在本地測試的就要注意一下  然後保持一致就行了 


這裡的話還有個最主要的證書需要下載,我們可以下載到D盤cert目錄下 D:/cert      這個證書的下載 只要登陸微信商戶平臺 API安全  就可以了 看自己是什麼語言就下載什麼證書,這裡文件有說明 


一些微信的基本配置我都寫在了 #weixin mp config

appID=xxxx
appsecret=xxxx
token=xxxx
#商戶號
partnerId=xxx
#商戶支付金鑰
partnerKey=xxxx
#微信統一支付介面
payUrl=https://api.mch.weixin.qq.com/pay/unifiedorder
#支付結果通知的回撥地址
payCallBack= http://域名/wechatPay/wechat_notify
queryOrderUrl=https://api.mch.weixin.qq.com/pay/orderquery

前面的準備工作都ok 之後就是寫程式碼了

建一個微信需要的企業付款引數 transfers 類 

public class Transfers {
	
	private String mch_appid;// 公眾賬號
	private String mchid;// 商戶號
	private String nonce_str;// 隨機字串
	private String sign;// 簽名
	private String partner_trade_no;// 商戶訂單號
	private String openid;// 使用者openid

	//校驗使用者姓名選項  NO_CHECK:不校驗真實姓名 
	private String check_name;
	private int amount;// 付款金額
	private String desc;// 企業付款描述資訊
	private String spbill_create_ip;// 呼叫介面的機器Ip地址
	
	public String getMch_appid() {
		return mch_appid;
	}
	public void setMch_appid(String mch_appid) {
		this.mch_appid = mch_appid;
	}
	public String getMchid() {
		return mchid;
	}
	public void setMchid(String mchid) {
		this.mchid = mchid;
	}
	public String getNonce_str() {
		return nonce_str;
	}
	public void setNonce_str(String nonce_str) {
		this.nonce_str = nonce_str;
	}
	public String getSign() {
		return sign;
	}
	public void setSign(String sign) {
		this.sign = sign;
	}
	public String getPartner_trade_no() {
		return partner_trade_no;
	}
	public void setPartner_trade_no(String partner_trade_no) {
		this.partner_trade_no = partner_trade_no;
	}
	public String getOpenid() {
		return openid;
	}
	public void setOpenid(String openid) {
		this.openid = openid;
	}
	public String getCheck_name() {
		return check_name;
	}
	public void setCheck_name(String check_name) {
		this.check_name = check_name;
	}
	public int getAmount() {
		return amount;
	}
	public void setAmount(int amount) {
		this.amount = amount;
	}
	public String getDesc() {
		return desc;
	}
	public void setDesc(String desc) {
		this.desc = desc;
	}
	public String getSpbill_create_ip() {
		return spbill_create_ip;
	}
	public void setSpbill_create_ip(String spbill_create_ip) {
		this.spbill_create_ip = spbill_create_ip;
	}
	
    

}

之後就是給 這些引數賦值 

@Autowired
	private XMLUtil xmlUtil;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.security.KeyStore;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;

import javax.net.ssl.SSLContext;

import org.apache.commons.codec.digest.DigestUtils;
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.stereotype.Service;

上面是匯入的包 下面就是給引數配值了

private void redPackets(Integer withdrawId, String openId) throws Exception {
		int total=100;
		int amount = (int) (total*100);
		
		Transfers transfers=new Transfers();
		String nonce = UUID.randomUUID().toString().substring(0, 30);
		
		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
		String time = df.format(new Date());
		Random ne=new Random();
		int guid=ne.nextInt(9999-1000+1)+1000;
		
		transfers.setMch_appid(APPID);// 自己的公眾賬號
		transfers.setMchid(partnerId);//自己的 商戶號
		transfers.setNonce_str(nonce);// 隨機字串
		transfers.setOpenid(openId);// 使用者openId
		transfers.setCheck_name("NO_CHECK");// 校驗使用者姓名選項
		transfers.setAmount(amount);// 付款金額
		transfers.setDesc("微信企業付款");// 企業付款描述資訊
		transfers.setSpbill_create_ip("120.236.82.202");// 呼叫介面的機器Ip地址
		transfers.setPartner_trade_no(WxConfig.partnerId+time+guid);// 商戶訂單號
		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 = xmlUtil.parseXml(response);
		
		String return_msg = responseMap.get("return_msg");
		System.out.println(return_msg);
	}


這裡就是根據上面的內容生成簽名 sign 這裡文件有說明 這裡要注意的是去,簽名要按照 ASCII碼從小到大排序(字典序)
public String createSendRedPackOrderSign(Transfers transfers){
		
        StringBuffer sign = new StringBuffer();
        sign.append("mch_appid=").append(transfers.getMch_appid());
        sign.append("&mchid=").append(transfers.getMchid());
        sign.append("&nonce_str=").append(transfers.getNonce_str());
        sign.append("&partner_trade_no=").append(transfers.getPartner_trade_no());
        sign.append("&openid=").append(transfers.getOpenid());
        sign.append("&check_name=").append(transfers.getCheck_name());
        sign.append("&amount=").append(transfers.getAmount());
        sign.append("&desc=").append(transfers.getDesc());
        sign.append("&spbill_create_ip=").append(transfers.getSpbill_create_ip());
        sign.append("&key=").append(WxConfig.partnerKey);
       
        return  DigestUtils.md5Hex(sign.toString()).toUpperCase();
    }

然後就是xmlutil類了 我是在網上大神部落格找的

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)
	 * 
	 * @param request
	 * @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;
	}

}
如何就是ssl方法 
private String ssl(String url,String data){
        StringBuffer message = new StringBuffer();
        try {
            KeyStore keyStore  = KeyStore.getInstance("PKCS12");
            FileInputStream instream = new FileInputStream(new File("D:/cert/apiclient_cert.p12"));
            keyStore.load(instream, WxConfig.partnerId.toCharArray());
            // Trust own CA and all self-signed certs
            SSLContext sslcontext = SSLContexts.custom()
                    .loadKeyMaterial(keyStore, WxConfig.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();
    }
	

如果還有什麼不懂的可以去看 這位大師的部落格,我也是根據他的來寫的 ,順便說一下是java微信紅包的!   

相關推薦

java-企業付款api

最近有弄服務號的現金紅包和企業付款,和微信支付 弄完之後發現其實這些基本都差不多. 所有我這裡就把微信企業付款記錄一樣 首先  還是先看一下文件  https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapt

java實現企業付款到個人賬戶

微信官方提供了微信企業賬戶付款到微信個人零錢介面,提供企業向用戶付款的功能,支援企業通過API介面付款,或通過微信支付商戶平臺網頁功能操作付款。該介面並不是直接所有的商戶都擁有,企業要開啟必須滿足以下兩個條件: 1、商戶號已入駐90日 2、商戶號有30天連續正常交易

thinkphp 支付 thinkphp 企業付款

證書 library 代碼 版本 一個 文件 類庫 acc 微信 前面已經跑通了微信支付的流程,接下來吧微信支付和微信企業付款接入到thinkphp中,版本是3.2 把微信支付類、企業付款類整合到一起放到第三方類庫,這裏我把微信支付幫助類和企業付款類放到同一個文件了: 把P

企業付款到個人錢包引發的坑之反思~

微信企業付款企業付款到個人錢包也就是用戶在微信公眾平臺提現可以直接打入提現者微信的錢包!但要滿足:1)企業開通微信支付90天2)連續30天有交易才能開通此功能今天有幸能開發此功能,我只能說我又漲知識了!!!在我編程的這條道路上我又多見到了一些坑!下面就給大家講一下今天遇到的兩個坑!1)CA證書引入問題,開發過

企業付款到個人錢包引發的坑之反思~!

結果 copyright cxf 網上 tps numeric curl 能開 微信公眾平臺 企業付款到個人錢包也就是用戶在微信公眾平臺提現可以直接打入提現者微信的錢包!但要滿足: 1)企業開通微信支付90天 2)連續30天有交易才能開通此功能 今天有幸能開發此

PHP 實現企業付款到使用者零錢

一.實現該功能目的     這幾天在小程式裡要實現使用者從系統中提現到零錢的功能,查了一下文件可以使用 企業付款到使用者零錢 來實現;  官方文件:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapt

關於企業付款到零錢X509Certificate2讀取證書資訊,釋出到伺服器訪問不到的解決方案

  最近做了一個通過呼叫微信企業付款到使用者零錢的功能,真的挺奇怪的,在我本地除錯的時候都沒有問題,但是當我釋出到服務上的時候卻一直無法讀取到我的證書資訊。讀取的程式碼如下,使用的是微信官方文件提供的X509Certificate2讀取證書的方法: string path = AppDom

php公眾號開發之企業付款給個人

/*微信企業付款給個人*/ <!--具體細節參考微信支付開發文件--> <!--引數 $openid個人openid,$re_user_name個人真實姓名,$amount付款金額,$partner_trade_no商戶訂單號,$desc描述--> &

企業付款到餘額 開發 教程

開發流程概述 開通企業付款到餘額功能 去商戶後臺獲取商戶賬號appid、商戶號、證書 生成簽名 生成請求XML 向微信請求付款 付款結果分析儲存 1、開通企業付款到餘額功能 可以參照官方教程 2、獲取商戶相關資訊 方法自行百度 3、生成簽名和請求XML 生成簽名的官方教

關於企業付款到零錢

近日,在開發“微信企業付款到零錢”的功能。之前有過微信開發的經驗,但是第一次接觸“付款到零錢“這一塊的業務,查詢了很多的部落格資料以及走了很多的彎路。也發現“企業付款到零錢”分享的部落格並不多。特地寫了該部落格,希望對你們有幫助。個人淺薄的見解 【稍微提一下:】上一篇部落格

企業付款到零錢

官方文件地址:點選跳轉 企業付款為企業提供付款至使用者零錢的能力,支援通過API介面付款,或通過微信支付商戶平臺(pay.weixin.qq.com)網頁操作付款。 使用條件   1、商戶號(或同主體其他非服務商商戶號)已入駐90日   2、商

企業付款到零錢(提現)

由於專案中要用到微信提現,參考網上程式碼和官方文件寫了提現的工具類 用到的相關類庫 dom4j commons-lang3 httpclient-4.4.1 具體相關流程可以看微信企業付款到零錢的開發文件 MD5工具類 package com.kk

php企業付款到個人零錢

1.基本配置 //公眾賬號appid $data["mch_appid"] = 'appid'; //商戶號 $data["mchid"] = ''; //隨機字串 $data["nonce_str"] = '

——企業付款到個人銀行卡。

1、 呼叫獲取RSA公鑰API獲取RSA公鑰,落地成本地檔案,假設為public.pem2、 確定public.pem檔案的存放路徑,同時修改程式碼中檔案的輸入路徑,載入RSA公鑰3、 用標準的RSA加密庫對敏感資訊進行加密,選擇RSA_PKCS1_OAEP_PADDING填充模式      (eg:Java

關於企業付款(提現)返回錯誤資訊的除錯

一、證書出錯         一般是因為證書路徑問題。內有寫對; 二、簽名錯誤         1、在各個引數都正確的情況下              使用微信的簽名檢查工具 http://mch.weixin.qq.com/wiki/tools/signverify/,

公眾號開發---企業付款給個人

   以下有關微信支付中企業付款的介紹及編碼參考自微信支付開發文件,網址:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1,如圖所示      企業付款,提供企業向用戶付款的功能

java 公眾號支付demo 企業支付到個人使用者、公眾號企業付款到個人零錢,提現到零錢

微信提現到零錢(微信內部交易,不需要手續費)價格格式錯誤:可能是價格經過計算後.doubleValue了一下 最後價格是 200.00 企業付款簽名錯誤:和支付的時候簽名的引數有出入(搞了半天,最後到看了一段php程式碼後做了一下調整。OK了) 參考PHP部落格:http:

企業號回調模式配置解說 Java Servlet+Struts2版本號 echostr校驗失敗解決

del com crypt atp org use ase http err 微信企業號回調模式配置解說 Java Servlet+Struts2版本號

企業號開發原始碼Java編寫,懶人開發一鍵式部署專案,WeChatEnterprise框架你值得擁有

幾年前無意間接觸了微信公眾平臺開發,這個在當時還是一個新鮮的事物,但現在已經很流行了,發展的型別也特別的多,比如訂閱號、服務號、小程式、微信企業號等,這些產品在人們日常的生活與開發中,都是非常常見的。 當時的博主也順應時代的變化,去嘗試著開發公眾平臺,到目前為止也算得上是得

request請求攜帶證書,如:企業零錢付款

    const Promise = require('bluebird') const request = Promise.promisifyAll(require('request')) const wxTransferResult = await request.postA