附官方地址:

微信官方api     微信公众号获取用户openid

只讲容易遇到的坑

微信api说明,请求需要双向证书。 所以需要去商户管理后台下载api证书  微信支付平台

在支付平台->账户中心->api安全 下载证书   并设置秘钥

然后在营销中心->支付后配置  查看发起提现公众号的appid  此appid一定要和获取用户openid的appid一致

将上图这个id记住 这是商户号

从微信支付平台中我们要下载证书,设置秘钥,确保appid一致,获取商户号

api具体请求就不分析了 有文档  直接上代码

package com.liuyb.model;/*** @Auther: liuyubo* @Date: 2018/8/10 20:30* @Description:实体类*/
public class EnterprisesPayment {/*** 商户账号appid* 申请商户号的appid或商户号绑定的appid*/private String mch_appid;/*** 商户号 微信支付分配的商户号*/private String mchid;/***设备号013467007045764* 微信支付分配的终端设备号*/private String device_info;/*** 随机字符串    5K8264ILTKCH16CQ2502SI8ZNMTM67VS* 随机字符串,不长于32位*/private String nonce_str;/*** 签名 C380BEC2BFD727A4B6845133519F3AD6*/private String sign;/***商户订单号  商户订单号,需保持唯一性(只能是字母或者数字,不能包含有符号)*/private String partner_trade_no;/***用户openid  商户appid下,某用户的openid*/private String openid;/*** 校验用户姓名选项    不校验真实姓名 NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名**/private String check_name;/*** 收款用户姓名     收款用户真实姓名。 如果check_name设置为FORCE_CHECK,则必填用户真实姓名*/private String re_user_name;/*** 金额   企业付款金额,单位为分*/private Integer amount;/*** 企业付款描述信息   理赔  企业付款操作说明信息*/private String desc;/*** Ip地址   该IP同在商户平台设置的IP白名单中的IP没有关联,该IP可传用户端或者服务端的IP。*/private String spbill_create_ip;public String getMch_appid() {return mch_appid;}public void setMch_appid(String mch_appid) {this.mch_appid = mch_appid;}public String getDevice_info() {return device_info;}public void setDevice_info(String device_info) {this.device_info = device_info;}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 String getRe_user_name() {return re_user_name;}public void setRe_user_name(String re_user_name) {this.re_user_name = re_user_name;}public Integer getAmount() {return amount;}public void setAmount(Integer 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;}public String getMchid() {return mchid;}public void setMchid(String mchid) {this.mchid = mchid;}
}
package com.liuyb.util;import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;import javax.net.ssl.SSLContext;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.conn.ssl.SSLContexts;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;/*** @Auther: liuyubo* @Date: 2018/8/10 20:39* @Description: 加载证书 发送请求*/
public class ClientCustomSSL {public static String doRefund(String url,String xmlData) throws Exception {KeyStore keyStore = KeyStore.getInstance("PKCS12");FileInputStream instream = new FileInputStream(new File(""));//P12文件目录  写证书的项目路径try {keyStore.load(instream, "xxxx".toCharArray());//这里写密码..默认是你的MCHID 证书密码} finally {instream.close();}SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, "xxxx".toCharArray())//这里也是写密码的.build();SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,new String[] { "TLSv1" },null,SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();try {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"));CloseableHttpResponse response = httpclient.execute(httpost);try {HttpEntity entity = response.getEntity();String returnMessage = EntityUtils.toString(response.getEntity(), "UTF-8");EntityUtils.consume(entity);return returnMessage; //返回后自己解析结果} finally {response.close();}} finally {httpclient.close();}}}

/*** @Auther: liuyubo* @Date: 2018/8/10 20:46* @Description: 微信提现 xml数据 签名等*/
public class WeixinpayUtil {private static final Logger LOG = Logger.getLogger(WeixinpayUtil.class);public static String createDocumentForEnterprisesPayment(EnterprisesPayment enterprisesPayment) {final StringBuffer result = new StringBuffer();result.append("<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><xml>");result.append("<mch_appid>" + enterprisesPayment.getMch_appid() + "</mch_appid>");result.append("<mchid>" + enterprisesPayment.getMchid() + "</mchid>");result.append("<nonce_str>" + enterprisesPayment.getNonce_str() + "</nonce_str>");result.append("<partner_trade_no>" + enterprisesPayment.getPartner_trade_no() + "</partner_trade_no>");result.append("<openid>" + enterprisesPayment.getOpenid() + "</openid>");result.append("<check_name>" + enterprisesPayment.getCheck_name() + "</check_name>");result.append("<re_user_name>" + enterprisesPayment.getRe_user_name() + "</re_user_name>");result.append("<amount>" +enterprisesPayment.getAmount()+ "</amount>");result.append("<desc>" + enterprisesPayment.getDesc() + "</desc>");result.append("<spbill_create_ip>" + enterprisesPayment.getSpbill_create_ip() + "</spbill_create_ip>");result.append("<sign>" + enterprisesPayment.getSign() + "</sign>");result.append("</xml>");return result.toString();}public static String getSignCode(Map<String, String> map,String keyValue) {String result = "";try {List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(map.entrySet());// 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() {public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {return (o1.getKey()).toString().compareTo(o2.getKey());}});// 构造签名键值对的格式StringBuilder sb = new StringBuilder();for (Map.Entry<String, String> item : infoIds) {if (item.getKey() != null || item.getKey() != "") {String key = item.getKey();String val = item.getValue();if (!(val == "" || val == null)) {sb.append(key + "=" + val + "&");}}}sb.append("key="+keyValue);result = sb.toString();//进行MD5加密result = WeixinpayUtil.md5(result).toUpperCase();} catch (Exception e) {return null;}return result;}/*** 生成32位编码* @return string*/public static String getUUID(){String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");return uuid;}/***  生成提现订单号* @return string*/public static String getOrderId() {int machineId = 1;//最大支持1-9个集群机器部署int hashCodeV = UUID.randomUUID().toString().hashCode();if(hashCodeV < 0) {//有可能是负数hashCodeV = - hashCodeV;}return machineId+String.format("%015d", hashCodeV);}/***  md5加密* @param text* @return*/public static String md5(final String text) {//自己写一个md5方法 这里我就不写了  记得大写return Md5Encrypt.md5(text).toUpperCase();}}
/*** @Auther: liuyubo* @Date: 2018/8/10 20:59* @Description: test*/
public class Test {private SortedMap<String,String> sortedMap = new TreeMap<>();public static void main(String[] args) {String sginCode = getSgin(openid,amount);//获取用户openid 和 用户要提现的金额  拿到签名EnterprisesPayment enterprisesPayment  = addEnterprisesPayment(openid,amount,sginCode);//拿到签名后加密得到要发送到对象数据String enterprisesPaymentXML = WeixinpayUtil.createDocumentForEnterprisesPayment(enterprisesPayment);
  //封装xml 数据发送String returnXmlData =
  ClientCustomSSL.doRefund("url地址",enterprisesPaymentXML);
}public EnterprisesPayment addEnterprisesPayment(String openid, Integer amount,String sginCode){
EnterprisesPayment enterprisesPayment = new EnterprisesPayment();
enterprisesPayment.setMch_appid("appid");//商户号appid
enterprisesPayment.setMchid("商户号");//商户号
// enterprisesPayment.setDevice_info(null);//设备号 非必填
enterprisesPayment.setNonce_str(sortedMap.get("nonce_str"));//随机字符串
enterprisesPayment.setSign(sginCode);//签名
enterprisesPayment.setPartner_trade_no(sortedMap.get("partner_trade_no"));//商户订单号
enterprisesPayment.setOpenid(openid);
    enterprisesPayment.setCheck_name("NO_CHECK");
enterprisesPayment.setRe_user_name(null); 根据checkName字段判断是否需要
enterprisesPayment.setAmount(amount);//金额
enterprisesPayment.setDesc("desc");//描述
enterprisesPayment.setSpbill_create_ip("ip");//ip地址
return enterprisesPayment;
}public String getSgin(String openid, Integer amount) {
sortedMap.put("mch_appid","appid");
sortedMap.put("mchid","商户号");
sortedMap.put("nonce_str", WeixinpayUtil.getUUID());
sortedMap.put("partner_trade_no", WeixinpayUtil.getOrderId());
sortedMap.put("openid", openid);
sortedMap.put("check_name", "NO_CHECK");
sortedMap.put("amount", amount.toString());
sortedMap.put("desc", "desc");
sortedMap.put("spbill_create_ip", "ip");
sortedMap.put("re_user_name", "null");
return WeixinpayUtil.getSignCode(sortedMap,"api秘钥");
}
}

具体就这些吧 不懂到来问我 q群 8028492

java 企业付款到零钱 微信提现功能讲解相关推荐

