jfinal微信支付
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微信支付的更多相关文章
- 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包
微信支付教程系列之现金红包 最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...
- 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付
微信支付教程系列之扫码支付 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...
- 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付
微信支付教程系列之公众号支付 今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...
- 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送
微信支付之微信模板消息推送 今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...
- Android—基于微信开放平台v3SDK,开发微信支付填坑。
接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束 ...
- 解决新版Android studio导入微信支付和支付宝官方Demo的问题
最近项目要用到支付宝支付和微信支付,本想使用第三方支付框架ping++或者BeeCloud的,但是由于他们的收费问题,让我望而却步,而且公司给了相应的公钥.私钥和APPID等,所以就用下开放平台的呗. ...
- C#开发微信门户及应用(35)--微信支付之企业付款封装操作
在前面几篇随笔,都是介绍微信支付及红包相关的内容,其实支付部分的内容还有很多,例如企业付款.公众号支付或刷卡支付.摇一摇红包.代金券等方面的内容,这些都是微信接口支持的内容,本篇继续微信支付这一主题, ...
- C#开发微信门户及应用(32)--微信支付接入和API封装使用
在微信的应用上,微信支付是一个比较有用的部分,但也是比较复杂的技术要点,在微商大行其道的年代,自己的商店没有增加微信支付好像也说不过去,微信支付旨在为广大微信用户及商户提供更优质的支付服务,微信的支付 ...
- C#开发微信门户及应用(40)--使用微信JSAPI实现微信支付功能
在我前面的几篇博客,有介绍了微信支付.微信红包.企业付款等各种和支付相关的操作,不过上面都是基于微信普通API的封装,本篇随笔继续微信支付这一主题,继续介绍基于微信网页JSAPI的方式发起的微信支付功 ...
随机推荐
- 【pip】【conda】
1.指定python包安裝版本== 指定python包安裝源-i: pip2 -i https://pypi.tuna.tsinghua.edu.cn/simple 2.配置文件换源 vi ~/.p ...
- mysq查询语句包含中文以及中文乱码,字符集 GBK、GB2312、UTF8的区别
一.查看mysql 字符集设置情况 使用Navicat for Mysql查看工具,打开命令列界面,输入show variables like '%char%';如下图,查看当前mysql字符集设置情 ...
- python代码编辑器PyCharm快捷键补充
个人觉得特别有用的: 替换:Ctrl+R 删除当前行 CTRY Y: 复制当前行:Ctrl+D ALT F7: 查找哪些地方使用了选中的方法. ALT UP: 移到上一个方法 ALT DOWN: 移到 ...
- python 2 和python 3的 区别
用户交互 input ps:python2:raw_input python3:input 在 python2里 print不需要加括号也可以打印 子python3里 print 必须加括号才能打印
- s5_day7装饰器作业
# 一:编写函数,(函数执行的时间是随机的) import time import random # def foo(): # time.sleep(random.randrange(1,5)) # ...
- 60. Permutation Sequence(求全排列的第k个排列)
The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
- poj1696 Space Ant
地址: 题目: Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4295 Accepted: 2697 ...
- unity,如何手动或者使用代码更换材质
在unity中,我们可能需要更换怪物的贴图,来达到以下效果 方法1:手动配置 找到自己配置好的扩展名为.mat的文件,在怪物的节点找到带Mesh Render的子元素,将其拖放到如图位置 方法2:代码 ...
- iOS 自定义滑动切换TabbarItem 觉得设计丑也要做出来的UI效果。。。
UI丑却要继续做的感言: 对UI不满意的时候,就会觉得丑爆了,时间长了,却丑习惯了. 论前一阵子Tabbar 多丑,丑得最后不要tabbar了...但是自定义tabbar 和遇到的问题解决的过程可以记 ...
- NIO复习02
Selector 1. Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管 ...