java服务端微信APP支付接口详解
一、微信APP支付接入商户服务中心
[申请流程指引](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317780&token=84f23b4e9746c5963128711f225476cfd49ccf8c&lang=zh_CN)
二、开始开发
1、配置相关的配置信息
1.1、配置appid(Android)、mch_id(ios)、微信支付后的回调地址
sys.properties配置文件: appid=wx***************1 mch_id=1********2 notify_url=http://6*.***.***.**/returnmsg.do //回调通知的地址,一定是要可以直接访问的地址
2、微信支付–下单
@ResponseBody
@RequestMapping(value="/weixinpay.do",produces="text/html;charset=UTF-8",method={RequestMethod.POST})
publicstaticStringweixinpay(Stringbody,//商品描述
Stringdetail,//商品详情
Stringattach,//附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
Stringout_trade_no,//商户系统内部的订单号,32个字符内、可包含字母,其他说明见商户订单号
Stringtotal_price,//订单总金额,单位为分,详见支付金额
Stringspbill_create_ip//用户端实际ip
)throwsException{
WeixinConfigUtilsconfig=newWeixinConfigUtils();
//参数组
Stringappid=config.appid;//微信开放平台审核通过的应用APPID
System.out.println("appid是:"+appid);
Stringmch_id=config.mch_id;
System.out.println("mch_id是:"+mch_id);
Stringnonce_str=RandCharsUtils.getRandomString(16);
System.out.println("随机字符串是:"+nonce_str);
body=body;//"测试微信支付0.01_2";
detail=detail;//"0.01_元测试开始";
//attach=attach;//"备用参数,先留着,后面会有用的";
//Stringout_trade_no=OrderUtil.getOrderNo();//"2015112500001000811017342394";
doubletotalfee=0;
try{
totalfee=Double.parseDouble(total_price);////单位是分,即是0.01元
}catch(Exceptione){
totalfee=0;
}
inttotal_fee=(int)(totalfee*100);
spbill_create_ip=spbill_create_ip;//"127.0.0.1";
Stringtime_start=RandCharsUtils.timeStart();
System.out.println(time_start);
Stringtime_expire=RandCharsUtils.timeExpire();
System.out.println(time_expire);
Stringnotify_url=config.notify_url;
System.out.println("notify_url是:"+notify_url);
Stringtrade_type="APP";
//参数:开始生成签名
SortedMap
2.1、微信支付签名算法sign
packagecom.wx.weixincontroller.pay.weixin.Utils;
importjava.util.Iterator;
importjava.util.Map;
importjava.util.Set;
importjava.util.SortedMap;
importcom.wx.weixin.utils.MD5Utils;
/**
*微信支付签名
*@authoriYjrg_xiebin
*@date2016年10月25日下午4:47:07
*/
publicclassWXSignUtils{
//http://mch.weixin.qq.com/wiki/doc/api/index.php?chapter=4_3
//商户Key:改成公司申请的即可
//32位密码设置地址:http://www.sexauth.com/jdex1hvufnm1sdcb0e81t36k0d0f15nc
privatestaticStringKey="***cb**e**ef**c*e*d***e*fd***cb*";
/**
*微信支付签名算法sign
*@paramcharacterEncoding
*@paramparameters
*@return
*/
@SuppressWarnings("rawtypes")
publicstaticStringcreateSign(StringcharacterEncoding,SortedMapparameters){
StringBuffersb=newStringBuffer();
Setes=parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)
Iteratorit=es.iterator();
while(it.hasNext()){
Map.Entryentry=(Map.Entry)it.next();
Stringk=(String)entry.getKey();
Objectv=entry.getValue();
if(null!=v&&!"".equals(v)
&&!"sign".equals(k)&&!"key".equals(k)){
sb.append(k+"="+v+"&");
}
}
sb.append("key="+Key);
System.out.println("字符串拼接后是:"+sb.toString());
Stringsign=MD5Util.MD5Encode(sb.toString(),characterEncoding).toUpperCase();
returnsign;
}
}
2.2、POST提交XML格式的参数
packagecom.wx.weixincontroller.pay.weixin.Utils;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.io.OutputStreamWriter;
importjava.net.HttpURLConnection;
importjava.net.MalformedURLException;
importjava.net.URL;
importjavax.net.ssl.HttpsURLConnection;
importcom.com.wx.weixin.wxcontroller.pay.weixin.entity.Unifiedorder;
/**
*post提交xml格式的参数
*@authoriYjrg_xiebin
*@date2016年10月25日下午3:33:38
*/
publicclassHttpXmlUtils{
/**
*开始post提交参数到接口
*并接受返回
*@paramurl
*@paramxml
*@parammethod
*@paramcontentType
*@return
*/
publicstaticStringxmlHttpProxy(Stringurl,Stringxml,Stringmethod,StringcontentType){
InputStreamis=null;
OutputStreamWriteros=null;
try{
URL_url=newURL(url);
HttpURLConnectionconn=(HttpURLConnection)_url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Content-type","text/xml");
conn.setRequestProperty("Pragma:","no-cache");
conn.setRequestProperty("Cache-Control","no-cache");
conn.setRequestMethod("POST");
os=newOutputStreamWriter(conn.getOutputStream());
os.write(newString(xml.getBytes(contentType)));
os.flush();
//返回值
is=conn.getInputStream();
returngetContent(is,"utf-8");
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
try{
if(os!=null){os.close();}
if(is!=null){is.close();}
}catch(IOExceptione){
e.printStackTrace();
}
}
returnnull;
}
/**
*解析返回的值
*@paramis
*@paramcharset
*@return
*/
publicstaticStringgetContent(InputStreamis,Stringcharset){
StringpageString=null;
InputStreamReaderisr=null;
BufferedReaderbr=null;
StringBuffersb=null;
try{
isr=newInputStreamReader(is,charset);
br=newBufferedReader(isr);
sb=newStringBuffer();
Stringline=null;
while((line=br.readLine())!=null){
sb.append(line+"\n");
}
pageString=sb.toString();
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
if(is!=null){
is.close();
}
if(isr!=null){
isr.close();
}
if(br!=null){
br.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
sb=null;
}
returnpageString;
}
/**
*构造xml参数
*@paramxml
*@return
*/
publicstaticStringxmlInfo(Unifiedorderunifiedorder){
//构造xml参数的时候,至少又是个必传参数
/*
*
wx2421b1c4370ec43b
支付测试
JSAPI支付测试
10000100
1add1a30ac87aa2db72f57a2375d8fec
http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php
oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
1415659990
14.23.150.211
1
JSAPI
0CB01533B8C1EF103065174F50BCA001
*/
if(unifiedorder!=null){
StringBufferbf=newStringBuffer();
bf.append("");
bf.append(" ");
bf.append(" ");
bf.append(" ");
bf.append(" ");
bf.append("");
bf.append(" ");
bf.append(" ");
bf.append(" ");
bf.append(" ");
bf.append(" ");
bf.append(" ");
bf.append(" ");
bf.append(" ");
bf.append(" ");
bf.append(" ");
returnbf.toString();
}
return"";
}
/**
*post请求并得到返回结果
*@paramrequestUrl
*@paramrequestMethod
*@paramoutput
*@return
*/
publicstaticStringhttpsRequest(StringrequestUrl,StringrequestMethod,Stringoutput){
try{
URLurl=newURL(requestUrl);
HttpsURLConnectionconnection=(HttpsURLConnection)url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setRequestMethod(requestMethod);
if(null!=output){
OutputStreamoutputStream=connection.getOutputStream();
outputStream.write(output.getBytes("UTF-8"));
outputStream.close();
}
//从输入流读取返回内容
InputStreaminputStream=connection.getInputStream();
InputStreamReaderinputStreamReader=newInputStreamReader(inputStream,"utf-8");
BufferedReaderbufferedReader=newBufferedReader(inputStreamReader);
Stringstr=null;
StringBufferbuffer=newStringBuffer();
while((str=bufferedReader.readLine())!=null){
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream=null;
connection.disconnect();
returnbuffer.toString();
}catch(Exceptionex){
ex.printStackTrace();
}
return"";
}
}
3、微信支付–回调通知业务处理
//通知处理类
@ResponseBody
@RequestMapping(value="/returnmsg.do",produces="text/html;charset=UTF-8",method={RequestMethod.POST})
publicStringreturnmsg(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{
//解析结果存储在HashMap
Mapmap=newHashMap();
InputStreaminputStream=request.getInputStream();
//读取输入流
SAXReaderreader=newSAXReader();
Documentdocument=reader.read(inputStream);
//得到xml根元素
Elementroot=document.getRootElement();
//得到根元素的所有子节点
ListelementList=root.elements();
//遍历所有子节点
for(Elemente:elementList){
map.put(e.getName(),e.getText());
}
JSONObjectjson=JSONObject.fromObject(map);
System.out.println("===消息通知的结果:"+json.toString()+"==========================");
System.out.println("===return_code==="+map.get("return_code"));
System.out.println("===return_msg==="+map.get("return_msg"));
System.out.println("===out_trade_no==="+map.get("out_trade_no"));
//验证签名的过程
//判断是否支付成功
if(map.get("return_code").equals("SUCCESS")){
/**
*支付成功之后的业务处理
*/
//释放资源
inputStream.close();
inputStream=null;
//bis.close();
return"SUCCESS";
}
}
if(map.get("return_code").equals("FAIL")){
/**
*支付失败后的业务处理
*/
//释放资源
inputStream.close();
inputStream=null;
return"SUCCESS";
}
}
//释放资源
inputStream.close();
inputStream=null;
return"SUCCESS";
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。