  1. 微信企业付款到零钱(微信提现)

    由于项目中要用到微信提现,参考网上代码和官方文档写了提现的工具类 用到的相关类库 dom4j commons-lang3 httpclient-4.4.1 具体相关流程可以看微信企业付款到零钱的开发文 ...

  2. cms小猪o2o企业付款配置中微信提现配置实现商家转账到零钱(企业付款到零钱)解决:“操作失败!产品权限验证失败,请查看您当前是否具有该产品的权限“的错误提示

    先说下概念什么是商家转账到零钱?其实这个功能是由企业付款到零钱功能演变过来的,微信支付里面在2022年5月之前这个功能一直叫"企业付款到零钱"后来因为业务需求改成了"商家 ...

  3. 企业付款到零钱微信API请求报错:error:0909006C:PEM routines:get_name:no start line

    背景 对接企业付款到零钱,微信api请求时需要用到证书(node环境使用pem格式) 微信API:[微信支付]付款开发者文档 已经用微信的\WXCertUtil工具在本地生成了证书文件 问题所在: 证 ...

  4. java 企业付款_java实现微信企业付款到个人功能

    微信官方提供了微信企业账户付款到微信个人零钱接口,提供企业向用户付款的功能,支持企业通过API接口付款,或通过微信支付商户平台网页功能操作付款.该接口并不是直接所有的商户都拥有,企业要开启必须满足以下 ...

