近来对支付来点兴趣,搞了一个微信H5的支付demo供大家参考一下。

@RequestMapping(value ="/H5",method = {RequestMethod.POST,RequestMethod.GET})

public String H5(){
return "text_jsp/h5";//微信订单的页面
}

/**
 * 微信H5 支付
 * 注意:必须再web页面中发起支付且域名已添加到开发配置中
 * @throws DocumentException 
 * @throws IOException 
 */

@RequestMapping(value ="/H5Pay",method = {RequestMethod.POST,RequestMethod.GET})
public void H5Pay(HttpServletRequest request,HttpServletResponse response,String ip) throws IOException, DocumentException{
String value =  String.valueOf(System.currentTimeMillis());//随机生成的微信订单号
SortedMap<String, String> packageParams = new TreeMap<String, String>();
String nonce_str = UUID.randomUUID().toString().replaceAll("-", "");//生成随机32位字符串
String spbill_create_ip = request.getRemoteAddr();//获取客户端的IP,在没有转发的情况下可以用这个获取IP,转发了就不可以了!
        String khdIP = getIpAddr(request);//转发获取客户端IP的方法
packageParams.put("appid", appID);// 公众账号ID
packageParams.put("body", "美人");//商品描述
packageParams.put("mch_id", mchID);//商户号
packageParams.put("nonce_str", nonce_str);//随机字符串
packageParams.put("out_trade_no", value);//订单号
packageParams.put("total_fee", "1");//金额
packageParams.put("spbill_create_ip",khdIP);//客户端IP
packageParams.put("notify_url", h5_notify_url);//回调函数
packageParams.put("trade_type", "MWEB");  //支付类型,H5是MWEB类型
packageParams.put("scene_info", "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"http://g.lotut.com\",\"wap_name\": \"美人\"}}");//场景信息
RequestHandler reqHandler = new RequestHandler(request, response);
reqHandler.init(appID, secret, partnerKey);
String sign = reqHandler.createSign(packageParams);//获取微信签名
Map<Object, Object> params =new HashMap<Object,Object>();
params.put("appid",appID );//同上
params.put("body", "美人");
params.put("mch_id", mchID);
params.put("nonce_str", nonce_str);
params.put("out_trade_no",value);
params.put("total_fee","1" );
params.put("spbill_create_ip",khdIP);
params.put("notify_url", h5_notify_url);
params.put("trade_type", "MWEB");
params.put("scene_info", "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"http://g.lotut.com\",\"wap_name\": \"美人\"}}");
params.put("sign", sign);//添加签名
String xmlStr = WePayInfo.getRequestXml(params);//封装成XML的格式
String responseXml = HttpUtil.excutePostRequest(WePayInfo.INTERFACE_URL, xmlStr);//转发到微信统一下单的接口
Map<String, String> resultMap = WeixinXmlParse.xmlParse(responseXml);//解析微信返回的结果集
String return_code = resultMap.get("return_code");
String return_msg = resultMap.get("return_msg");
if (!PaymentKit.codeIsOK(return_code)) {
log.error("return_code>"+return_code+" return_msg>"+return_msg);
throw new RuntimeException(return_msg);
}
String result_code = resultMap.get("result_code");
if (!PaymentKit.codeIsOK(result_code)) {
log.error("result_code>"+result_code+" return_msg>"+return_msg);
throw new RuntimeException(return_msg);
}
String prepay_id = resultMap.get("prepay_id");
String mweb_url = resultMap.get("mweb_url")+"&redirect_url=https%3A%2F%2Fwww.baidu.com";//后面是添加的回调页面
try {
response.sendRedirect(mweb_url);//转发到微信的支付页面
} catch (IOException e) {
e.printStackTrace();
}
}

@RequestMapping(value = "/pay_notify",method={RequestMethod.POST,RequestMethod.GET})
public String pay_notify(HttpServletRequest request) {
String xmlMsg = HttpKit.readData(request);
Map<String, String> params = PaymentKit.xmlToMap(xmlMsg);
String result_code  = params.get("result_code");
// String openId      = params.get("openid");
// //交易类型
// String trade_type      = params.get("trade_type");
// //付款银行
// String bank_type      = params.get("bank_type");
// // 总金额
// String total_fee     = params.get("total_fee");
// //现金支付金额
// String cash_fee     = params.get("cash_fee");
// // 微信支付订单号
// String transaction_id      = params.get("transaction_id");
// // 商户订单号
String out_trade_no      = params.get("out_trade_no");
// // 支付完成时间,格式为yyyyMMddHHmmss
// String time_end      = params.get("time_end");

/以下是附加参数///

String attach      = params.get("attach");
// String fee_type      = params.get("fee_type");
// String is_subscribe      = params.get("is_subscribe");
// String err_code      = params.get("err_code");
// String err_code_des      = params.get("err_code_des");
// 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态
// 避免已经成功、关闭、退款的订单被再次更新
// Order order = Order.dao.getOrderByTransactionId(transaction_id);
// if (order==null) {
WxPayApiConfigKit.setThreadLocalWxPayApiConfig(getApiConfig());
if(PaymentKit.verifyNotify(params, WxPayApiConfigKit.getWxPayApiConfig().getPaternerKey())){
if (("SUCCESS").equals(result_code)) {
//更新订单信息
//内部订单处理逻辑
//发送通知等
System.out.println("订单已经完成=======================================================");
Map<String, String> xml = new HashMap<String, String>();
xml.put("return_code", "SUCCESS");
xml.put("return_msg", "OK");
return PaymentKit.toXml(xml);
}
}
// }

return null;
}

/** 
 * 获取用户真实IP地址,不使用request.getRemoteAddr()的原因是有可能用户使用了代理软件方式避免真实IP地址, 
 * 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值 
 *  
 * @return ip
 */
private String getIpAddr(HttpServletRequest request) {
   String ip = request.getHeader("x-forwarded-for"); 
   System.out.println("x-forwarded-for ip: " + ip);
   if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {  
       // 多次反向代理后会有多个ip值,第一个ip才是真实ip
       if( ip.indexOf(",")!=-1 ){
           ip = ip.split(",")[0];
       }
   }  
   if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
       ip = request.getHeader("Proxy-Client-IP");  
       System.out.println("Proxy-Client-IP ip: " + ip);
   }  
   if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
       ip = request.getHeader("WL-Proxy-Client-IP");  
       System.out.println("WL-Proxy-Client-IP ip: " + ip);
   }  
   if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
       ip = request.getHeader("HTTP_CLIENT_IP");  
       System.out.println("HTTP_CLIENT_IP ip: " + ip);
   }  
   if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
       ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
       System.out.println("HTTP_X_FORWARDED_FOR ip: " + ip);
   }  
   if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
       ip = request.getHeader("X-Real-IP");  
       System.out.println("X-Real-IP ip: " + ip);
   }  
   if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
       ip = request.getRemoteAddr();  
       System.out.println("getRemoteAddr ip: " + ip);
   } 
   System.out.println("获取客户端ip: " + ip);
   return ip;  
}

