您现在的位置是:首页 > 行业发展
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)