您现在的位置是:首页 > 行业发展

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

智慧创新站 2025-03-22【行业发展】119人已围观

简介只讲容易遇到的坑微信api说明,请求需要双向证书。所以需要去商户管理后台下载api证书微信支付平台在支付平台-账户中心-api安全下载证书并设置秘钥然后在营销中心-支付后配置查看发起提现公众号的appid此appid一定要和获取用户openid的appid一致将上图这个id记住这是商户号从微信支付平...

只讲容易遇到的坑

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

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

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

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

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

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


;

/**

*@Auther:liuyubo

*@Date:2018/8/1020:30

*@Description:实体类

*/

publicclassEnterprisesPayment{

/**

*商户账号appid

*申请商户号的appid或商户号绑定的appid

*/

privateStringmch_appid;

/**

*商户号微信支付分配的商户号

*/

privateStringmchid;

/**

*设备号0764

*微信支付分配的终端设备号

*/

privateStringdevice_info;

/**

*随机字符串5K8264ILTKCH16CQ2502SI8ZNMTM67VS

*随机字符串,不长于32位

*/

privateStringnonce_str;

/**

*签名C380BEC2BFD727A4B6845133519F3AD6

*/

privateStringsign;

/**

*商户订单号商户订单号,需保持唯一性(只能是字母或者数字,不能包含有符号)

*/

privateStringpartner_trade_no;

/**

*用户openid商户appid下,某用户的openid

*/

privateStringopenid;

/**

*校验用户姓名选项不校验真实姓名NO_CHECK:不校验真实姓名FORCE_CHECK:强校验真实姓名

*

*/

privateStringcheck_name;

/**

*收款用户姓名收款用户真实姓名。如果check_name设置为FORCE_CHECK,则必填用户真实姓名

*/

privateStringre_user_name;

/**

*金额企业付款金额,单位为分

*/

privateIntegeramount;

/**

*企业付款描述信息理赔企业付款操作说明信息

*/

privateStringdesc;

/**

*Ip地址该IP同在商户平台设置的IP白名单中的IP没有关联,该IP可传用户端或者服务端的IP。

*/

privateStringspbill_create_ip;

publicStringgetMch_appid(){

returnmch_appid;

}

publicvoidsetMch_appid(Stringmch_appid){

}

publicStringgetDevice_info(){

returndevice_info;

}

publicvoidsetDevice_info(Stringdevice_info){

_info=device_info;

}

publicStringgetNonce_str(){

returnnonce_str;

}

publicvoidsetNonce_str(Stringnonce_str){

_str=nonce_str;

}

publicStringgetSign(){

returnsign;

}

publicvoidsetSign(Stringsign){

=sign;

}

publicStringgetPartner_trade_no(){

returnpartner_trade_no;

}

publicvoidsetPartner_trade_no(Stringpartner_trade_no){

_trade_no=partner_trade_no;

}

publicStringgetOpenid(){

returnopenid;

}

publicvoidsetOpenid(Stringopenid){

=openid;

}

publicStringgetCheck_name(){

returncheck_name;

}

publicvoidsetCheck_name(Stringcheck_name){

_name=check_name;

}

publicStringgetRe_user_name(){

returnre_user_name;

}

publicvoidsetRe_user_name(Stringre_user_name){

_user_name=re_user_name;

}

publicIntegergetAmount(){

returnamount;

}

publicvoidsetAmount(Integeramount){

=amount;

}

publicStringgetDesc(){

returndesc;

}

publicvoidsetDesc(Stringdesc){

=desc;

}

publicStringgetSpbill_create_ip(){

returnspbill_create_ip;

}

publicvoidsetSpbill_create_ip(Stringspbill_create_ip){

_create_ip=spbill_create_ip;

}

publicStringgetMchid(){

returnmchid;

}

publicvoidsetMchid(Stringmchid){

=mchid;

}

}

;

;

;

;

;

;

;

;

;

;

;

;

;

;

/**

*@Auther:liuyubo

*@Date:2018/8/1020:39

*@Description:加载证书发送请求

*/

publicclassClientCustomSSL{

publicstaticStringdoRefund(Stringurl,StringxmlData)throwsException{

KeyStorekeyStore=("PKCS12");

FileInputStreaminstream=newFileInputStream(newFile(""));//P12文件目录写证书的项目路径

try{

(instream,"xxxx".toCharArray());//这里写密码..默认是你的MCHID证书密码

}finally{

();

}

SSLContextsslcontext=()

.loadKeyMaterial(keyStore,"xxxx".toCharArray())//这里也是写密码的

.build();

SSLConnectionSocketFactorysslsf=newSSLConnectionSocketFactory(

sslcontext,

newString[]{"TLSv1"},

null,

_COMPATIBLE_HOSTNAME_VERIFIER);

CloseableHttpClienthttpclient=()

.setSSLSocketFactory(sslsf)

.build();

try{

HttpPosthttpost=newHttpPost(url);//设置响应头信息

("Connection","keep-alive");

("Accept","*/*");

("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");

("Host","");

("X-Requested-With","XMLHttpRequest");

("Cache-Control","max-age=0");

("User-Agent","Mozilla/4.0(compatible;;)");

(newStringEntity(data,"UTF-8"));

CloseableHttpResponseresponse=(httpost);

try{

HttpEntityentity=();

StringreturnMessage=((),"UTF-8");

(entity);

returnreturnMessage;//返回后自己解析结果

}finally{

();

}

}finally{

();

}

}

}

