private static final String appid = PropKit.get("appid"); //应用ID
private static final String mch_id = PropKit.get("mch_id"); //商户号
private static final String paternerKey = PropKit.get("paternerkey"); //支付密钥
private static final String notify_url = PropKit.get("notify_url"); //通知地址 public RetKit weixinPay(String ip,String amount,Map<String,Object> map){
// 统一下单文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
//调起微信支付,统一下单
Map<String,String> params = new HashMap<String,String>();
params.put("appid", appid);
params.put("mch_id", mch_id);
params.put("body", "魅格");
params.put("out_trade_no", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+(int)(Math.random()*90000+10000)); //订单编号
params.put("total_fee", amount); //订单金额 单位为分
if(StrKit.isBlank(ip)){
ip = "127.0.0.1";
}
params.put("spbill_create_ip", ip); //终端ip
params.put("trade_type", TradeType.APP.name()); //交易类型app:手机app支付,NATIVE:返回支付连接,可转成二维码客户扫描支付
params.put("nonce_str", System.currentTimeMillis() / 1000 + ""); //随机字符串
params.put("notify_url", notify_url); //支付后通知回调地址
params.put("attach", map.toString()); //附加数据,支付后原数据返回
String sign = PaymentKit.createSign(params, paternerKey); //生成签名
params.put("sign", sign);
//下单
String xmlResult = PaymentApi.pushOrder(params);
System.out.println("下单后结果"+xmlResult);
Map<String,String> result = PaymentKit.xmlToMap(xmlResult); String return_code = result.get("return_code");
String return_msg = result.get("return_msg");
if(StrKit.isBlank(return_code) || !"SUCCESS".equals(return_code)){
return RetKit.fail(return_msg);
} String result_code = result.get("result_code");
if(StrKit.isBlank(result_code) || !"SUCCESS".equals(result_code)){
return RetKit.fail(return_msg);
}
return RetKit.okData(xmlResult);
}

统一下单文档地址

2,支付结果回调,微信不保证会一定返回结果通知,正常会调用多次

获取支付结果

String xmlMsg = HttpKit.readData(getRequest());

public RetKit weixinPay_notify(String xmlMsg){
// 支付结果通用通知文档: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7
System.out.println("支付通知"+xmlMsg);
Map<String,String> result = PaymentKit.xmlToMap(xmlMsg);
String result_code = result.get("result_code");
//总金额
String total_fee = result.get("total_fee");
Double amount = Double.valueOf(total_fee)*0.01;
//商户订单号
String trade_no = result.get("out_trade_no");
//微信支付订单号
String transaction_id = result.get("transaction_id");
//附近数据
String attach = result.get("attach");
//支付完成时间
//String time_end = result.get("time_end");
// 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态
// 避免已经成功、关闭、退款的订单被再次更新
if(PaymentKit.verifyNotify(result, paternerKey)){
if("SUCCESS".equals(result_code)){
//添加各种流水
addBills(attach,Reward.access_weixin, amount.toString(), trade_no, transaction_id);
}
}
return RetKit.ok();
}
支付结果通用通知文档

jfinal微信支付的更多相关文章

  1. 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包

            微信支付教程系列之现金红包           最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...

  2. 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付                  今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...

  3. 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付         今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...

  4. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

  5. Android—基于微信开放平台v3SDK,开发微信支付填坑。

    接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束 ...

  6. 解决新版Android studio导入微信支付和支付宝官方Demo的问题

    最近项目要用到支付宝支付和微信支付,本想使用第三方支付框架ping++或者BeeCloud的,但是由于他们的收费问题,让我望而却步,而且公司给了相应的公钥.私钥和APPID等,所以就用下开放平台的呗. ...

  7. C#开发微信门户及应用(35)--微信支付之企业付款封装操作

    在前面几篇随笔,都是介绍微信支付及红包相关的内容,其实支付部分的内容还有很多,例如企业付款.公众号支付或刷卡支付.摇一摇红包.代金券等方面的内容,这些都是微信接口支持的内容,本篇继续微信支付这一主题, ...

  8. C#开发微信门户及应用(32)--微信支付接入和API封装使用

    在微信的应用上,微信支付是一个比较有用的部分,但也是比较复杂的技术要点,在微商大行其道的年代,自己的商店没有增加微信支付好像也说不过去,微信支付旨在为广大微信用户及商户提供更优质的支付服务,微信的支付 ...

  9. C#开发微信门户及应用(40)--使用微信JSAPI实现微信支付功能

    在我前面的几篇博客,有介绍了微信支付.微信红包.企业付款等各种和支付相关的操作,不过上面都是基于微信普通API的封装,本篇随笔继续微信支付这一主题,继续介绍基于微信网页JSAPI的方式发起的微信支付功 ...

随机推荐

  1. Mysql实现企业级日志管理、备份与恢复

    数据备份形式 文件备份: 通过Linux的备份命令把文件统一打个包存起来,可存在本地和远程服务器,等到要恢复时,再用这些文件恢复到指定位置. 数据库数据备份: 在一些对数据可靠性要求很高的行业如银行. ...

  2. tornado下使用静态文件和文件缓存

    静态文件和文件缓存 1.在应用配置 settings 中指定 static_path 选项来提供静态文件服务:   2.在应用配置 settings 中指定 static_url_prefix 选项来 ...

  3. Dora.Interception, 为.NET Core度身打造的AOP框架:不一样的Interceptor定义方式

    相较于社区其他主流的AOP框架,Dora.Interception在Interceptor提供了完全不同的编程方式.我们并没有为Interceptor定义一个接口,正是因为不需要实现一个预定义的接口, ...

  4. 吴超老师课程--HBASE的集群安装

    1.hbase的机群搭建过程(在原来的hadoop上的hbase伪分布基础上进行搭建)1.1 集群结构,主节点(hmaster)是hadoop,从节点(region server)是hadoop1和h ...

  5. HTML初识(Day46)

    一.HTML初识 1.web服务本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM ...

  6. Django_内置Admin

    Django内置Admin   Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.co ...

  7. rails 单数 复数 大写 小写转换 下划线 驼峰命名

    downcase 变小写 pluralize 复数 singularize 单数 camelcase 驼峰 underscore : “MyScore”.undersocre  ==> my_s ...

  8. Java面向对象—继承

    概述: 1.多个类相同的属性和功能抽取成另一个类, 让具有特有功能的类继承这个类. 2.通过 extends 关键字可以实现类与类的继承 格式: class 子类名 extends 父类名 {} 特点 ...

  9. 如何生成.a文件,小心有坑!!

    .a文件是一种对实现文件细节进行隐藏的打包文件. 由于是打包文件,所以需要创建工程,将功能代码添加到工程.下面是创建.a文件的具体步骤: Step One:打开Xcode(此处使用的Xcode 8.2 ...

  10. Batch Normalization 详解

    一.背景意义 本篇博文主要讲解2015年深度学习领域,非常值得学习的一篇文献:<Batch Normalization: Accelerating Deep Network Training b ...