java微信公众号企业付款开发
作者:shaomiaojava 发布时间:2023-04-07 00:21:08
标签:java,微信公众号,企业付款
本文为大家分享了java微信公众号企业付款的开发代码,供大家参考,具体内容如下
详情参照微信开发者文档 企业付款文档
java代码 定义所传递的参数
@RequestMapping(value = "zhifu", method = RequestMethod.GET)
public @ResponseBody String getWeixinOpenid(String code,
HttpServletRequest request)
{
// 订单号 自定义 生成32位uuid
String partner_trade_no = UUIDGenerator.getUUID();
// 随机数
String nonce_str = UUIDGenerator.getUUID();
// 转账金额(分为单位)1-200
int jine = 100;
// 企业付款信息
String desc = "转账";
// 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";
}
获取关注本公众号用户唯一标示 获取openid
java代码 获取openid 静态方法
/**
* 获取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;
}
企业付款的调用公共方法
java代码
post提交 xml参数
解析回调的xml
/**
* 企业付款
*
* @description
* @param openid
* @param appid
* @param mchid 商户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);
// 商户id
param.append("&mchid=" + mchid);
// 随机字符串
// param.append("&nonce_str="
// + ZifwUtil.string2MD5(new Date().getTime() + ""));
param.append("&nonce_str=" + nonce_str);
// 订单号自定义
param.append("&partner_trade_no=" + partner_trade_no);
param.append("&openid=" + openid);
// 校验用户姓名选项
/**
* NO_CHECK:不校验真实姓名
* FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)
* OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
*/
param.append("&check_name=" + check_name);
// 收款用户姓名
param.append("&re_user_name=" + re_user_name);
// 金额
param.append("&amount=" + jine);
// 企业付款描述信息
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);
// 解析传过来的xml
Document document = DocumentHelper.parseText(strhuxml.toString());
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子节点
List<Element> elementList = root.elements();
String errors = "";
for (Element e : elementList)
{
// result_code业务
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;
}
微信签名验证证书
验证证书公共方法
/**
* 验证证书公共方法
*
* @description
* @param zfpath 证书的路径
* @param mchid 商户id
* @return
* @throws Exception
* @author Jobs
*/
// shanghuid
// 验证证书
@SuppressWarnings("deprecation")
public static CloseableHttpClient certificateValidation(String zfpath,
String mchid) throws Exception
{
// 指定读取证书格式为PKCS12
KeyStore keyStore = KeyStore.getInstance("PKCS12");
// 证书地址
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;
}
微信公共方法 字符串转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
加密
用来加密签名
/***
* 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();
}
来源:https://blog.csdn.net/shaomiaojava/article/details/50562550


猜你喜欢
- 使用ModelAndView向request域对象共享数据index.html<a th:href="@{/testMode
- 这篇文章主要介绍了Spring boot整合log4j2过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 一、前言:垃圾回收:在未来的JDK中可能G1会为ZGC所取代先问自己几个问题:什么是垃圾?垃圾就是堆内存中(范指)没有任何指针指向的对象实体
- 前言上一篇已经对线程池的创建进行了分析,了解线程池既有预设的模板,也提供多种参数支撑灵活的定制。本文将会围绕线程池的生命周期,分析线程池执行
- maven项目install时忽略执行test在项目所在文件夹根目录使用maven命令打包时<!-- 不执行单元测试,也不编译测试类
- @Autowired加到接口上但获取的是实现类问题Spring的@Autowired加到接口上但获取的是实现类? &
- 1 安装 Unity安装Unity Hub安装 Unity 推荐使用 Unity Hub 管理程序(官方管理程序)。Unity Hub 是一
- 这篇文章主要介绍了java split()使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 本篇主要是自定义动画与Animatable。AnimationSpec上一篇中,出现了多次animationSpec属性,它是用来自定义动画
- 闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有任何线程可以通过,当到达结束状态时,这扇门才会打开并容许所有线程通过。它
- 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模
- springboot的最强大的就是那些xxxAutoconfiguration,但是这些xxxAutoConfiguration又依赖那些s
- 近期,Google宣布Kotlin成为了Android一级开发语言。于是就刚刚简单的研究了一下,查资料的时候发现现成的资料还是很少的,于是决
- 本文实例讲述了JAVA中的final关键字用法。分享给大家供大家参考,具体如下:根据上下文环境,java的关键字final也存在着细微的区别
- 本文实例为大家分享了java实现字符串反转的具体代码,供大家参考,具体内容如下1.需求:定义一个方法,实现字符串反转。键盘录入一个字符串,调
- 一、HandlerThread的介绍及使用举例  
- 之前写轮播条或者指示器的时候都是UI图里面直接有,这样的效果并不好,给用户的体验比较差,所以闲暇之余自己写了个指示器,可以展现出一个优雅的效
- JPA主键@Id,@IdClass,@Embeddable,@EmbeddedId1、自动主键默认情况下,主键是一个连续的64位数字(lon
- 公司有个业务需要查出所有的用户权限分类,并将最后一层类别所包含的权限查出来。数据库说明,有一个parent_id 字段是最好的:、paren
- 以前只知道@在C#中为了写文件路径的\不要加转义符而在前面加上@标识符,没想到@还有其他的作用1.忽略转义字符例如string fileNa