/**

*@Auther:liuyubo

*@Date:2018/8/1020:46

*@Description:微信提现xml数据签名等

*/

publicclassWeixinpayUtil{

privatestaticfinalLoggerLOG=();

publicstaticStringcreateDocumentForEnterprisesPayment(EnterprisesPaymententerprisesPayment){

finalStringBufferresult=newStringBuffer();

("?xmlversion='1.0'encoding='UTF-8'standalone='yes'?xml");

("mch_appid"+_appid()+"/mch_appid");

("mchid"+()+"/mchid");

("nonce_str"+_str()+"/nonce_str");

("partner_trade_no"+_trade_no()+"/partner_trade_no");

("openid"+()+"/openid");

("check_name"+_name()+"/check_name");

("re_user_name"+_user_name()+"/re_user_name");

("amount"+()+"/amount");

("desc"+()+"/desc");

("spbill_create_ip"+_create_ip()+"/spbill_create_ip");

("sign"+()+"/sign");

("/xml");

();

}

publicstaticStringgetSignCode(MapString,Stringmap,StringkeyValue){

Stringresult="";

try{

,StringinfoIds=,String(());

//对所有传入参数按照字段名的ASCII码从小到大排序(字典序)

(infoIds,,String(){

publicintcompare(,Stringo1,,Stringo2){

return(()).toString().compareTo(());

}

});

//构造签名键值对的格式

StringBuildersb=newStringBuilder();

for(,Stringitem:infoIds){

if(()!=null||()!=""){

Stringkey=();

Stringval=();

if(!(val==""||val==null)){

(key+"="+val+"");

}

}

}

("key="+keyValue);

result=();

//进行MD5加密

result=(result).toUpperCase();

}catch(Exceptione){

returnnull;

}

returnresult;

}

/**

*生成32位编码

*@returnstring

*/

publicstaticStringgetUUID(){

Stringuuid=().toString().trim().replaceAll("-","");

returnuuid;

}

/**

*生成提现订单号

*@returnstring

*/

publicstaticStringgetOrderId(){

intmachineId=1;//最大支持1-9个集群机器部署

inthashCodeV=().toString().hashCode();

if(hashCodeV0){//有可能是负数

hashCodeV=-hashCodeV;

}

returnmachineId+("%015d",hashCodeV);

}

/**

*md5加密

*@paramtext

*@return

*/

publicstaticStringmd5(finalStringtext){

//自己写一个md5方法这里我就不写了记得大写

(text).toUpperCase();

}

}

/**

*@Auther:liuyubo

*@Date:2018/8/1020:59

*@Description:test

*/

publicclassTest{

privateSortedMapString,StringsortedMap=newTreeMap();

publicstaticvoidmain(String[]args){

StringsginCode=getSgin(openid,amount);//获取用户openid和用户要提现的金额拿到签名

EnterprisesPaymententerprisesPayment=addEnterprisesPayment(openid,amount,sginCode);//拿到签名后加密得到要发送到对象数据

StringenterprisesPaymentXML=(enterprisesPayment);//封装xml数据发送

StringreturnXmlData=("url地址",enterprisesPaymentXML);

}

publicEnterprisesPaymentaddEnterprisesPayment(Stringopenid,Integeramount,StringsginCode){

EnterprisesPaymententerprisesPayment=newEnterprisesPayment();

("商户号");//商户号

//_info(null);//设备号非必填

_str(("nonce_str"));//随机字符串

(sginCode);//签名

_trade_no(("partner_trade_no"));//商户订单号

(openid);

_name("NO_CHECK");

_user_name(null);根据checkName字段判断是否需要

(amount);//金额

("desc");//描述

_create_ip("ip");//ip地址

returnenterprisesPayment;

}

publicStringgetSgin(Stringopenid,Integeramount){

("mch_appid","appid");

("mchid","商户号");

("nonce_str",());

("partner_trade_no",());

("openid",openid);

("check_name","NO_CHECK");

("amount",());

("desc","desc");

("spbill_create_ip","ip");

("re_user_name","null");

(sortedMap,"api秘钥");

}

很赞哦!(25)