  5. 微信支付----企业付款到零钱和银行卡规则

    企业付款到零钱 微信官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1 使用条件 1.商户号(或同主体 ...

  6. 企业付款至零钱任务提醒助手系统开发

    企业付款至零钱任务提醒助手系统开发 企业付款至零钱 任务提醒 功能列表// 任务开始模块消息 任务开始后会在公众号推送提醒 每日支付模块消息 当日如果没支付会根据 设置的周期进行提醒 支付金额 支付的 ...

  7. 微信用户提现功能 显示NO_AUTH | 产品权限验证失败,请查看您当前是否具有该产品的权限(企业付款到零钱 银行卡)

    企业付款到零钱 一.开通条件 需同时满足两个条件,才有开通该功能入口: 1.T+0 (T日结算至基本账户),结算商户需满足两个条件: 1.入驻满90天, 2.截止今日往回推30天连续不间断保持有交易. ...

  8. PHP微信商户支付 - 企业付款到零钱功能(即提现)技术资料汇总

    PHP实现微信开发中提现功能(企业付款到用户零钱) 一.实现该功能目的 这几天在小程序里要实现用户从系统中提现到零钱的功能,查了一下文档可以使用 企业付款到用户零钱 来实现: 官方文档:https:/ ...

  9. JAVA微信企业付款到零钱(十分钟搞定),附完整DEMO下载

    最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信提现功能开发的流程, 主要就是按规则封装好请求参数调用微信接口,涉及一些签名校验: A.接口流程 获取用户OPENI ...

  10. 微信提现——企业付款到零钱demo(超详细小白都看得懂的)

    一.p12证书下载 企业付款到零钱API (建议多看) apiclient_cert.p12证书:在微信商户平台–>账户设置–>API安全–>证书中下载的 . (自行下载) 二.开发 ...

最新文章

  1. CCleaner v5.55.7108 发布,新增软件升级功能
  2. 合肥天鹅湖万达广场机器人_万达王健林再考察合肥!瞄准政务、高新,年末合肥楼市出现区域分化!...
  3. Jenkins中的高速流水线 Shared Pipeline
  4. asp.net的get和post请求
  5. 苹果开发账号过期不续费会怎样?
  6. CSS实现单行与多行文字省略(truncation)
  7. 算法图解:如何用两个栈实现一个队列?
  8. linux网卡eth1如何修改为eth0
  9. java线程属性_Java 并发 线程属性
  10. cin cout加快
  11. Exploit Kit攻击工具包流量锐减96%!这段时间究竟发生了什么?
  12. RHCS双机集群调测
  13. 工作流(activiti7)-简单的介绍和使用(二)
  14. vs2010 调用matlab,vs2010调用matlab引擎
  15. Au 音频效果参考:调制
  16. amd apu战略_添加内存如何显着提高AMD APU的游戏性能?
  17. 手把手教你ssm整合 超级详细
  18. UE4 GamePlay架构学习篇
  19. thinkphp内核家教平台网站源码带手机站
  20. creator owner是什么用户_并发系列-到底什么重量级锁?

热门文章

  1. linux命令清理磁盘空间,Linux如何使用命令行清理磁盘来增加空间
  2. python(分隔符)
  3. 【数据结构】给定中序序列,有多少种前序序列
  4. LeetCode 每日一题331. 验证二叉树的前序序列化
  5. 共享计算机如何重新登录密码,电脑共享后怎么登陆密码怎样设置
  6. matlab中grid的用法
  7. html5 input step,HTML5 Data Input 元素介绍
  8. 拨打国际电话的国际字冠和国家代码
  9. 气缸模组控制一以1200PLC为例从易到难学习
  10. JavaScript文档注释JSDoc注释