java微信公眾號(hào)企業(yè)付款開(kāi)發(fā)
本文為大家分享了java微信公眾號(hào)企業(yè)付款的開(kāi)發(fā)代碼,供大家參考,具體內(nèi)容如下
詳情參照微信開(kāi)發(fā)者文檔 企業(yè)付款文檔
java代碼 定義所傳遞的參數(shù)
@RequestMapping(value = "zhifu", method = RequestMethod.GET)
public @ResponseBody String getWeixinOpenid(String code,
HttpServletRequest request)
{
// 訂單號(hào) 自定義 生成32位uuid
String partner_trade_no = UUIDGenerator.getUUID();
// 隨機(jī)數(shù)
String nonce_str = UUIDGenerator.getUUID();
// 轉(zhuǎn)賬金額(分為單位)1-200
int jine = 100;
// 企業(yè)付款信息
String desc = "轉(zhuǎn)賬";
// ip地址
String spbill_create_ip = "xx.xx.xx";
// re_user_name
String re_user_name = "xx";
String check_name = CheckName.NO_CHECK.toString();
String zfpath = "D:/apiclient_cert.p12";
try
{
// 獲取openid
String openid = WeChatUtil.getByOpenid(appid, secret, code);
// 付款
boolean flag = WeChatUtil.enterprisePayment(openid, appid, mchid,
nonce_str, partner_trade_no, re_user_name, jine, desc,
spbill_create_ip, check_name, key, zfpath);
// 成功
if (flag)
{
return "SUCCESS";
}
}
catch (Exception e)
{
System.err.println(e.getStackTrace());
}
return "FAIL";
}
獲取關(guān)注本公眾號(hào)用戶(hù)唯一標(biāo)示 獲取openid
java代碼 獲取openid 靜態(tài)方法
/**
* 獲取openid
*
* @description
* @param appid
* @param secret
* @param code
* @return
* @author shaomiao
*/
public static String getByOpenid(String appid, String secret, String code)
{
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ appid + "&secret=" + secret + "&code=" + code
+ "&grant_type=authorization_code";
String jsonstring = WeChatUtil.getJsonString(url);
JSONObject json1 = JSONObject.parseObject(jsonstring);
String openid = json1.get("openid").toString();
return openid;
}
企業(yè)付款的調(diào)用公共方法
java代碼
post提交 xml參數(shù)
解析回調(diào)的xml
/**
* 企業(yè)付款
*
* @description
* @param openid
* @param appid
* @param mchid 商戶(hù)id
* @param nonce_str
* @param partner_trade_no
* @param re_user_name
* @param jine
* @param desc
* @param spbill_create_ip
* @param check_name
* @return
* @author Jobs
* @throws IOException
* @throws ClientProtocolException
*/
public static boolean enterprisePayment(String openid, String appid,
String mchid, String nonce_str, String partner_trade_no,
String re_user_name, int jine, String desc, String spbill_create_ip,
String check_name, String key, String zfpath) throws Exception
{
boolean getSuccess = true;
if (null != openid)
{
// zf
Map<String, String> params_map = new LinkedHashMap<String, String>();
StringBuffer param = new StringBuffer();
// appid
param.append("mch_appid=" + appid);
// 商戶(hù)id
param.append("&mchid=" + mchid);
// 隨機(jī)字符串
// param.append("&nonce_str="
// + ZifwUtil.string2MD5(new Date().getTime() + ""));
param.append("&nonce_str=" + nonce_str);
// 訂單號(hào)自定義
param.append("&partner_trade_no=" + partner_trade_no);
param.append("&openid=" + openid);
// 校驗(yàn)用戶(hù)姓名選項(xiàng)
/**
* NO_CHECK:不校驗(yàn)真實(shí)姓名
* FORCE_CHECK:強(qiáng)校驗(yàn)真實(shí)姓名(未實(shí)名認(rèn)證的用戶(hù)會(huì)校驗(yàn)失敗,無(wú)法轉(zhuǎn)賬)
* OPTION_CHECK:針對(duì)已實(shí)名認(rèn)證的用戶(hù)才校驗(yàn)真實(shí)姓名(未實(shí)名認(rèn)證用戶(hù)不校驗(yàn),可以轉(zhuǎn)賬成功)
*/
param.append("&check_name=" + check_name);
// 收款用戶(hù)姓名
param.append("&re_user_name=" + re_user_name);
// 金額
param.append("&amount=" + jine);
// 企業(yè)付款描述信息
param.append("&desc=" + desc);
// Ip地址
param.append("&spbill_create_ip=" + spbill_create_ip);
String[] params = param.toString().split("&");
Arrays.sort(params);
param = new StringBuffer();
for (String p : params)
{
String[] value = p.split("=");
params_map.put(value[0], value[1]);
param.append(value[0] + "=" + value[1] + "&");
}
// 簽名最后
String sign = ZifwUtil.string2MD5(param.toString() + "key=" + key)
.toUpperCase();
params_map.put("sign", sign);
String reqStr = ZifwUtil.toXml(params_map);
// ZHENGSHU
CloseableHttpClient httpclient = certificateValidation(zfpath,
mchid);
HttpPost httppost = new HttpPost(
"https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers");
StringEntity myEntity = new StringEntity(reqStr, "UTF-8");
httppost.setEntity(myEntity);
System.out.println("executing request" + httppost.getRequestLine());
CloseableHttpResponse response = httpclient.execute(httppost);
System.out.println(response.getStatusLine());
HttpEntity resEntity = response.getEntity();
InputStreamReader reader = new InputStreamReader(
resEntity.getContent(), "UTF-8");
char[] buff = new char[1024];
int length = 0;
StringBuffer strhuxml = new StringBuffer();
while ((length = reader.read(buff)) != -1)
{
strhuxml.append(new String(buff, 0, length));
System.out.println(new String(buff, 0, length));
}
// httpclient.close();
httpclient.getConnectionManager().shutdown();
// String ret = ZifwUtil.post(
// "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers",
// reqStr);
// 解析傳過(guò)來(lái)的xml
Document document = DocumentHelper.parseText(strhuxml.toString());
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子節(jié)點(diǎn)
List<Element> elementList = root.elements();
String errors = "";
for (Element e : elementList)
{
// result_code業(yè)務(wù)
if ("return_code".equals(e.getName())
&& !"SUCCESS".equals(e.getText()))
{
getSuccess = false;
}
if ("result_code".equals(e.getName())
&& !"SUCCESS".equals(e.getText()))
{
getSuccess = false;
}
}
}
return getSuccess;
}
微信簽名驗(yàn)證證書(shū)
驗(yàn)證證書(shū)公共方法
/**
* 驗(yàn)證證書(shū)公共方法
*
* @description
* @param zfpath 證書(shū)的路徑
* @param mchid 商戶(hù)id
* @return
* @throws Exception
* @author Jobs
*/
// shanghuid
// 驗(yàn)證證書(shū)
@SuppressWarnings("deprecation")
public static CloseableHttpClient certificateValidation(String zfpath,
String mchid) throws Exception
{
// 指定讀取證書(shū)格式為PKCS12
KeyStore keyStore = KeyStore.getInstance("PKCS12");
// 證書(shū)地址
FileInputStream instream = new FileInputStream(new File(zfpath));
try
{
keyStore.load(instream, mchid.toCharArray());
}
finally
{
instream.close();
}
// Trust own CA and all self-signed certs
SSLContext sslcontext = SSLContexts.custom()
.loadKeyMaterial(keyStore, mchid.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();
return httpclient;
}
微信公共方法 字符串轉(zhuǎn)xml
/**
* 微信支付拼接xml
*
* @param params
* @return
*/
public static String toXml(Map<String, String> params)
{
String xml = "<xml>";
for (String key : params.keySet())
{
if ("body".equals(key) || "attach".equals(key)
|| "sign".equals(key))
{
xml += "<" + key + "><![CDATA[" + params.get(key) + "]]></"
+ key + ">";
}
else
{
xml += "<" + key + ">" + params.get(key) + "</" + key + ">";
}
}
xml += "</xml>";
return xml;
}
微信公共方法 字符串MD5
加密
用來(lái)加密簽名
/***
* MD5加碼 生成32位md5碼
*/
public static String string2MD5(String inStr)
{
StringBuffer buf = new StringBuffer();
try
{
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(inStr.getBytes("utf-8"));
byte b[] = md.digest();
int i;
for (int offset = 0; offset < b.length; offset++)
{
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
}
catch (Exception e)
{
e.printStackTrace();
}
return buf.toString();
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java版微信公眾號(hào)支付開(kāi)發(fā)全過(guò)程
- 微信公眾號(hào)開(kāi)發(fā)之設(shè)置自定義菜單實(shí)例代碼【java版】
- java微信公眾號(hào)支付開(kāi)發(fā)之現(xiàn)金紅包
- 微信公眾號(hào)開(kāi)發(fā)之回復(fù)圖文消息java代碼
- Java微信公眾號(hào)開(kāi)發(fā)之通過(guò)微信公眾號(hào)獲取用戶(hù)信息
- java微信公眾號(hào)開(kāi)發(fā)案例
- 用Java設(shè)計(jì)模式中的觀察者模式開(kāi)發(fā)微信公眾號(hào)的例子
- java微信公眾號(hào)開(kāi)發(fā)第一步 公眾號(hào)接入和access_token管理
- Java開(kāi)發(fā)微信公眾號(hào)接收和被動(dòng)回復(fù)普通消息
- java微信公眾號(hào)開(kāi)發(fā)(搭建本地測(cè)試環(huán)境)
- java開(kāi)發(fā)微信公眾號(hào)支付
- Java 微信公眾號(hào)開(kāi)發(fā)相關(guān)總結(jié)
相關(guān)文章
Java導(dǎo)入導(dǎo)出csv格式文件完整版詳解(附代碼)
在Java中你可以使用不同的庫(kù)來(lái)導(dǎo)出CSV格式的文件,這篇文章主要給大家介紹了關(guān)于Java導(dǎo)入導(dǎo)出csv格式文件的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
Springboot實(shí)現(xiàn)密碼的加密解密
這篇文章主要為大家詳細(xì)介紹了Springboot實(shí)現(xiàn)密碼的加密解密,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
SpringBoot使用FFmpeg實(shí)現(xiàn)M3U8切片轉(zhuǎn)碼播放
FFmpeg是一個(gè)開(kāi)源跨平臺(tái)的多媒體處理工具套件,它支持音頻、視頻文件的編碼、解碼、流媒體傳輸以及轉(zhuǎn)換等多種操作,本文小編給大家介紹了SpringBoot使用FFmpeg實(shí)現(xiàn)M3U8切片轉(zhuǎn)碼播放的操作,需要的朋友可以參考下2024-08-08
源碼分析Java中ThreadPoolExecutor的底層原理
這篇文章主要帶大家從源碼分析一下Java中ThreadPoolExecutor的底層原理,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下2023-05-05
Spring-boot oauth2使用RestTemplate進(jìn)行后臺(tái)自動(dòng)登錄的實(shí)現(xiàn)
這篇文章主要介紹了Spring-boot oauth2使用RestTemplate進(jìn)行后臺(tái)自動(dòng)登錄的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07

