微信文档:https://pay.weixin.qq.com/wiki/doc/api/native.php
第一步
在微信服务号设置native支付回调url。该URL会在微信用户扫描是调用。
第二步生成微信扫描支付二维码对应的URL。
生成该URL后,就可以用该URL在草料去生成二维码。
URL的形式为:weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXXX&time_stamp=XXXXXX&nonce_str=XXXXX,只改参数,前面的weixin://wxpay/bizpayurl是固定的。
public static String createPayQrCodeUrl() {
long timeStamp = System.currentTimeMillis() / 1000;
String stringA = "appid=" + APP_ID + "&mch_id=" + MCH_ID
+ "&nonce_str=" + NONCE_STR + "&product_id=" + PEODUCT_ID
+ "&time_stamp=" + timeStamp + "&key=" + KEY;
String sign = DigestUtils.md5Hex(stringA).toUpperCase();
String url = "weixin://wxpay/bizpayurl?sign="
+ sign + "&appid=" + APP_ID + "&mch_id=" + MCH_ID
+ "&product_id=" + PEODUCT_ID + "&time_stamp=" + timeStamp
+ "&nonce_str=" + NONCE_STR;
return url;
}
第三步,用第二步生成的URL去生成二维码。
第四步,编写native支付对应的回调接口,该url是第一步设置的url。
在该接口中,根据productid和用户的openid动态生成订单,用【统一下单API】去生成微信支付订单,微信支付系统根据商户系统的请求生成预支付交易,返回交易会话标识prepay_id,
程序得到交易会话标识prepay_id后,把它拼成对应的xml数据返回给微信支付系统。
@ResponseBody
@RequestMapping(value = "/public/getProductId")
public void getProductId(HttpServletRequest request,
HttpServletResponse response) {
String notify_url = "http://www.benewit.cn/hzfwh-web/public/wxpay/notifyController";
try {
String xml = getBody(request);
Map<String, String> map = XMLUtils.parseXml(xml);
String appid = map.get("appid");
String mchid = map.get("mch_id");
String productid = map.get("product_id");
String openid = map.get("openid");
String prepayid = getPayResult(appid, mchid,
"76baa506a4aef345a048cd2ea8edb1a9",
"42baa06a3u3fd345qw48ctyea8ed1300", notify_url, "支付测试",
0.01, request.getRemoteAddr(), StringUtils.generateUuid(),
productid, openid);
System.out.println("prepayid:" + prepayid);
String nonceStr = StringUtils.generateUuid();
SortedMap<String, String> packageParams = new TreeMap<String, String>();
packageParams.put("return_code", "SUCCESS");
packageParams.put("mch_id", mchid);
packageParams.put("appid", appid);
packageParams.put("nonce_str", nonceStr);
packageParams.put("prepay_id", prepayid);
packageParams.put("result_code", "SUCCESS");
RequestHandler reqHandler = new RequestHandler(null, null);
reqHandler.init(appid, "76baa506a4aef345a048cd2ea8edb1a9",
"42baa06a3u3fd345qw48ctyea8ed1300");
String sign = reqHandler.createSign(packageParams);
String returnArgs = "<xml><return_code>SUCCESS</return_code>"
+ "<appid>" + appid + "</appid>" + "<mch_id>" + mchid
+ "</mch_id>" + "<nonce_str>" + nonceStr + "</nonce_str>"
+ "<prepay_id>" + prepayid + "</prepay_id>"
+ "<result_code>SUCCESS</result_code>" + "<sign>" + sign
+ "</sign></xml>";
response.getWriter().write(returnArgs);
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
第五步
完成上面的程序,微信用户扫二维码的时候,就会跳出支付界面,当支付成功的时候,微信支付后台会回调在生成微信支付时设置的回调url,并传输xml格式的数据,程序可以根据xml数据去修改数据库中的记录。如果不理解这个步骤,请查看【统一下单API】。