微信H5支付demo相关推荐

  1. php微信h5支付demo,微信h5支付 demo-HTML5微信支付DEMO下载 最新版--pc6下载站

    在微信支付已经霸占了大部分人生活习惯的年代,一个不支持微信支付的商家都不好意思开店了,程序猿们可以下载查看HTML5微信支付DEMO来帮助您熟悉微信支付的代码,马上下载查看微信h5支付demo的内容吧 ...

  2. 微信支付—微信H5支付「非微信内部浏览器-QQ/UC浏览器等」

    前言 微信支付-微信H5外部浏览器支付「本文」 微信H5内部浏览器支付「待写」 PC端扫码支付「待写」 一直计划着写一写微信支付相关的文章,希望能加深一下自己的印象,拖了一天又一天- 最近终于空出时间 ...

  3. java微信网页支付_java实现微信H5支付

    原标题:java实现微信H5支付 前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹 ...

  4. h5支付不能打开支付宝 ios_iOS 解决微信h5支付,支付宝h5支付无法直接返回APP的问题...

    由于公司的业务需要,为了节省申请开通微信支付的时间和人力,公司决定使用微信h5支付.这样即节省了时间,同时以后所有的APP都能使用h5支付,既方便又快捷. 但是真正做的时候问题来了,当你支付成功之后或 ...

  5. 微信h5支付python版

    微信h5支付python版 最近闲暇,整理下微信支付,根据官方文档进行的. 官方配置文件这里就不多说了, tornado感觉方便快捷,所以就用这个整理处理一份.经由django改编. 文档结构 进入. ...

  6. 解决iOS微信H5支付跳转微信后不返回App问题(Swift-WKWebview)(转)

    解决iOS微信H5支付跳转微信后不返回App问题(Swift-WKWebview)(转) 参考文章: (1)解决iOS微信H5支付跳转微信后不返回App问题(Swift-WKWebview)(转) ( ...

  7. app 访问h5 如何截取_微信H5支付申请相关问题

    之前的文章「微信支付申请相关问题」里说过微信公众号和 APP 申请微信支付,今天来说下微信 H5 支付的申请. 背景介绍 H5 支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认 ...

  8. Android 应用内微信 H5 支付

    一般情况下,要实现应用内支付接入 App 支付 SDK 即可满足业务需求,不过考虑到对于一些类似游戏中心的场景,更多是需要支持 H5 支付.相对微信来说,支付宝的对接简单完善很多,所以本篇文章主要说说 ...

  9. php根据浏览器调用支付_Android通过外部浏览器调用微信H5支付,Android+PHP详解

    看了好多关于讲解微信H5支付开发的文章,大多数都是通过微信内部浏览器来调用支付接口(其实就是公众号支付),可能是因为H5支付接口刚开放不久吧. 微信官方体验链接:http://wxpay.wxutil ...

最新文章

  1. 201621123069 《Java程序设计》第十一周学习总结
  2. 10 个免费的服务器监控工具推荐
  3. GIT和SVN之间的五个基本区别
  4. 面试疑难点解析:开发工具及框架(一)
  5. 接口隔离原则(设计模式4)
  6. JMeter: org.apache.http.NoHttpResponseException
  7. python操作mongodb语法_python操作mongodb怎么找到所有的集合
  8. php rewinddir(),PHP rewinddir() 函数 ——jQuery中文网
  9. mysql 大表 备份_MySQL大表备份的简单方法
  10. python自动化办公 51cto_利用python实现批量自动化运维脚本案例
  11. hihocode 1336 Matrix Sum 【二维树状数组】
  12. Windows10设置动态桌面壁纸
  13. 固态硬盘 游戏测试软件,固态硬盘检测工具(Intel Solid-State Drive Toolbox)
  14. status计算机语言,status 在c语言中的用法?请高手指教、、、、谢谢
  15. 电脑win7做系统备份
  16. 触摸屏 tsc2007驱动框架
  17. 继承(extends)
  18. 张凯复旦大学计算机学院,徐丰 - 师资队伍 - 复旦大学信息科学与工程学院
  19. 行列式的基本定义与性质(笔记)
  20. 学校计算机网络方案书,学校网络部活动策划书

热门文章

  1. win10系统无法调节亮度
  2. Oracle面试题(概念、定义)
  3. kettle开发篇-去除重复记录+排序记录-Day11
  4. MANIFOLD 2-G 踏坑手册
  5. 中国电信频段测试软件,最全整理!四大运营商频段使用情况
  6. 关于python函数参数的描述中、错误的是_以下关于函数参数的描述,正确的是
  7. python+pywinauto+lackey实现pc端exe自动化
  8. ORA-01555的模拟以及绑定变量
  9. 问题 H: 解密QQ号
  10. 利用泰勒公式编程计算sin(x)