微信支付(商户支付模式一)扫码支付接口回调详解
2017-06-14 09:57
896 查看
微信支付(商户支付模式一)扫码支付接口回调详解
获取用户扫描二维码后,微信返回的信息
获取返回的信息内容中各个参数的值
封装获取到的信息生成签名并生成参数传送给微信后台获取预支付订单
如果获取预支付订单成功prepay_id,然后把成功的信息返回给微信服务器
源码地址:http://download.csdn.net/detail/qq_29428121/9869975
获取用户扫描二维码后,微信返回的信息
InputStream inStream; try { inStream = request.getInputStream(); ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inStream.read(buffer)) != -1) { outSteam.write(buffer, 0, len); } outSteam.close(); inStream.close(); String result = new String(outSteam.toByteArray(), "utf-8"); //System.out.println(result); /*String xmla = "<xml><appid><![CDATA[wxcb1fe0d]]></appid>" + "<openid><![CDATA[oBhusSzmARE1xYP9Y]]></openid>" + "<mch_id><![CDATA[108942]]></mch_id>" + "<is_subscribe><![CDATA[Y]]></is_subscribe>" + "<nonce_str><![CDATA[jU3nuUAOTTAo]]></nonce_str>" + "<product_id><![CDATA[ 116027]]></product_id>" + "<sign><![CDATA[6FFDCCF6AB74DF1220AEEEF4]]></sign>" + "</xml>";*/
获取返回的信息内容中各个参数的值
Map<String, String> map =ParseXml.callXMLToMap(result); String appid = map.get("appid"); String openid = map.get("openid"); String mch_id = map.get("mch_id"); String is_subscribe = map.get("is_subscribe"); String nonce_str = map.get("nonce_str"); String product_id = map.get("product_id"); String sign = map.get("sign");
封装获取到的信息生成签名并生成参数传送给微信后台获取预支付订单
Map<String, String> packageParams = new HashMap<String, String>(); packageParams.put("appid", appid); packageParams.put("openid", openid); packageParams.put("mch_id", mch_id); packageParams.put("is_subscribe", is_subscribe); packageParams.put("nonce_str", nonce_str); packageParams.put("product_id", product_id); String paternerKey = "KtPNdgMLgpreh0wUbtMeXrXKtZFPLv3i"; String packageSign = CreateSign.getSign(packageParams, paternerKey); //System.out.println("签名返回 :" + packageSign); PayUrlBackController.product_id=product_id; int price = 1;//((int) (Float.valueOf(10) * 100)); BillNo billNo=billNoService.select(product_id); if(billNo != null){ if(billNo.getAmountrmb() != null && billNo.getAmountrmb().length() > 0){ DecimalFormat df = new DecimalFormat("0"); String a=billNo.getAmountrmb(); float b=Float.valueOf(a); //System.out.println(df.format(b*100)); price=Integer.valueOf(df.format(b*100)); }else{ price = 1; } } // 统一下单文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1 //System.out.println("支付的钱为:"+billNo.getAmountrmb()); Map<String, String> params = new HashMap<String, String>(); params.put("appid", appid); params.put("mch_id", mch_id); params.put("body", "NO."+product_id); String out_trade_no = product_id;//Long.toString(System.currentTimeMillis()); params.put("out_trade_no", out_trade_no); params.put("total_fee", price+""); //params.put("total_fee", "1"); params.put("attach", out_trade_no); params.put("spbill_create_ip","8.8.8.8"); params.put("trade_type", "NATIVE"); params.put("nonce_str", System.currentTimeMillis() / 1000 + ""); params.put("notify_url", "http://192.168.1.8:8080/WeChat/pay/back"); params.put("openid", openid); String paysign = CreateSign.getSign(params, paternerKey); params.put("sign", paysign); byte[] byteXml=ParseXml.callMapToXML(params); String pushXml=new String(byteXml,"UTF-8"); //System.out.println("返回的xml数据:"+pushXml); String xmlResult=HttpRequest.sendPost("https://api.mch.weixin.qq.com/pay/unifiedorder", pushXml); //System.out.println("prepay_xml:" + xmlResult);
如果获取预支付订单成功prepay_id,然后把成功的信息返回给微信服务器
Map<String, String> payResult = ParseXml.callXMLToMap(xmlResult); String return_code = payResult.get("return_code"); String result_code = payResult.get("result_code"); if (StrKit.notBlank(return_code) && StrKit.notBlank(result_code) && return_code.equalsIgnoreCase("SUCCESS")&&result_code.equalsIgnoreCase("SUCCESS")) { // 以下字段在return_code 和result_code都为SUCCESS的时候有返回 String prepay_id = payResult.get("prepay_id"); Map<String, String> prepayParams = new HashMap<String, String>(); prepayParams.put("return_code", "SUCCESS"); prepayParams.put("appid", appid); prepayParams.put("mch_id", mch_id); prepayParams.put("nonce_str", System.currentTimeMillis() + ""); prepayParams.put("prepay_id", prepay_id); String prepaySign = null; if (sign.equals(packageSign)) { prepayParams.put("result_code", "SUCCESS"); }else { prepayParams.put("result_code", "FAIL"); prepayParams.put("err_code_des", "订单失效"); //result_code为FAIL时,添加该键值对,value值是微信告诉客户的信息 } prepaySign =CreateSign.getSign(prepayParams, paternerKey); prepayParams.put("sign", prepaySign); byte[] byteXmls=ParseXml.callMapToXML(prepayParams); String xml=new String(byteXmls); //System.out.println("最终xml:"+xml); //renderText(xml);
源码地址:http://download.csdn.net/detail/qq_29428121/9869975
相关文章推荐
- 【微信支付】公众号、商户基础配置和流程(包括设置支付授权目录、测试支付目录和白名单、JS接口安全域名、授权回调域名等)
- PHP微信支付开发之扫描支付(模式二)后如何回调
- PHP微信支付开发之扫描支付(模式二)后如何回调
- PHP微信支付开发之扫描支付(模式二)后如何回调
- 微信支付详解与取消支付回调
- PHP微信支付开发之扫描支付(模式二)后如何回调
- 微信支付 JS API支付接口详解
- Spring模板模式和回调接口
- 初识安卓之:异步备份手机短信,详解自定义接口,回调抽象方法
- JavaSE第八十四讲:Observable类与Observer接口详解,深入理解观察者模式
- 微信企业号回调模式配置详解
- iOS微信支付和支付宝支付开发详解
- 面向接口编程详解 -- 策略模式
- 详解 JAVA 适配模式 和 接口适配器
- 微信支付——调用微信客户端支付之【服务端】开发详解
- 微信红包接口开放 商户开通微信支付即可申请
- Android 接口回调机制详解
- 详解 JAVA 适配模式和 接口适配器
- SPI时序图详解-SPI接口在模式0下输出第一位数据的时刻
- 设计模式_接口回调