第一步
要扫码,必须要先有码。生成二维码demo
String url = "weixin://wxpay/bizpayurl?sign="+er.getSign()+"&appid="+er.getAppid()+
"&mch_id="+er.getMch_id()+"&product_id="+er.getProduct_id()+"&time_stamp="+er.getTime_stamp()+"&nonce_str="+er.getNonce_str();
我相信以上几个参数,看过API的应该都清楚。这样就生成了二维码
第二步
设置扫码后微信通知你的URL
第三步
创建编写回调URL servlet
package com.yuwei.nativepay.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.yuwei.nativepay.main.UnifiedOrderBean;
import com.yuwei.nativepay.sign.Signature;
import com.yuwei.nativepay.sign.XMLParser;
import com.yuwei.nativepay.util.Configure;
import com.yuwei.nativepay.util.HttpRequest;
import com.yuwei.nativepay.util.RequestUtil;
import com.yuwei.nativepay.util.Util;
public class NativeCallBackServlet extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 3358943773018523786L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter pw = resp.getWriter();
String retStr = new String(Util.readInput(req.getInputStream()),"utf-8");
//扫码返回XML demo
// <xml><appid><![CDATA[wxe9fa16c146eXXXXX]]></appid>
// <openid><![CDATA[oAjrAjrw81UZuAlM3F_03tmxeSG4]]></openid>
// <mch_id><![CDATA[1269011111]]></mch_id>
// <is_subscribe><![CDATA[Y]]></is_subscribe>
// <nonce_str><![CDATA[KwRqjXOW7k0wOZvL]]></nonce_str>
// <product_id><![CDATA[8888]]></product_id>
// <sign><![CDATA[41F26B7F22C8625060ABC299EEA754D7]]></sign>
// </xml>
try {
Map<String, Object> map = XMLParser.getMapFromXML(retStr);
//outTradeNo 订单号
UnifiedOrderBean order = new UnifiedOrderBean(map.get("appid").toString(), map.get("mch_id").toString(), "测试1", RequestUtil.getRandomStringByLength(32),
null, "Ipad mini 16G 白色", "Ipad mini 16G 白色", "java demo", new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()), "CNY",
1, "122.224.40.204", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()), new SimpleDateFormat("yyyyMMddHHmmss").format(new Date(new Date().getTime()+1800000)),
"WXG", "http://????/wx_nativepay/native", "NATIVE", map.get("product_id").toString(), "no_credit", map.get("openid").toString());
order.setSign(Signature.getSign(order));
HttpRequest http = new HttpRequest();
String retOrder = http.sendPost("https://api.mch.weixin.qq.com/pay/unifiedorder", order);
//同意订单接口返回demo
// <xml><return_code><![CDATA[SUCCESS]]></return_code>
// <return_msg><![CDATA[OK]]></return_msg>
// <appid><![CDATA[wxe9fa16c146eXXXXX]]></appid>
// <mch_id><![CDATA[1269011111]]></mch_id>
// <device_info><![CDATA[测试1]]></device_info>
// <nonce_str><![CDATA[DwEgTeCXHq3z8VRX]]></nonce_str>
// <sign><![CDATA[68F3113F0E246EED9CAA49E93ACAC79E]]></sign>
// <result_code><![CDATA[SUCCESS]]></result_code>
// <prepay_id><![CDATA[wx20160319131705668cacb34b0717748054]]></prepay_id>
// <trade_type><![CDATA[NATIVE]]></trade_type>
// <code_url><![CDATA[weixin://wxpay/bizpayurl?pr=mt8vqLq]]></code_url>此处的code_url模式二里面可以直接展示给用户进行扫码支付,有效期2小时
// </xml>
Map<String, Object> mapOrder = XMLParser.getMapFromXML(retOrder);
//返回return xml
Map<String, Object> retNative = new HashMap<String, Object>();
retNative.put("return_code", mapOrder.get("return_code"));
retNative.put("return_msg", mapOrder.get("return_msg"));
retNative.put("appid", mapOrder.get("appid"));
retNative.put("mch_id", mapOrder.get("mch_id"));
retNative.put("nonce_str", mapOrder.get("nonce_str"));
retNative.put("prepay_id", mapOrder.get("prepay_id"));
retNative.put("result_code", mapOrder.get("result_code"));
retNative.put("sign", Signature.getSign(retNative));
pw.print(XMLParser.getXMLFromMap(retNative));
} catch (Exception e) {
e.printStackTrace();
}finally{
pw.flush();
pw.close();
}
}
}
一切OK,到此结束