首先,先制作一个工具类 主要是获取参数,拼接成xml等
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.caibei.ljmanager.util.MD5StringUtil;
import net.sf.json.xml.XMLSerializer;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
public class WeChatUtil {
//参数
public static String APP_ID = "";商户APP_ID
public static String BODY = ""; 订单介绍 emmm大概这么说 反正自己写的 随便
public static String MCH_ID = ""; MCH_ID
public static String KEY = "";KEY
public static String IP = "";IP
public static String NOTIFY_URL="";返回地址
public static String TRADE_TYPE="APP"; APP支付
public static String WECHAT_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder"; 地址
private String nonceStr = "";
private WeChatUtil(){}
private static WeChatUtil weChatUtil = new WeChatUtil();
public static WeChatUtil init(){
return weChatUtil;
}
//获取签名 ,拼接参数
public String getParam(String tradeNo, Integer fee){
Map<String,String> map = new HashMap<>();
String sign = "";
nonceStr = getNonce();
StringBuffer temp = new StringBuffer("appid="+APP_ID);
temp.append("&body="+BODY);
temp.append("&mch_id="+MCH_ID);
temp.append("&nonce_str="+nonceStr);
temp.append("¬ify_url="+NOTIFY_URL);
temp.append("&out_trade_no="+tradeNo);
temp.append("&total_fee="+fee);
temp.append("&trade_type="+TRADE_TYPE);
temp.append("&key="+KEY);
sign = MD5StringUtil.MD5EncodeUTF8(temp.toString());
//参数拼接成 XML
StringBuffer xml = new StringBuffer("<xml>");
xml.append("<appid>");
xml.append(APP_ID);
xml.append("</appid>");
xml.append("<body>");
xml.append(BODY);
xml.append("</body>");
xml.append("<mch_id>");
xml.append(MCH_ID);
xml.append("</mch_id>");
xml.append("<nonce_str>");
xml.append(nonceStr);
xml.append("</nonce_str>");
xml.append("<notify_url>");
xml.append(NOTIFY_URL);
xml.append("</notify_url>");
xml.append("<out_trade_no>");
xml.append(tradeNo);
xml.append("</out_trade_no>");
xml.append("<total_fee>");
xml.append(fee);
xml.append("</total_fee>");
xml.append("<trade_type>");
xml.append(TRADE_TYPE);
xml.append("</trade_type>");
xml.append("<sign>");
xml.append(sign.toUpperCase());
xml.append("</sign>");
xml.append("</xml>");
return xml.toString();
}
//获取随机字符串
public String getNonce(){
String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random=new Random();
StringBuffer sb = new StringBuffer();
for(int i=0;i<32;i++){
int number=random.nextInt(62);
sb.append(str.charAt(number));
}
return sb.toString();
}
//向统一订单接口发送请求
public static Map<String,String> sendPost(String tradeNo,Integer fee) {
String param = WeChatUtil.init().getParam(tradeNo,fee);
String result = "";
System.out.println(param);
BufferedReader bufferedReader = null;
PrintWriter out = null;
try {
//1、2、读取并将url转变为URL类对象
URL realUrl = new URL(WECHAT_URL);
//3、打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
//4、设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 发送POST请求必须设置如下两行
connection.setDoInput(true);
connection.setDoOutput(true);
//5、建立实际的连接
//connection.connect();
//获取URLConnection对象对应的输出流
out = new PrintWriter(connection.getOutputStream());
//发送请求参数
out.print(param);
//flush输出流的缓冲
out.flush();
//6、定义BufferedReader输入流来读取URL的响应内容
bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));
String line;
while(null != (line = bufferedReader.readLine())) {
result += line;
}
}catch (Exception e) {
// TODO: handle exception
System.out.println("发送POST请求出现异常!!!" + e);
e.printStackTrace();
}finally { //使用finally块来关闭输出流、输入流
try {
if(null != out) {
out.close();
}
if(null != bufferedReader) {
bufferedReader.close();
}
}catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
}
Document doc = null;
Map<String,String> map = new HashMap<>();
try {
doc = DocumentHelper.parseText(result);
Element rootElt = doc.getRootElement();
@SuppressWarnings("unchecked")
List<Element> list= rootElt.elements();
for (Element element :list){
map.put(element.getName(), element.getText()); // 节点的name为map的key,text为map的value
}
} catch (DocumentException e) {
e.printStackTrace();
}
System.out.println(result);
return map;
}
public static void main(String[] args) {
Map<String,String> s = sendPost("78945783456978",1);
System.out.println(s);
}
}
这是写好现成的 直接调用就行
然后再Controller中需要写上方法
一个是android访问后台获取信息的方法 一个是处理返回结果的方法
@RequestMapping("/pay")
@ResponseBody
public Map<String,String> order(String orderNo,Integer fee){
Map<String,String> result = WeChatUtil.init().sendPost(orderNo,fee);
return result;
}
@ResponseBody
@RequestMapping("/notify")
public String payResulr(){
/*处理业务逻辑*/
/*订单信息更新*/
/*用户充值处理*/
return "<xml>\n" +
" <return_code><![CDATA[SUCCESS]]></return_code>\n" +
" <return_msg><![CDATA[OK]]></return_msg>\n" +
"</xml>";
}
然后 android中这样处理 访问后台方法并传入 订单号和价格
获取返回之后直接调用微信支付即刻
HttpUtil.getInstance().getMyOkHttp().post()
.url(HttpUtil.HOST_ADDRESS+"/wechat/pay")
.addParam("orderNo",orderxq_orderid.getText().toString())
.addParam("fee",price2) //TODO
.enqueue(new JsonResponseHandler() {
@Override
public void onFailure(int statusCode, String error_msg) { }
@Override
public void onSuccess(int statusCode, JSONObject response) {
Log.d("result",response.toString());
try {
String prepayId = response.getString("prepay_id");
String nonceStr = response.getString("nonce_str");
//String sign = response.getString("sign");
PayReq request = new PayReq();
request.appId = APP_ID;
request.partnerId = MCH_ID;
request.prepayId= prepayId;
request.packageValue = "Sign=WXPay";
request.nonceStr= nonceStr;
long timeMills = System.currentTimeMillis() / 1000;
request.timeStamp = String.valueOf(timeMills);//时间戳 以秒为单位,十位
//appid,noncestr,package,partnerid,prepayid,timestamp,key
String s = "appid="+APP_ID
+"&noncestr="+ nonceStr
+"&package="+"Sign=WXPay"
+"&partnerid="+MCH_ID
+"&prepayid="+ prepayId
+"×tamp="+ request.timeStamp
+"&key="+ "jePfqdFO6zNrVT8KbcpkGWTkbnqHMo8Z";
String ss = MD5StringUtil.MD5EncodeUTF8(s);
request.sign= ss;
api.sendReq(request);
} catch (JSONException e) {
e.printStackTrace();
}
}
});