diff --git a/.classpath b/.classpath deleted file mode 100644 index 23946e41bab16cfef3b36991101103e3324ed60b..0000000000000000000000000000000000000000 --- a/.classpath +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..2959201f4e7cfa0369fef9dadcf0cfa795ec33df --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +*.js linguist-language=java +*.css linguist-language=java +*.html linguist-language=java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..9c55182aaeda0cdfd7ae2daeebb637537d82835b --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +/.idea/* +*/target/ +*.project +*.classpath +*.settings +*.mvn +*.springBeans +.project +roncoo-pay.iml + diff --git a/.project b/.project deleted file mode 100644 index c3fa070a0a1f5e4671640f9b8c4fdacc897f0f4e..0000000000000000000000000000000000000000 --- a/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - roncoo-pay - - - - - - org.eclipse.ui.externaltools.ExternalToolBuilder - full,incremental, - - - LaunchConfigHandle - <project>/.externalToolBuilders/org.eclipse.jdt.core.javabuilder.launch - - - - - org.eclipse.ui.externaltools.ExternalToolBuilder - full,incremental, - - - LaunchConfigHandle - <project>/.externalToolBuilders/org.eclipse.m2e.core.maven2Builder.launch - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/Issue b/Issue new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/README.md b/README.md index 37ae03e54db0cff863ba32d2fa6abf0e651eba4b..5811831c428c691e93a81f0334a81d658b79b3da 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,139 @@ -# 龙果支付系统 +![logo](logo.png "logo") -龙果支付系统是国内首款开源的互联网支付系统,其核心目标是汇聚所有主流支付渠道,打造一款轻量、便捷、易用,且集支付、资金对账、资金清结算于一体的支付系统,满足互联网业务系统的收款和业务资金管理需求。 +# 龙果支付系统 roncoo-pay -######主要特点: +龙果支付系统(roncoo-pay)是国内首款开源的互联网支付系统,拥有独立的账户体系、用户体系、支付接入体系、支付交易体系、对账清结算体系。目标是打造一款集成主流支付方式且轻量易用的支付收款系统,满足互联网业务系统打通支付通道实现支付收款和业务资金管理等功能。 -1. 具备支付系统通用的支付、对账、清算、资金账户管理、支付订单管理等功能; +###### 主要特点: -2. 目前已接通“支付宝即时到账”和“微信扫码支付”通道; +1. 拥有支付系统通用的支付通道接入、用户管理、资金账户管理、对账清算管理、支付订单管理等功能; -3. 支持直连和间连两种支付模式,任君选择; +2. 已接通支付宝支付和微信支付的多种支付方式,满足大部分企业业务系统的支付需求; -4. 通过支付网关,业务系统可以轻松实现统一支付接入; +3. 独立的支付网关接入系统,为下游商户或业务平台提供统一支付接入接口,轻松实现统一支付接入; -5. 搭配运营后台,支付数据的监控和管理可以兼得; +4. 项目代码免费开源且定期更新维护,扩展自由、使用无忧; -6. 配套完善的系统使用文档,可轻松嵌入任何需要支付的场景; +5. 配套完善的系统使用文档、部署文档、视频教程,学习使用更轻松; -7. 龙果支付系统产品技术团队是一支拥有多年第三方支付系统设计研发经验的团队,会为龙果支付系统持续提供商业级的免费开源技术服务支持。 +6. 拥有活跃的产品技术学习交流社群,学习交流更高效; + +7. 由专业的支付系统产品技术团队提供服务支持,专业性及持续性有保障; + +---------------------------------------------------------------------------------- + +###### 应用架构: +![应用架构图](应用架构图.jpg "应用架构图") + +###### 支付流程: +![支付流程图](pay-flow.png "支付流程图") ---------------------------------------------------------------------------------- -######应用架构: -![应用架构](http://git.oschina.net/uploads/images/2016/0726/171546_239efc3b_860625.jpeg "应用架构") +##### 技术框架 +| 技术 | 描述| +|---|--- | +| [Spring Boot](https://spring.io/projects/spring-boot) | 核心框架 | +| [Apache Shiro](http://shiro.apache.org) | 安全框架 | +| [MyBatis](http://www.mybatis.org/mybatis-3/zh/index.html) | ORM框架 | +| [Druid](https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98) | 数据连接池 | +| [Redis](https://redis.io) | 缓存数据库 | +| [Ehcache](http://www.ehcache.org/) | 进程内缓存框架 | +| [Maven](http://maven.apache.org/) | 项目管理 | + +##### 项目结构 +``` +roncoo-pay //龙果支付 +| +├── roncoo-pay-app-notify //商户通知模块 +| +├── roncoo-pay-app-order-polling //订单轮询模块 +| +├── roncoo-pay-app-reconciliation //交易对账模块 +| +├── roncoo-pay-app-settlement //交易结算模块 +| +├── roncoo-pay-common-core //公共基础模块,不需要单独部署 +| +├── roncoo-pay-service //核心业务模块,不需要单独部署 +| +├── roncoo-pay-web-boss //运营后台模块 +| +├── roncoo-pay-web-gateway //支付网关模块 +| +├── roncoo-pay-web-merchant //商户后台模块 +| +├── roncoo-pay-web-sample-shop //模拟商城模块 +``` + +##### 模块介绍 +> roncoo-pay-app-notify + +说明:商户通知模块,把交易成功的订单信息按一定的通知策略通知相应的商户 + +> roncoo-pay-app-order-polling + +说明:订单轮询模块,按制定的查询策略对平台支付中的订单进行结果查询,然后对获取到的订单结果做相应的处理(注意:除了轮询还能通过异步通知获取订单结果进行处理) + +> roncoo-pay-app-reconciliation + +说明:交易对账模块,每天定时对前一天平台的交易订单和银行方(例如:微信、支付宝...)订单进行匹配校验,校验订单状态、手续费、交易金额等 + +> roncoo-pay-app-settlement + +说明:交易结算模块,每天定时对前一天已对完账后确认无误的交易订单进行结算,把钱结算给对应的商家和平台 + +> roncoo-pay-common-core + +说明:公共基础模块,包含公共的工具类、枚举、配置、基础实体、基础DAO层等 + +> roncoo-pay-service + +说明:核心业务模块,整个系统的核心,所有业务功能(下单,查询、账户操作......)的实现,所有web工程和app服务都需要引用该模块 + +> roncoo-pay-web-boss + +说明:运营后台模块,提供对支付系统功能的配置和维护,例如维护银行信息、支付产品,商户信息、费率、交易查询等 + +> roncoo-pay-web-gateway + +说明:支付网关模块,对商家提供对外的网关支付接口(包含支付下单,支付查询......) + +> roncoo-pay-web-merchant + +说明:商户后台模块,提供商户查看交易订单信息 + +> roncoo-pay-web-sample-shop + +说明:模拟商城模块,提供向支付系统发起支付请求的商城,提供测试方法 --------- -在线支付演示:http://demo.pay.roncoo.com +在线演示(后台管理):http://demo.pay.roncoo.com/boss -后台运营管理:http://demo.pay.roncoo.com/boss +在线演示(商户系统): http://demo.pay.roncoo.com/mch -系统操作说明:http://www.roncoo.com/article/detail/124375 +系统操作说明:https://blog.roncoo.com/article/124375 -系统详细介绍:http://www.roncoo.com/article/detail/124373 +系统详细介绍:https://blog.roncoo.com/article/124373 -系统搭建部署:http://www.roncoo.com/article/detail/124511 +系统搭建部署:https://blog.roncoo.com/article/124511 -官方QQ群:287684257,欢迎大家加入,共同探讨互联网金融支付行业业务、技术等。 -![Alt text](http://git.oschina.net/uploads/images/2016/0722/175850_9e020e87_860625.png) +###### 欢迎加群 +QQ群:608537272 - +欢迎加群,共同探讨互联网支付行业的技术经验! +龙果支付系统官网:http://pay.roncoo.net +![logo](logo.png "logo") + + + + + diff --git a/UPDATELOG.md b/UPDATELOG.md index 2185f44137cd5e21ae8f91181a5b55ab411f7293..dcb5142d485fe5fbe432c586a6fb18c7a4856e5b 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -1,3 +1,25 @@ +###### v1.0.2-2017.04.26 +1. 增加支付宝、微信查询接口 +2. 增加订单轮询工程 +3. 增加网关下单后发起订单轮询业务流程 +---------------------------------------------------------------------------------- + +###### v1.0.1-2017.04.05 +1. 修复分页乱码bug +2. 增加支付密码字段、商户服务器IP字段 +3. 商户后台增加结算记录查询 +4. 商户后台增加支付密码修改 +5. 运营后台用户支付配置增加商户安全等级 +6. 网关增加商户服务器IP白名单拦截 +---------------------------------------------------------------------------------- + +###### v1.0.0-2016.9.11 +1. 修复条码支付bug +2. boss后台增加用户手机、密码录入 +3. 增加商户后台系统 + +---------------------------------------------------------------------------------- + ###### v0.0.4-2016.8.15 1. 修复权限模块bug 2. 修改对账模块配置文件路径 diff --git a/database.sql b/database.sql index dd8092029cf8ee9ab38e09745cc12bafb8ed4e1c..6a4873df3ffdf7ffd631373a3930c0e5bbc916b9 100644 --- a/database.sql +++ b/database.sql @@ -609,47 +609,21 @@ create table rp_trade_payment_record alter table rp_trade_payment_record comment '支付记录表'; -CREATE TABLE seq_table (SEQ_NAME varchar(50) NOT NULL, CURRENT_VALUE bigint DEFAULT '1000000002' NOT NULL, INCREMENT smallint DEFAULT '1' NOT NULL, REMARK varchar(100) NOT NULL, PRIMARY KEY (SEQ_NAME)) ENGINE=InnoDB DEFAULT CHARSET=utf8; -INSERT INTO seq_table (SEQ_NAME, CURRENT_VALUE, INCREMENT, REMARK) VALUES ('ACCOUNT_NO_SEQ', 10000000, 1, '账户--账户编号'); -INSERT INTO seq_table (SEQ_NAME, CURRENT_VALUE, INCREMENT, REMARK) VALUES ('ACTIVITY_NO_SEQ', 10000006, 1, '活动--活动编号'); -INSERT INTO seq_table (SEQ_NAME, CURRENT_VALUE, INCREMENT, REMARK) VALUES ('USER_NO_SEQ', 10001113, 1, '用户--用户编号'); -INSERT INTO seq_table (SEQ_NAME, CURRENT_VALUE, INCREMENT, REMARK) VALUES ('TRX_NO_SEQ', 10000000, 1, '交易—-支付流水号'); -INSERT INTO seq_table (SEQ_NAME, CURRENT_VALUE, INCREMENT, REMARK) VALUES ('BANK_ORDER_NO_SEQ', 10000000, 1, '交易—-银行订单号'); -INSERT INTO seq_table (SEQ_NAME, CURRENT_VALUE, INCREMENT, REMARK) VALUES ('RECONCILIATION_BATCH_NO_SEQ', 10000000, 1, '对账—-批次号'); +-- CREATE TABLE seq_table (SEQ_NAME varchar(50) NOT NULL, CURRENT_VALUE bigint DEFAULT '1000000002' NOT NULL, INCREMENT smallint DEFAULT '1' NOT NULL, REMARK varchar(100) NOT NULL, PRIMARY KEY (SEQ_NAME)) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- INSERT INTO seq_table (SEQ_NAME, CURRENT_VALUE, INCREMENT, REMARK) VALUES ('ACCOUNT_NO_SEQ', 10000000, 1, '账户--账户编号'); +-- INSERT INTO seq_table (SEQ_NAME, CURRENT_VALUE, INCREMENT, REMARK) VALUES ('ACTIVITY_NO_SEQ', 10000006, 1, '活动--活动编号'); +-- INSERT INTO seq_table (SEQ_NAME, CURRENT_VALUE, INCREMENT, REMARK) VALUES ('USER_NO_SEQ', 10001113, 1, '用户--用户编号'); +-- INSERT INTO seq_table (SEQ_NAME, CURRENT_VALUE, INCREMENT, REMARK) VALUES ('TRX_NO_SEQ', 10000000, 1, '交易—-支付流水号'); +-- INSERT INTO seq_table (SEQ_NAME, CURRENT_VALUE, INCREMENT, REMARK) VALUES ('BANK_ORDER_NO_SEQ', 10000000, 1, '交易—-银行订单号'); +-- INSERT INTO seq_table (SEQ_NAME, CURRENT_VALUE, INCREMENT, REMARK) VALUES ('RECONCILIATION_BATCH_NO_SEQ', 10000000, 1, '对账—-批次号'); /*==============================================================*/ /* create function */ /*==============================================================*/ -CREATE FUNCTION `FUN_SEQ`(SEQ VARCHAR(50)) RETURNS BIGINT(20) -BEGIN - UPDATE SEQ_TABLE - SET CURRENT_VALUE = CURRENT_VALUE + INCREMENT - WHERE SEQ_NAME=SEQ; - RETURN FUN_SEQ_CURRENT_VALUE(SEQ); -END; - - -CREATE FUNCTION `FUN_SEQ_CURRENT_VALUE`(SEQ VARCHAR(50)) RETURNS BIGINT(20) -BEGIN - DECLARE VALUE INTEGER; - SET VALUE=0; - SELECT CURRENT_VALUE INTO VALUE - FROM SEQ_TABLE - WHERE SEQ_NAME=SEQ; - RETURN VALUE; -END; - -CREATE FUNCTION `FUN_SEQ_SET_VALUE`(SEQ VARCHAR(50), VALUE INTEGER) RETURNS BIGINT(20) -BEGIN - UPDATE SEQ_TABLE - SET CURRENT_VALUE=VALUE - WHERE SEQ_NAME=SEQ; - RETURN FUN_SEQ_CURRENT_VALUE(SEQ); -END; CREATE FUNCTION FUN_NOW() RETURNS DATETIME -BEGIN +BEGIN RETURN now(); END; @@ -852,7 +826,7 @@ alter table pms_role_permission comment '权限与角色关联表'; -- ------------------------------step 1 菜单------------------------------------------------- -- 菜单初始化数据 -- -- 菜单的初始化数据 -insert into pms_menu (id,version,status,creater,create_time, editor, edit_time, remark, name, url, number, is_leaf, level, parent_id, target_name) values +insert into pms_menu (id,version,status,creater,create_time, editor, edit_time, remark, name, url, number, is_leaf, level, parent_id, target_name) values (1,0, 'ACTIVE','roncoo','2016-06-03 11:07:43', 'admin','2016-06-03 11:07:43', '', '权限管理', '##', '001', 'NO', 1, 0, '#'), (2,0, 'ACTIVE','roncoo','2016-06-03 11:07:43', 'admin','2016-06-03 11:07:43', '', '菜单管理', 'pms/menu/list', '00101', 'YES', 2, 1, 'cdgl'), (3,0, 'ACTIVE','roncoo','2016-06-03 11:07:43', 'admin','2016-06-03 11:07:43', '', '权限管理', 'pms/permission/list', '00102', 'YES',2, 1, 'qxgl'), @@ -863,7 +837,6 @@ insert into pms_menu (id,version,status,creater,create_time, editor, edit_time, (12,0, 'ACTIVE','roncoo','2016-06-03 11:07:43', 'admin','2016-06-03 11:07:43', '', '账户信息', 'account/list', '00201', 'YES',2, 10, 'zhxx'), (13,0, 'ACTIVE','roncoo','2016-06-03 11:07:43', 'admin','2016-06-03 11:07:43', '', '账户历史信息', 'account/historyList', '00202', 'YES',2, 10, 'zhlsxx'), - (20,0, 'ACTIVE','roncoo','2016-06-03 11:07:43', 'admin','2016-06-03 11:07:43', '', '用户管理', '##', '003', 'NO', 1, 0, '#'), (22,0, 'ACTIVE','roncoo','2016-06-03 11:07:43', 'admin','2016-06-03 11:07:43', '', '用户信息', 'user/info/list', '00301', 'YES',2, 20, 'yhxx'), @@ -874,6 +847,7 @@ insert into pms_menu (id,version,status,creater,create_time, editor, edit_time, (40,0, 'ACTIVE','roncoo','2016-06-03 11:07:43', 'admin','2016-06-03 11:07:43', '', '交易管理', '##', '005', 'NO', 1, 0, '#'), (42,0, 'ACTIVE','roncoo','2016-06-03 11:07:43', 'admin','2016-06-03 11:07:43', '', '支付订单管理', 'trade/listPaymentOrder', '00501', 'YES',2, 40, 'zfddgl'), (43,0, 'ACTIVE','roncoo','2016-06-03 11:07:43', 'admin','2016-06-03 11:07:43', '', '支付记录管理', 'trade/listPaymentRecord', '00502', 'YES',2, 40, 'zfjjgl'), +(47,0, 'ACTIVE','roncoo','2016-06-03 11:07:43', 'admin','2016-06-03 11:07:43', '', '进件记录管理', '/trade/micro/submit/record/list', '00107', 'YES',2, 40, 'jjjlgl'), (50,0, 'ACTIVE','roncoo','2016-06-03 11:07:43', 'admin','2016-06-03 11:07:43', '', '结算管理', '##', '006', 'NO', 1, 0, '#'), (52,0, 'ACTIVE','roncoo','2016-06-03 11:07:43', 'admin','2016-06-03 11:07:43', '', '结算记录管理', 'sett/list', '00601', 'YES',2, 50, 'jsjlgl'), @@ -887,7 +861,7 @@ insert into pms_menu (id,version,status,creater,create_time, editor, edit_time, -- 权限功能点的初始化数据 -insert into pms_permission (id,version,status,creater,create_time, editor, edit_time, remark, permission_name, permission) values +insert into pms_permission (id,version,status,creater,create_time, editor, edit_time, remark, permission_name, permission) values (1, 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'test', '2016-06-03 11:07:43','权限管理-菜单-查看','权限管理-菜单-查看','pms:menu:view'), (2, 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'test', '2016-06-03 11:07:43','权限管理-菜单-添加','权限管理-菜单-添加','pms:menu:add'), (3, 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'test', '2016-06-03 11:07:43','权限管理-菜单-查看','权限管理-菜单-修改','pms:menu:edit'), @@ -966,24 +940,28 @@ insert into pms_permission (id,version,status,creater,create_time, editor, edit_ (151, 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'test', '2016-06-03 11:07:43','对账管理-缓冲池-查看','对账管理-缓冲池-查看','recon:scratchPool:view'), (152, 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'test', '2016-06-03 11:07:43','对账管理-缓冲池-添加','对账管理-缓冲池-添加','recon:scratchPool:add'), (153, 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'test', '2016-06-03 11:07:43','对账管理-缓冲池-查看','对账管理-缓冲池-修改','recon:scratchPool:edit'), - (154, 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'test', '2016-06-03 11:07:43','对账管理-缓冲池-删除','对账管理-缓冲池-删除','recon:scratchPool:delete'); + (154, 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'test', '2016-06-03 11:07:43','对账管理-缓冲池-删除','对账管理-缓冲池-删除','recon:scratchPool:delete'), + + (266, 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'test', '2016-06-03 11:07:43','进件记录管理--查看','进件记录管理--查看','trade:micro:submit:record:list'), + (267, 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'test', '2016-06-03 11:07:43','进件记录管理--添加','进件记录管理--添加','trade:micro:submit:record:add'), + (268, 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'test', '2016-06-03 11:07:43','进件记录管理--查询','进件记录管理--查询','trade:micro:submit:record:query'); -- -----------------------------------step3:操作员-------------------------------------------- -- -- 操作员的初始化数据 -- admin 超级管理员 -insert into pms_operator (id,version,status,creater,create_time, editor, edit_time, remark, login_name, login_pwd,real_name,mobile_no,type,salt) +insert into pms_operator (id,version,status,creater,create_time, editor, edit_time, remark, login_name, login_pwd,real_name,mobile_no,type,salt) values (1, 0, 'ACTIVE','roncoo','2016-06-03 11:07:43', 'admin','2016-06-03 11:07:43', '超级管理员', 'admin', 'd3c59d25033dbf980d29554025c23a75','超级管理员', '18620936193', 'ADMIN','8d78869f470951332959580424d4bf4f'); -- guest 游客 -insert into pms_operator (id,version,status,creater,create_time, editor, edit_time, remark, login_name, login_pwd,real_name,mobile_no,type,salt) +insert into pms_operator (id,version,status,creater,create_time, editor, edit_time, remark, login_name, login_pwd,real_name,mobile_no,type,salt) values (2, 0, 'ACTIVE','roncoo','2016-06-03 11:07:43', 'guest','2016-06-03 11:07:43', '游客', 'guest', '3f0dbf580ee39ec03b632cb33935a363','游客', '18926215592', 'USER','183d9f2f0f2ce760e98427a5603d1c73'); -- ------------------------------------step4:角色------------------------------------------- -- -- 角色的初始化数据 -insert into pms_role (id,version,status,creater,create_time, editor, edit_time, remark, role_code, role_name) +insert into pms_role (id,version,status,creater,create_time, editor, edit_time, remark, role_code, role_name) values (1, 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'admin', '2016-06-03 11:07:43','超级管理员角色','admin', '超级管理员角色'); -insert into pms_role (id,version,status,creater,create_time, editor, edit_time, remark, role_code, role_name) +insert into pms_role (id,version,status,creater,create_time, editor, edit_time, remark, role_code, role_name) values (2, 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'guest', '2016-06-03 11:07:43','游客角色','guest', '游客角色'); -- ------------------------------------step5:操作员和角色关联------------------------------------------- @@ -1004,8 +982,8 @@ insert into pms_role_permission (role_id, permission_id) select 1,id from PMS_P -- guest (只有所有的查看权限) -insert into pms_role_permission (version,status,creater,create_time, editor, edit_time, remark,role_id,permission_id) -values +insert into pms_role_permission (version,status,creater,create_time, editor, edit_time, remark,role_id,permission_id) +values ( 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'test', '2016-06-03 11:07:43','',2,1), ( 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'test', '2016-06-03 11:07:43','',2,11), ( 0,'ACTIVE', 'roncoo','2016-06-03 11:07:43', 'test', '2016-06-03 11:07:43','',2,21), @@ -1036,5 +1014,52 @@ insert into pms_menu_role (role_id, menu_id) select 2,id from PMS_MENU; -- 2016.8.5 第三方支付信息表增加支付宝线下产品字段 alter table rp_user_pay_info add offline_app_id varchar(50); alter table rp_user_pay_info add rsa_private_key varchar(100); -alter table rp_user_pay_info add rsa_public_key varchar(100); +alter table rp_user_pay_info add rsa_public_key varchar(100); +-- 2016.9.5 增加登录信息字段 +alter table rp_user_info add mobile varchar(15); +alter table rp_user_info add password varchar(50); + +-- 2017.4.4 用户信息表增加支付密码字段 +alter table rp_user_info add pay_pwd varchar(50) comment '支付密码' default '123456'; + +-- 2017.4.5 增加用户支付配置表安全等级字段 商户服务器IP字段 +alter table rp_user_pay_config add security_rating varchar(20) comment '安全等级' default 'MD5'; + +alter table rp_user_pay_config add merchant_server_ip varchar(200) comment '商户服务器IP'; + +/*==============================小微商户进件==start=================================*/ +drop table if exists rp_micro_submit_record; +create table rp_micro_submit_record +( + id varchar(50) not null comment '编号', + version int(11) not null default 0 comment '版本号', + create_time datetime not null comment '创建时间', + creater varchar(100) comment '创建者', + edit_time datetime not null comment '修改时间', + editor varchar(100) comment '修改者', + status varchar(50) not null comment '状态', + business_code varchar(32) not null comment '业务申请编号', + sub_mch_id varchar(32) comment '小微商户号', + id_card_copy varchar(256) not null comment '身份证人像面照片', + id_card_national varchar(256) not null comment '身份证国徽面照片', + id_card_name varchar(64) not null comment '身份证姓名', + id_card_number varchar(18) not null comment '身份证号码', + id_card_valid_time varchar(50) not null comment '身份证有效期限', + account_bank varchar(50) not null comment '开户名称', + bank_address_code varchar(6) not null comment '开户银行省市编码', + account_number varchar(50) not null comment '银行账号', + store_name varchar(128) not null comment '门店名称', + store_address_code varchar(6) not null comment '门店省市编码', + store_street varchar(500) not null comment '门店街道名称', + store_entrance_pic varchar(256) not null comment '门店门口照片', + indoor_pic varchar(256) not null comment '店内环境照片', + merchant_shortname varchar(50) not null comment '商户简称', + service_phone varchar(50) not null comment '客服电话', + product_desc varchar(50) not null comment '服务描述', + rate varchar(50) not null comment '费率', + contact_phone varchar(11) not null comment '手机号码', + primary key (id) +); +alter table rp_micro_submit_record comment '小微商户进件记录'; +/*==============================小微商户进件==end=================================*/ diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9874e8f3d7ba7d045b2bb19fe45a271e8d68b98b Binary files /dev/null and b/logo.png differ diff --git a/pay-flow.png b/pay-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..0e98e3025c2b7c6089564f09185b509b28a6072d Binary files /dev/null and b/pay-flow.png differ diff --git a/pom.xml b/pom.xml index a248b2efb15d1d584526dab67708025e1c67da07..c78acf4b21d25f3fde40c4ff1a0d3dea910581ba 100644 --- a/pom.xml +++ b/pom.xml @@ -1,35 +1,50 @@ - + 4.0.0 - com.roncoo.pay.common + + org.springframework.boot + spring-boot-starter-parent + 2.1.2.RELEASE + + + + com.roncoo.pay roncoo-pay - 0.0.4-SNAPSHOT + 2.1.2-SNAPSHOT pom roncoo-pay - http://maven.apache.org + 龙果开源支付 Roncoo http://www.roncoo.com + - - roncoo-pay-common-core - - roncoo-pay-web-boss - - roncoo-pay-app-reconciliation - + roncoo-pay-app-notify - + + roncoo-pay-app-order-polling + + roncoo-pay-app-reconciliation + roncoo-pay-app-settlement - - roncoo-pay-web-gateway - + + roncoo-pay-common-core + roncoo-pay-service + + roncoo-pay-web-boss + + roncoo-pay-web-gateway + + roncoo-pay-web-merchant + + roncoo-pay-web-sample-shop @@ -46,388 +61,132 @@ + - UTF-8 + 2.0.0 + 1.2.56 + 1.1.13 + 3.4.49.ALL + + + 1.4.2 + + 1.8.0-beta2 + 1.8.0-beta2 + 1.2.17 - - 4.11 - 3.2.4.RELEASE - 1.3.0 - 3.4.0 - 1.7.21 - 1.2.17 - 3.2.2 - 1.5.4 - 1.8.9 - 5.1.30 - 1.4 - 1.2 - 1.0.19 - 1.2.11 - 7.0 2.6 - 2.5 + 3.1 + 1.6.1 2.0.2 - 5.11.4 - 3.12.1.GA - 1.1 - + 1.1.4 + 2.6 + 4.5.7 + 1.8 + + - junit - junit - ${junit.version} - - test - - - - - org.springframework - spring-core - ${spring.version} - - - - org.springframework - spring-aop - ${spring.version} - - - - org.springframework - spring-aspects - ${spring.version} - - - org.springframework - spring-beans - ${spring.version} - - - org.springframework - spring-context - ${spring.version} - - - org.springframework - spring-context-support - ${spring.version} - - - org.springframework - spring-expression - ${spring.version} - - - org.springframework - spring-instrument - ${spring.version} - - - org.springframework - spring-instrument-tomcat - ${spring.version} - - - org.springframework - spring-jdbc - ${spring.version} - - - org.springframework - spring-jms - ${spring.version} - - - org.springframework - spring-orm - ${spring.version} - - - org.springframework - spring-oxm - ${spring.version} - - - org.springframework - spring-test - ${spring.version} - test - - - org.springframework - spring-tx - ${spring.version} - - - org.springframework - spring-web - ${spring.version} - - - org.springframework - spring-webmvc - ${spring.version} - - - org.springframework - spring-webmvc-portlet - ${spring.version} - - - - - - - aspectj - aspectjrt - ${aspectjrt.version} - - - org.aspectj - aspectjweaver - ${aspectjweaver.version} - - - - - - - org.mybatis - mybatis - ${mybatis.version} - - - org.mybatis - mybatis-spring - ${mybatis-spring.version} - - - - - - org.slf4j - slf4j-api - ${slf4j_version} - - - org.slf4j - slf4j-log4j12 - ${slf4j_version} - - - log4j - log4j - ${log4j_version} - - - - javassist - javassist - ${javassist.version} - - - javax.transaction - jta - ${transaction.version} - - - - - - - mysql - mysql-connector-java - ${mysql.version} - - - - commons-dbcp - commons-dbcp - ${dbcp.version} + com.roncoo.pay.common + roncoo-pay-common-core + ${project.version} - - - - - - javax - javaee-api - ${javaee-api.version} - - - cglib - cglib - ${cglib.version} + com.roncoo.pay.service + roncoo-pay-service + ${project.version} + - jstl - jstl - ${jstl.version} + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis-spring-boot-starter.version} - com.alibaba - druid - ${druid.version} + com.baomidou + mybatis-plus + 2.1.0 + com.alibaba fastjson ${fastjson.version} - - - commons-lang - commons-lang - ${commons-lang.version} - - - - commons-io - commons-io - ${commons-io.version} - - - - commons-codec - commons-codec - 1.10 + com.alibaba + druid + ${druid.version} - - - commons-configuration - commons-configuration - 1.10 + com.alipay.sdk + alipay-sdk-java + ${alipay-sdk-java.version} - + - com.google.zxing - core - 2.1 + org.apache.shiro + shiro-core + ${org.apache.shiro.version} - - - com.google.code.gson - gson - 2.3.1 + org.apache.shiro + shiro-web + ${org.apache.shiro.version} - - - - org.hamcrest - hamcrest-core - 1.3 + org.apache.shiro + shiro-spring + ${org.apache.shiro.version} - - alipay - alipay-trade-sdk - 1.0 + org.apache.shiro + shiro-ehcache + ${org.apache.shiro.version} + - alipay - alipay-sdk-java20151021120052 - 1.0 + commons-lang + commons-lang + ${commons-lang.version} - - jaxen - jaxen - 1.1.6 + commons-httpclient + commons-httpclient + ${commons-httpclient.version} - - javax.validation - validation-api - 1.0.0.GA + dom4j + dom4j + ${dom4j.version} - - org.hibernate - hibernate-validator - 4.2.0.Final + org.jdom + jdom + ${jdom.version} - - org.apache.activemq - activemq-all - ${activeMQ.version} + javax.json + javax.json-api + ${javax.json-api.version} - org.apache.activemq - activemq-pool - ${activeMQ.version} + commons-io + commons-io + ${commons-io.version} - - org.jdom - jdom - ${jdom.version} - - - - - - - org.apache.maven.plugins - maven-deploy-plugin - 2.7 - - false - - - - org.apache.maven.plugins - maven-eclipse-plugin - 2.8 - - - org.apache.maven.plugins - maven-compiler-plugin - 3.2 - - true - true - true - -nowarn - 1.7 - 1.7 - UTF-8 - - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - attach-sources - - jar - - - - - - - @@ -458,4 +217,4 @@ +8 - \ No newline at end of file + diff --git a/roncoo-pay-app-notify/.classpath b/roncoo-pay-app-notify/.classpath deleted file mode 100644 index b71a35bb8e7c1fd7d73625e12222df0b71c5a1ab..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-notify/.classpath +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/roncoo-pay-app-notify/.gitignore b/roncoo-pay-app-notify/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..c456c4a3ad64e41cb40d64cf0ed1cfa63e4ebac4 --- /dev/null +++ b/roncoo-pay-app-notify/.gitignore @@ -0,0 +1,25 @@ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ diff --git a/roncoo-pay-app-notify/.project b/roncoo-pay-app-notify/.project deleted file mode 100644 index b8b9dc8b7b9ccf29d0e5c199d19b18836038385a..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-notify/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - roncoo-app-notify - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/roncoo-pay-app-notify/pom.xml b/roncoo-pay-app-notify/pom.xml index 7bb6bb5168509bf61d376eba130a9379a2627825..427cf09d6ff0c3434ee76159aa9d32d6d32ffac2 100644 --- a/roncoo-pay-app-notify/pom.xml +++ b/roncoo-pay-app-notify/pom.xml @@ -1,154 +1,49 @@ - 4.0.0 - - com.roncoo.pay.common - roncoo-pay - 0.0.4-SNAPSHOT - - com.roncoo.pay.common - roncoo-pay-app-notify - 0.0.4-SNAPSHOT - roncoo-app-notify - http://maven.apache.org - - UTF-8 - - - - - com.roncoo.pay.common - roncoo-pay-common-core - ${project.parent.version} - - - - com.roncoo.pay.service - roncoo-pay-service - ${project.parent.version} - - - - commons-pool - commons-pool - 1.6 - - - - junit - junit - 3.8.1 - test - - - - - roncoo-pay-app-notify - - - ${project.build.directory}/classes - src/main/resources - true - - **/*.xml - **/*.properties - - - - ${project.build.directory}/classes/META-INF/spring - src/main/resources/spring - true - - spring-context.xml - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - - target/classes/ - - - com.roncoo.pay.app.notify.App - - false - true - lib/ - - - . - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - package - - copy-dependencies - - - jar - jar - - ${project.build.directory}/lib - - - - - - - - org.apache.maven.plugins - maven-deploy-plugin - 2.7 - - false - - - - org.apache.maven.plugins - maven-eclipse-plugin - 2.8 - - - org.apache.maven.plugins - maven-compiler-plugin - 3.2 - - true - true - true - -nowarn - 1.7 - 1.7 - UTF-8 - - - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - attach-sources - - jar - - - - - - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + 4.0.0 + + + com.roncoo.pay + roncoo-pay + 2.1.2-SNAPSHOT + + + com.roncoo.pay + roncoo-pay-app-notify + + roncoo-app-notify + 平台通知消息的处理 + + + UTF-8 + + + + + com.roncoo.pay.service + roncoo-pay-service + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + + + + + ${project.name} + + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/AppNotifyApplication.java b/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/AppNotifyApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..acc4f0a935fb61dd7c8ae8fcc3b7d176ad131512 --- /dev/null +++ b/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/AppNotifyApplication.java @@ -0,0 +1,133 @@ +package com.roncoo.pay; + +import com.roncoo.pay.app.notify.core.NotifyPersist; +import com.roncoo.pay.app.notify.core.NotifyQueue; +import com.roncoo.pay.app.notify.core.NotifyTask; +import com.roncoo.pay.common.core.page.PageBean; +import com.roncoo.pay.common.core.page.PageParam; +import com.roncoo.pay.notify.entity.RpNotifyRecord; +import com.roncoo.pay.notify.service.RpNotifyService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.WebApplicationType; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import javax.annotation.PostConstruct; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.DelayQueue; + +@SpringBootApplication +public class AppNotifyApplication { + + private static final Log LOG = LogFactory.getLog(AppNotifyApplication.class); + + public static DelayQueue tasks = new DelayQueue(); + + @Autowired + private ThreadPoolTaskExecutor threadPool; + @Autowired + public RpNotifyService rpNotifyService; + @Autowired + private NotifyQueue notifyQueue; + @Autowired + public NotifyPersist notifyPersist; + + + private static ThreadPoolTaskExecutor cacheThreadPool; + + public static RpNotifyService cacheRpNotifyService; + + private static NotifyQueue cacheNotifyQueue; + + public static NotifyPersist cacheNotifyPersist; + + public static void main(String[] args) { +// SpringApplication.run(AppNotifyApplication.class, args); + new SpringApplicationBuilder().sources(AppNotifyApplication.class).web(WebApplicationType.NONE).run(args); + } + + @PostConstruct + public void init() { + cacheThreadPool = threadPool; + cacheRpNotifyService = rpNotifyService; + cacheNotifyQueue = notifyQueue; + cacheNotifyPersist = notifyPersist; + + startInitFromDB(); + startThread(); + } + + private static void startThread() { + LOG.info("startThread"); + + cacheThreadPool.execute(new Runnable() { + public void run() { + try { + while (true) { + Thread.sleep(50);//50毫秒执行一次 + // 如果当前活动线程等于最大线程,那么不执行 + if (cacheThreadPool.getActiveCount() < cacheThreadPool.getMaxPoolSize()) { + final NotifyTask task = tasks.poll(); + if (task != null) { + cacheThreadPool.execute(new Runnable() { + public void run() { + LOG.info(cacheThreadPool.getActiveCount() + "---------"); + tasks.remove(task); + task.run(); + } + }); + } + } + } + } catch (Exception e) { + LOG.error("系统异常", e); + e.printStackTrace(); + } + } + }); + } + + /** + * 从数据库中取一次数据用来当系统启动时初始化 + */ + @SuppressWarnings("unchecked") + private static void startInitFromDB() { + LOG.info("get data from database"); + + int pageNum = 1; + int numPerPage = 500; + PageParam pageParam = new PageParam(pageNum, numPerPage); + + // 查询状态和通知次数符合以下条件的数据进行通知 + String[] status = new String[]{"101", "102", "200", "201"}; + Integer[] notifyTime = new Integer[]{0, 1, 2, 3, 4}; + // 组装查询条件 + Map paramMap = new HashMap(); + paramMap.put("statusList", status); + paramMap.put("notifyTimeList", notifyTime); + + PageBean pager = cacheRpNotifyService.queryNotifyRecordListPage(pageParam, paramMap); + int totalSize = (pager.getNumPerPage() - 1) / numPerPage + 1;//总页数 + while (pageNum <= totalSize) { + List list = pager.getRecordList(); + for (int i = 0; i < list.size(); i++) { + RpNotifyRecord notifyRecord = list.get(i); + notifyRecord.setLastNotifyTime(new Date()); + cacheNotifyQueue.addElementToList(notifyRecord); + } + pageNum++; + LOG.info(String.format("调用通知服务.rpNotifyService.queryNotifyRecordListPage(%s, %s, %s)", pageNum, numPerPage, paramMap)); + pageParam = new PageParam(pageNum, numPerPage); + pager = cacheRpNotifyService.queryNotifyRecordListPage(pageParam, paramMap); + } + } + + +} + diff --git a/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/app/notify/App.java b/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/app/notify/App.java deleted file mode 100644 index 04f1af5ac82f4791e0f28cfa4f312896ff9263bd..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/app/notify/App.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.roncoo.pay.app.notify; - -import com.roncoo.pay.app.notify.core.NotifyPersist; -import com.roncoo.pay.app.notify.core.NotifyQueue; -import com.roncoo.pay.app.notify.core.NotifyTask; -import com.roncoo.pay.common.core.page.PageBean; -import com.roncoo.pay.common.core.page.PageParam; -import com.roncoo.pay.notify.entity.RpNotifyRecord; -import com.roncoo.pay.notify.service.RpNotifyService; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.context.support.ClassPathXmlApplicationContext; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.DelayQueue; - -/** - * 功能说明:消息APP启动类 - * - * @author Peter - * 龙果学院(www.roncoo.com) - */ -public class App -{ - private static final Log LOG = LogFactory.getLog(App.class); - - public static DelayQueue tasks = new DelayQueue(); - - private static ClassPathXmlApplicationContext context; - - private static ThreadPoolTaskExecutor threadPool; - - public static RpNotifyService rpNotifyService; - - private static NotifyQueue notifyQueue; - - public static NotifyPersist notifyPersist; - - public static void main(String[] args) { - try { - context = new ClassPathXmlApplicationContext(new String[] { "spring/spring-context.xml" }); - context.start(); - threadPool = (ThreadPoolTaskExecutor) context.getBean("threadPool"); - rpNotifyService = (RpNotifyService) context.getBean("rpNotifyService"); - notifyQueue = (NotifyQueue) context.getBean("notifyQueue"); - notifyPersist = (NotifyPersist) context.getBean("notifyPersist"); - startInitFromDB(); - startThread(); - LOG.info("== context start"); - } catch (Exception e) { - LOG.error("== application start error:", e); - return; - } - synchronized (App.class) { - while (true) { - try { - App.class.wait(); - } catch (InterruptedException e) { - LOG.error("== synchronized error:", e); - } - } - } - } - - private static void startThread() { - LOG.info("startThread"); - - threadPool.execute(new Runnable() { - public void run() { - try { - while (true) { - Thread.sleep(50);//50毫秒执行一次 - // 如果当前活动线程等于最大线程,那么不执行 - if (threadPool.getActiveCount() < threadPool.getMaxPoolSize()) { - final NotifyTask task = tasks.poll(); - if (task != null) { - threadPool.execute(new Runnable() { - public void run() { - LOG.info(threadPool.getActiveCount() + "---------"); - tasks.remove(task); - task.run(); - } - }); - } - } - } - } catch (Exception e) { - LOG.error("系统异常",e); - e.printStackTrace(); - } - } - }); - } - - /** - * 从数据库中取一次数据用来当系统启动时初始化 - */ - @SuppressWarnings("unchecked") - private static void startInitFromDB() { - LOG.info("get data from database"); - - int pageNum = 1; - int numPerPage = 500; - PageParam pageParam = new PageParam(pageNum, numPerPage); - - // 查询状态和通知次数符合以下条件的数据进行通知 - String[] status = new String[] { "101", "102", "200", "201" }; - Integer[] notifyTime = new Integer[] { 0, 1, 2, 3, 4 }; - // 组装查询条件 - Map paramMap = new HashMap(); - paramMap.put("statusList", status); - paramMap.put("notifyTimeList", notifyTime); - - PageBean pager = rpNotifyService.queryNotifyRecordListPage(pageParam, paramMap); - int totalSize = (pager.getNumPerPage()-1)/numPerPage+1;//总页数 - while (pageNum <= totalSize) { - List list = pager.getRecordList(); - for (int i = 0; i < list.size(); i++) { - RpNotifyRecord notifyRecord = list.get(i); - notifyRecord.setLastNotifyTime(new Date()); - notifyQueue.addElementToList(notifyRecord); - } - pageNum++; - LOG.info(String.format("调用通知服务.rpNotifyService.queryNotifyRecordListPage(%s, %s, %s)", pageNum, numPerPage, paramMap)); - pageParam = new PageParam(pageNum, numPerPage); - pager = rpNotifyService.queryNotifyRecordListPage(pageParam, paramMap); - } - } - -} diff --git a/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/app/notify/core/NotifyQueue.java b/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/app/notify/core/NotifyQueue.java index d14eb7aa7b6c025e144a5484e0bdd7a3514b7847..62f5ac21a28601a4036aa2650d75be21653ed200 100644 --- a/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/app/notify/core/NotifyQueue.java +++ b/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/app/notify/core/NotifyQueue.java @@ -15,11 +15,10 @@ */ package com.roncoo.pay.app.notify.core; -import com.roncoo.pay.app.notify.App; +import com.roncoo.pay.AppNotifyApplication; import com.roncoo.pay.app.notify.entity.NotifyParam; import com.roncoo.pay.notify.entity.RpNotifyRecord; import com.roncoo.pay.notify.enums.NotifyStatusEnum; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -78,7 +77,7 @@ public class NotifyQueue implements Serializable { if (next != null) { time += 1000 * 60 * next + 1; notifyRecord.setLastNotifyTime(new Date(time)); - App.tasks.put(new NotifyTask(notifyRecord, this, notifyParam)); + AppNotifyApplication.tasks.put(new NotifyTask(notifyRecord, this, notifyParam)); } } else { try { diff --git a/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/app/notify/core/NotifyTask.java b/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/app/notify/core/NotifyTask.java index 4bb1aa1f3e3d51e8973390711f6cc41c0947980e..6acc94d700e72e3f54e026bea5f3a8c33db70afb 100644 --- a/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/app/notify/core/NotifyTask.java +++ b/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/app/notify/core/NotifyTask.java @@ -16,7 +16,7 @@ package com.roncoo.pay.app.notify.core; import com.alibaba.fastjson.JSONObject; -import com.roncoo.pay.app.notify.App; +import com.roncoo.pay.AppNotifyApplication; import com.roncoo.pay.app.notify.entity.NotifyParam; import com.roncoo.pay.common.core.exception.BizException; import com.roncoo.pay.notify.entity.RpNotifyRecord; @@ -48,7 +48,7 @@ public class NotifyTask implements Runnable, Delayed { private NotifyParam notifyParam; - private NotifyPersist notifyPersist = App.notifyPersist; + private NotifyPersist notifyPersist = AppNotifyApplication.cacheNotifyPersist; public NotifyTask() { } diff --git a/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/app/notify/message/ConsumerSessionAwareMessageListener.java b/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/app/notify/message/ConsumerSessionAwareMessageListener.java index 9e51e56a59aea827b9886c2c1151a91adf20369f..ad0fd2937d3cbc7fc063e78fc1dc62a0ee61caa9 100644 --- a/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/app/notify/message/ConsumerSessionAwareMessageListener.java +++ b/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/app/notify/message/ConsumerSessionAwareMessageListener.java @@ -28,6 +28,7 @@ import org.apache.activemq.command.ActiveMQTextMessage; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import javax.jms.Message; import javax.jms.MessageListener; @@ -36,10 +37,12 @@ import java.util.Date; /** * 功能说明: * - * @author Peter + * + * @author Peter * 龙果学院(www.roncoo.com) */ -public class ConsumerSessionAwareMessageListener implements MessageListener { +@Component("consumerSessionAwareMessageListener") +public class ConsumerSessionAwareMessageListener implements MessageListener { private static final Log log = LogFactory.getLog(ConsumerSessionAwareMessageListener.class); @@ -52,7 +55,7 @@ public class ConsumerSessionAwareMessageListener implements MessageListener { @Autowired private NotifyPersist notifyPersist; - @SuppressWarnings("static-access") + @Override public void onMessage(Message message) { try { ActiveMQTextMessage msg = (ActiveMQTextMessage) message; @@ -69,9 +72,9 @@ public class ConsumerSessionAwareMessageListener implements MessageListener { notifyRecord.setCreateTime(new Date()); notifyRecord.setLastNotifyTime(new Date()); - if ( !StringUtil.isEmpty(notifyRecord.getId())){ + if (!StringUtil.isEmpty(notifyRecord.getId())) { RpNotifyRecord notifyRecordById = rpNotifyService.getNotifyRecordById(notifyRecord.getId()); - if (notifyRecordById != null){ + if (notifyRecordById != null) { return; } } @@ -87,7 +90,7 @@ public class ConsumerSessionAwareMessageListener implements MessageListener { // 添加到通知队列 notifyQueue.addElementToList(notifyRecord); - } catch (BizException e) { + } catch (BizException e) { log.error("BizException :", e); } catch (Exception e) { log.error(e); diff --git a/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/config/ActiveMqListenerConfig.java b/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/config/ActiveMqListenerConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..85707a766dbfd8f9f73a2bbb5e458ae776a9d649 --- /dev/null +++ b/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/config/ActiveMqListenerConfig.java @@ -0,0 +1,46 @@ +package com.roncoo.pay.config; + +import com.roncoo.pay.app.notify.message.ConsumerSessionAwareMessageListener; +import org.apache.activemq.command.ActiveMQQueue; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.jms.connection.SingleConnectionFactory; +import org.springframework.jms.listener.DefaultMessageListenerContainer; + +@Configuration +@PropertySource("classpath:mq_config.properties") +public class ActiveMqListenerConfig { + + @Value("${tradeQueueName.notify}") + private String tradeQueueDestinationName; + + /** + * 队列目的地 + * + * @return 队列目的地 + */ + @Bean(name = "tradeQueueDestination") + public ActiveMQQueue tradeQueueDestination() { + return new ActiveMQQueue(tradeQueueDestinationName); + } + + /** + * 消息监听容器 + * + * @param singleConnectionFactory 连接工厂 + * @param tradeQueueDestination 消息目的地 + * @param consumerSessionAwareMessageListener 监听器实现 + * @return 消息监听容器 + */ + @Bean(name = "tradeQueueMessageListenerContainer") + public DefaultMessageListenerContainer tradeQueueMessageListenerContainer(@Qualifier("connectionFactory") SingleConnectionFactory singleConnectionFactory, @Qualifier("tradeQueueDestination") ActiveMQQueue tradeQueueDestination, @Qualifier("consumerSessionAwareMessageListener") ConsumerSessionAwareMessageListener consumerSessionAwareMessageListener) { + DefaultMessageListenerContainer messageListenerContainer = new DefaultMessageListenerContainer(); + messageListenerContainer.setConnectionFactory(singleConnectionFactory); + messageListenerContainer.setMessageListener(consumerSessionAwareMessageListener); + messageListenerContainer.setDestination(tradeQueueDestination); + return messageListenerContainer; + } +} diff --git a/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/config/NotifyConfig.java b/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/config/NotifyConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..eca1145597179a1969a5a04c33227038175a317c --- /dev/null +++ b/roncoo-pay-app-notify/src/main/java/com/roncoo/pay/config/NotifyConfig.java @@ -0,0 +1,37 @@ +package com.roncoo.pay.config; + +import com.roncoo.pay.app.notify.entity.NotifyParam; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class NotifyConfig { + + @Bean(name = "threadPool") + public ThreadPoolTaskExecutor threadPoolTaskExecutor() { + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); + threadPoolTaskExecutor.setCorePoolSize(2); + threadPoolTaskExecutor.setKeepAliveSeconds(10000); + threadPoolTaskExecutor.setMaxPoolSize(5); + threadPoolTaskExecutor.setQueueCapacity(50); + return threadPoolTaskExecutor; + } + + @Bean(name = "notifyParam") + public NotifyParam notifyParam() { + NotifyParam notifyParam = new NotifyParam(); + Map notifyParams = new HashMap<>(); + notifyParams.put(1, 0); + notifyParams.put(2, 1); + notifyParams.put(3, 2); + notifyParams.put(4, 5); + notifyParams.put(5, 15); + notifyParam.setNotifyParams(notifyParams); + notifyParam.setSuccessValue("success"); + return notifyParam; + } +} diff --git a/roncoo-pay-app-notify/src/main/resources/application.yml b/roncoo-pay-app-notify/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..c8420dc33776a15517fe983f0c69611aede41b9f --- /dev/null +++ b/roncoo-pay-app-notify/src/main/resources/application.yml @@ -0,0 +1,12 @@ +server: + port: 8095 + servlet: + session: + timeout: 30 +spring: + application: + name: roncoo-pay-app-notify +logging: + config: classpath:logback.xml +mybatis: + mapper-locations: classpath*:mybatis/mapper/**/*.xml \ No newline at end of file diff --git a/roncoo-pay-app-notify/src/main/resources/log4j.properties b/roncoo-pay-app-notify/src/main/resources/log4j.properties deleted file mode 100644 index 871086cf8d86b09e05852fd46e7a25b7525d9307..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-notify/src/main/resources/log4j.properties +++ /dev/null @@ -1,28 +0,0 @@ -#\u5F00\u53D1\u65E5\u5FD7\u5C06\u5728\u672C\u5730\u8F93\u51FA\uFF0C\u5E76\u8F93\u51FASQL - -log4j.rootLogger=${log4j.leve},A1,DRF -log4j.appender.A1=org.apache.log4j.ConsoleAppender -log4j.appender.A1.layout=org.apache.log4j.PatternLayout -# log4j.appender.A1.layout.ConversionPattern=%d %5p [%t] (%F:%L) - %m%n -log4j.appender.A1.layout.ConversionPattern=%d %5p [%F:%L] : %m%n - -log4j.appender.DRF=org.apache.log4j.DailyRollingFileAppender -log4j.appender.DRF.Threshold=${log4j.leve} -log4j.appender.DRF.DatePattern='.'yyyy-MM-dd -log4j.appender.DRF.File=logs/roncoo-pay-app-queue-notify.log -log4j.appender.DRF.Append=true -log4j.appender.DRF.layout=org.apache.log4j.PatternLayout -log4j.appender.DRF.layout.ConversionPattern=[%-5p][%d{yyyyMMdd HH:mm:ss,SSS}][%C{1}:%L] %m%n - - -###\u8F93\u51FASQL -log4j.logger.com.ibatis=${log4j.ale} -log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=${log4j.ale} -log4j.logger.com.ibatis.common.jdbc.ScriptRunner=${log4j.ale} -log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=${log4j.ale} -log4j.logger.java.sql.Connection=${log4j.ale} -log4j.logger.java.sql.Statement=${log4j.ale} -log4j.logger.java.sql.PreparedStatement=${log4j.ale} -log4j.logger.com.alibaba.dubbo=${log4j.ale} - - diff --git a/roncoo-pay-app-notify/src/main/resources/logback.xml b/roncoo-pay-app-notify/src/main/resources/logback.xml new file mode 100644 index 0000000000000000000000000000000000000000..94acd8336fc9aef5edf3e1a797794c01ed5c98b4 --- /dev/null +++ b/roncoo-pay-app-notify/src/main/resources/logback.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + ${PATTERN} + + + + + + ${FILE_PATH}/${APPLICATION_NAME}/${APPLICATION_NAME}.log + + ${FILE_PATH}/${APPLICATION_NAME}/${APPLICATION_NAME}.%d{yyyy-MM-dd}.log + + 100 + + + ${PATTERN} + + + + + + + + + + + diff --git a/roncoo-pay-app-notify/src/main/resources/spring/spring-activemq.xml b/roncoo-pay-app-notify/src/main/resources/spring/spring-activemq.xml deleted file mode 100644 index e411d4f5794bb1d782de2312b69b19d4183d5af9..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-notify/src/main/resources/spring/spring-activemq.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - tradeNotify - - - - - - - - - - - diff --git a/roncoo-pay-app-notify/src/main/resources/spring/spring-context.xml b/roncoo-pay-app-notify/src/main/resources/spring/spring-context.xml deleted file mode 100644 index ade97c9a512cda6739a536b21777887755bdb127..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-notify/src/main/resources/spring/spring-context.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/roncoo-pay-app-notify/src/main/resources/spring/spring-notify.xml b/roncoo-pay-app-notify/src/main/resources/spring/spring-notify.xml deleted file mode 100644 index 80d25bcbc04dbc182e3a271f96f98d5f33d4aebc..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-notify/src/main/resources/spring/spring-notify.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/roncoo-pay-app-notify/src/test/java/com/roncoo/app/notify/AppTest.java b/roncoo-pay-app-notify/src/test/java/com/roncoo/app/notify/AppTest.java deleted file mode 100644 index fe2a20c1c2767bd422fec23ae780ff2d51db4487..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-notify/src/test/java/com/roncoo/app/notify/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.roncoo.app.notify; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/roncoo-pay-app-order-polling/.gitignore b/roncoo-pay-app-order-polling/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..c456c4a3ad64e41cb40d64cf0ed1cfa63e4ebac4 --- /dev/null +++ b/roncoo-pay-app-order-polling/.gitignore @@ -0,0 +1,25 @@ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ diff --git a/roncoo-pay-app-order-polling/pom.xml b/roncoo-pay-app-order-polling/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..08d389c43f93deba45ece7370fe76dfed9efb473 --- /dev/null +++ b/roncoo-pay-app-order-polling/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + + com.roncoo.pay + roncoo-pay + 2.1.2-SNAPSHOT + + + com.roncoo.pay + roncoo-pay-app-order-polling + + roncoo-pay-app-order-polling + 对账流程app,发起对账核心业务 + + + UTF-8 + + + + + com.roncoo.pay.service + roncoo-pay-service + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + + + + + ${project.name} + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/AppOrderPollingApplication.java b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/AppOrderPollingApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..10a05e406cf2a5342534ba96a16656cb1c7d2305 --- /dev/null +++ b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/AppOrderPollingApplication.java @@ -0,0 +1,78 @@ +package com.roncoo.pay; + +import com.roncoo.pay.app.polling.core.PollingPersist; +import com.roncoo.pay.app.polling.core.PollingTask; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.WebApplicationType; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import javax.annotation.PostConstruct; +import java.util.concurrent.DelayQueue; + +@SpringBootApplication +public class AppOrderPollingApplication { + + private static final Log LOG = LogFactory.getLog(AppOrderPollingApplication.class); + + public static DelayQueue tasks = new DelayQueue(); + + @Autowired + private ThreadPoolTaskExecutor threadPool; + @Autowired + public PollingPersist pollingPersist; + + private static ThreadPoolTaskExecutor cacheThreadPool; + + public static PollingPersist cachePollingPersist; + + public static void main(String[] args) { +// SpringApplication.run(AppOrderPollingApplication.class, args); + new SpringApplicationBuilder().sources(AppOrderPollingApplication.class).web(WebApplicationType.NONE).run(args); + } + + @PostConstruct + public void init() { + cacheThreadPool = threadPool; + cachePollingPersist = pollingPersist; + + startThread(); + + } + + private void startThread() { + LOG.info("==>startThread"); + + cacheThreadPool.execute(new Runnable() { + public void run() { + try { + while (true) { + Thread.sleep(100); + LOG.info("==>threadPool.getActiveCount():" + cacheThreadPool.getActiveCount()); + LOG.info("==>threadPool.getMaxPoolSize():" + cacheThreadPool.getMaxPoolSize()); + // 如果当前活动线程等于最大线程,那么不执行 + if (cacheThreadPool.getActiveCount() < cacheThreadPool.getMaxPoolSize()) { + LOG.info("==>tasks.size():" + tasks.size()); + final PollingTask task = tasks.take(); //使用take方法获取过期任务,如果获取不到,就一直等待,知道获取到数据 + if (task != null) { + cacheThreadPool.execute(new Runnable() { + public void run() { + tasks.remove(task); + task.run(); // 执行通知处理 + LOG.info("==>tasks.size():" + tasks.size()); + } + }); + } + } + } + } catch (Exception e) { + LOG.error("系统异常;", e); + } + } + }); + } +} + diff --git a/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/app/polling/core/PollingPersist.java b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/app/polling/core/PollingPersist.java new file mode 100644 index 0000000000000000000000000000000000000000..d9699c13c71bb208ba568fcf3876ec36ab23945b --- /dev/null +++ b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/app/polling/core/PollingPersist.java @@ -0,0 +1,95 @@ +/* + * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.roncoo.pay.app.polling.core; + +import com.roncoo.pay.common.core.exception.BizException; +import com.roncoo.pay.notify.entity.RpOrderResultQueryVo; +import com.roncoo.pay.trade.service.RpTradePaymentManagerService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +/** + * 功能说明: + * + * @author Peter + * 龙果学院(www.roncoo.com) + */ +@Service("pollingPersist") +public class PollingPersist { + + private static final Logger LOG = LoggerFactory.getLogger(PollingPersist.class); + + @Autowired + private PollingQueue pollingQueue; + + @Autowired + private RpTradePaymentManagerService rpTradePaymentManagerService; + + /** + * 获取订单结果 + * @param rpOrderResultQueryVo + */ + public void getOrderResult(RpOrderResultQueryVo rpOrderResultQueryVo){ + Integer notifyTimes = rpOrderResultQueryVo.getNotifyTimes(); // 得到当前通知对象的通知次数 + Integer maxNotifyTimes = rpOrderResultQueryVo.getLimitNotifyTimes(); // 最大通知次数 + Date notifyTime = new Date(); // 本次通知的时间 + rpOrderResultQueryVo.setEditTime(notifyTime); // 取本次通知时间作为最后修改时间 + rpOrderResultQueryVo.setNotifyTimes(notifyTimes + 1); // 通知次数+1 + + LOG.info("notifyTimes:{} , maxNotifyTimes:{} " ,notifyTimes , maxNotifyTimes); + try{ + boolean processingResult = rpTradePaymentManagerService.processingTradeRecord(rpOrderResultQueryVo.getBankOrderNo()); + + LOG.info("order processing result:{}" ,processingResult); + if (!processingResult){//返回失败,说明还未支付 + // 通知不成功(返回的结果不是success) + if (rpOrderResultQueryVo.getNotifyTimes() < maxNotifyTimes) { + // 判断是否超过重发次数,未超重发次数的,再次进入延迟发送队列 + pollingQueue.addToNotifyTaskDelayQueue(rpOrderResultQueryVo); + LOG.info("===>bank order {} need processing again ", rpOrderResultQueryVo.getBankOrderNo()); + } else { + LOG.info("bank order No {} not pay" , rpOrderResultQueryVo.getBankOrderNo()); + } + } + + }catch (BizException e){ + LOG.error("订单处理业务异常:", e); + if (rpOrderResultQueryVo.getNotifyTimes() < maxNotifyTimes) { + // 判断是否超过重发次数,未超重发次数的,再次进入延迟发送队列 + pollingQueue.addToNotifyTaskDelayQueue(rpOrderResultQueryVo); + LOG.info("===>bank order {} need processing again ", rpOrderResultQueryVo.getBankOrderNo()); + } else { + LOG.info("bank order No {} not pay" , rpOrderResultQueryVo.getBankOrderNo()); + } + }catch (Exception e){ + LOG.error("订单处理系统异常:", e); + if (rpOrderResultQueryVo.getNotifyTimes() < maxNotifyTimes) { + // 判断是否超过重发次数,未超重发次数的,再次进入延迟发送队列 + pollingQueue.addToNotifyTaskDelayQueue(rpOrderResultQueryVo); + LOG.info("===>bank order {} need processing again ", rpOrderResultQueryVo.getBankOrderNo()); + } else { + LOG.info("bank order No {} not pay" , rpOrderResultQueryVo.getBankOrderNo()); + } + } + } + + + +} diff --git a/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/app/polling/core/PollingQueue.java b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/app/polling/core/PollingQueue.java new file mode 100644 index 0000000000000000000000000000000000000000..37ea67093e8b25ad2d6104eac25157acec02f40d --- /dev/null +++ b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/app/polling/core/PollingQueue.java @@ -0,0 +1,71 @@ +/* + * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.roncoo.pay.app.polling.core; + + +import com.roncoo.pay.AppOrderPollingApplication; +import com.roncoo.pay.common.core.utils.DateUtils; +import com.roncoo.pay.notify.entity.RpOrderResultQueryVo; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.stereotype.Component; + +import java.io.Serializable; +import java.util.Date; + +/** + * 功能说明: + * + * @author Peter + * 龙果学院(www.roncoo.com) + */ +@Component +public class PollingQueue implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + private static final Log LOG = LogFactory.getLog(PollingQueue.class); + + /** + * 将传过来的对象进行通知次数判断,决定是否放在任务队列中.
+ * @param rpOrderResultQueryVo + * @throws Exception + */ + public void addToNotifyTaskDelayQueue(RpOrderResultQueryVo rpOrderResultQueryVo) { + if (rpOrderResultQueryVo == null) { + return; + } + LOG.info("===>addToOrderQueryTaskDelayQueue bank order no:" + rpOrderResultQueryVo.getBankOrderNo()); + Integer notifyTimes = rpOrderResultQueryVo.getNotifyTimes(); // 通知次数 + Integer maxNotifyTimes = rpOrderResultQueryVo.getLimitNotifyTimes(); // 最大通知次数 + + if (rpOrderResultQueryVo.getNotifyTimes().intValue() == 0) { + rpOrderResultQueryVo.setLastNotifyTime(new Date()); // 第一次发送(取当前时间) + }else{ + rpOrderResultQueryVo.setLastNotifyTime(rpOrderResultQueryVo.getEditTime()); // 非第一次发送(取上一次修改时间,也是上一次发送时间) + } + + if (notifyTimes < maxNotifyTimes) { + // 未超过最大通知次数,继续下一次通知 + LOG.info("===>bank order No " + rpOrderResultQueryVo.getBankOrderNo() + ", 上次通知时间lastNotifyTime:" + DateUtils.formatDate(rpOrderResultQueryVo.getLastNotifyTime(), "yyyy-MM-dd HH:mm:ss SSS")); + AppOrderPollingApplication.tasks.put(new PollingTask(rpOrderResultQueryVo)); + } + + } +} diff --git a/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/app/polling/core/PollingTask.java b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/app/polling/core/PollingTask.java new file mode 100644 index 0000000000000000000000000000000000000000..fe41f70f8719404c8c9dd0e74cc191961415768e --- /dev/null +++ b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/app/polling/core/PollingTask.java @@ -0,0 +1,90 @@ +/* + * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.roncoo.pay.app.polling.core; + +import com.roncoo.pay.AppOrderPollingApplication; +import com.roncoo.pay.common.core.utils.DateUtils; +import com.roncoo.pay.notify.entity.RpOrderResultQueryVo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; +import java.util.concurrent.Delayed; +import java.util.concurrent.TimeUnit; + +/** + * 功能说明: + * + * + * @author Peter + * 龙果学院(www.roncoo.com) + */ +public class PollingTask implements Runnable, Delayed { + + private static final Logger LOG = LoggerFactory.getLogger(PollingTask.class); + + private long executeTime; + + private PollingPersist pollingPersist = AppOrderPollingApplication.cachePollingPersist; + + private RpOrderResultQueryVo rpOrderResultQueryVo; + + public PollingTask() { + } + + public PollingTask(RpOrderResultQueryVo rpOrderResultQueryVo) { + super(); + this.rpOrderResultQueryVo = rpOrderResultQueryVo; + this.executeTime = getExecuteTime(rpOrderResultQueryVo); + } + + /** + * 计算任务允许执行的开始时间(executeTime).
+ * + * @param rpOrderResultQueryVo + * @return + */ + private long getExecuteTime(RpOrderResultQueryVo rpOrderResultQueryVo) { + long lastNotifyTime = rpOrderResultQueryVo.getLastNotifyTime().getTime(); // 最后通知时间(上次通知时间) + Integer notifyTimes = rpOrderResultQueryVo.getNotifyTimes(); // 已通知次数 + LOG.info("===>pollingTimes:{}", notifyTimes); + //Integer nextNotifyTimeInterval = pollingParam.getNotifyParams().get(notifyTimes + 1); // 当前发送次数对应的时间间隔数(分钟数) + Integer nextNotifyTimeInterval = rpOrderResultQueryVo.getNotifyRuleMap().get(notifyTimes + 1); // 当前发送次数对应的时间间隔数(分钟数) + long nextNotifyTime = (nextNotifyTimeInterval == null ? 0 : nextNotifyTimeInterval * 1000) + lastNotifyTime; + LOG.info("===>notify id:{}, nextNotifyTime:{}", rpOrderResultQueryVo.getId(), DateUtils.formatDate(new Date(nextNotifyTime), "yyyy-MM-dd HH:mm:ss SSS")); + return nextNotifyTime; + } + + /** + * 比较当前时间(task.executeTime)与任务允许执行的开始时间(executeTime).
+ * 如果当前时间到了或超过任务允许执行的开始时间,那么就返回-1,可以执行。 + */ + public int compareTo(Delayed o) { + PollingTask task = (PollingTask) o; + return executeTime > task.executeTime ? 1 : (executeTime < task.executeTime ? -1 : 0); + } + + public long getDelay(TimeUnit unit) { + return unit.convert(executeTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS); + } + + /** + * 执行通知处理. + */ + public void run() { + pollingPersist.getOrderResult(rpOrderResultQueryVo); + } +} diff --git a/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/app/polling/entity/PollingParam.java b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/app/polling/entity/PollingParam.java new file mode 100644 index 0000000000000000000000000000000000000000..1915b842e59b79d51c0ab0beb1cb75f9e1644da1 --- /dev/null +++ b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/app/polling/entity/PollingParam.java @@ -0,0 +1,62 @@ +/* + * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.roncoo.pay.app.polling.entity; + +import java.util.Map; + +/** + * 功能说明: + * + * @author Peter + * 龙果学院(www.roncoo.com) + */ +public class PollingParam { + + /** + * 通知参数(通知规则Map) + */ + private Map notifyParams; + + /** + * 通知后用于判断是否成功的返回值(成功标识),由HttpResponse获取 + */ + private String successValue; + + public Map getNotifyParams() { + return notifyParams; + } + + public void setNotifyParams(Map notifyParams) { + this.notifyParams = notifyParams; + } + + public String getSuccessValue() { + return successValue; + } + + public void setSuccessValue(String successValue) { + this.successValue = successValue; + } + + /** + * 最大通知次数限制. + * @return + */ + public Integer getMaxNotifyTimes() { + return notifyParams == null ? 0 : notifyParams.size(); + } + +} diff --git a/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/app/polling/listener/PollingMessageListener.java b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/app/polling/listener/PollingMessageListener.java new file mode 100644 index 0000000000000000000000000000000000000000..92fe6362d608b08a7f895eb3fdf620102262c054 --- /dev/null +++ b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/app/polling/listener/PollingMessageListener.java @@ -0,0 +1,82 @@ +/* + * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.roncoo.pay.app.polling.listener; + +import com.alibaba.fastjson.JSONObject; +import com.roncoo.pay.app.polling.core.PollingQueue; +import com.roncoo.pay.app.polling.entity.PollingParam; +import com.roncoo.pay.common.core.exception.BizException; +import com.roncoo.pay.notify.entity.RpOrderResultQueryVo; +import com.roncoo.pay.notify.enums.NotifyStatusEnum; +import org.apache.activemq.command.ActiveMQTextMessage; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.jms.Message; +import javax.jms.MessageListener; +import java.util.Date; +import java.util.Map; + +/** + * + * @author wujing + */ +@Component("pollingMessageListener") +public class PollingMessageListener implements MessageListener { + private static final Log log = LogFactory.getLog(PollingMessageListener.class); + + @Autowired + private PollingQueue pollingQueue; + + @Autowired + private PollingParam pollingParam; + + @Override + public void onMessage(Message message) { + try { + ActiveMQTextMessage msg = (ActiveMQTextMessage) message; + final String msgText = msg.getText(); + log.info("== receive bankOrderNo :" + msgText); + + RpOrderResultQueryVo rpOrderResultQueryVo = new RpOrderResultQueryVo(); + + rpOrderResultQueryVo.setBankOrderNo(msgText); + rpOrderResultQueryVo.setStatus(NotifyStatusEnum.CREATED.name()); + rpOrderResultQueryVo.setCreateTime(new Date()); + rpOrderResultQueryVo.setEditTime(new Date()); + rpOrderResultQueryVo.setLastNotifyTime(new Date()); + rpOrderResultQueryVo.setNotifyTimes(0); // 初始化通知0次 + rpOrderResultQueryVo.setLimitNotifyTimes(pollingParam.getMaxNotifyTimes()); // 最大通知次数 + Map notifyParams = pollingParam.getNotifyParams(); + rpOrderResultQueryVo.setNotifyRule(JSONObject.toJSONString(notifyParams)); // 保存JSON + + try { + + pollingQueue.addToNotifyTaskDelayQueue(rpOrderResultQueryVo); // 添加到通知队列(第一次通知) + + } catch (BizException e) { + log.error("BizException :", e); + } catch (Exception e) { + log.error(e); + } + } catch (Exception e) { + log.error(e); + } + } + +} diff --git a/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/config/ActiveMqListenerConfig.java b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/config/ActiveMqListenerConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..084917b9a5f8f92d4beec4472050deeb09999bf6 --- /dev/null +++ b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/config/ActiveMqListenerConfig.java @@ -0,0 +1,48 @@ +package com.roncoo.pay.config; + +import com.roncoo.pay.app.polling.listener.PollingMessageListener; +import org.apache.activemq.command.ActiveMQQueue; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.jms.connection.SingleConnectionFactory; +import org.springframework.jms.listener.DefaultMessageListenerContainer; + +@Configuration +@PropertySource("classpath:mq_config.properties") +public class ActiveMqListenerConfig { + + @Value("${orderQueryQueueName.query}") + private String orderQueryQueueDestinationName; + + /** + * 队列目的地 + * + * @return 队列目的地 + */ + @Bean(name = "orderQueryQueueDestination") + public ActiveMQQueue orderQueryQueueDestination() { + return new ActiveMQQueue(orderQueryQueueDestinationName); + } + + /** + * 消息监听容器 + * + * @param singleConnectionFactory 连接工厂 + * @param orderQueryQueueDestination 消息目的地 + * @param pollingMessageListener 监听器实现 + * @return 消息监听容器 + */ + @Bean(name = "orderQueryQueueMessageListenerContainer") + public DefaultMessageListenerContainer orderQueryQueueMessageListenerContainer(@Qualifier("connectionFactory") SingleConnectionFactory singleConnectionFactory, @Qualifier("orderQueryQueueDestination") ActiveMQQueue orderQueryQueueDestination, @Qualifier("pollingMessageListener") PollingMessageListener pollingMessageListener) { + DefaultMessageListenerContainer messageListenerContainer = new DefaultMessageListenerContainer(); + messageListenerContainer.setConnectionFactory(singleConnectionFactory); + messageListenerContainer.setDestination(orderQueryQueueDestination); + messageListenerContainer.setMessageListener(pollingMessageListener); + return messageListenerContainer; + } + + +} diff --git a/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/config/PollingConfig.java b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/config/PollingConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..6ce7282dfd094f09ba85e2d8d10f7c801f713daa --- /dev/null +++ b/roncoo-pay-app-order-polling/src/main/java/com/roncoo/pay/config/PollingConfig.java @@ -0,0 +1,38 @@ +package com.roncoo.pay.config; + +import com.roncoo.pay.app.polling.entity.PollingParam; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class PollingConfig { + + @Bean(name = "threadPool") + public ThreadPoolTaskExecutor threadPoolTaskExecutor() { + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); + threadPoolTaskExecutor.setCorePoolSize(2); + threadPoolTaskExecutor.setKeepAliveSeconds(10000); + threadPoolTaskExecutor.setMaxPoolSize(5); + threadPoolTaskExecutor.setQueueCapacity(50); + return threadPoolTaskExecutor; + } + + @Bean(name = "pollingParam") + public PollingParam pollingParam() { + PollingParam pollingParam = new PollingParam(); + Map notifyParams = new HashMap<>(); + notifyParams.put(1, 2); + notifyParams.put(2, 3); + notifyParams.put(3, 5); + notifyParams.put(4, 10); + notifyParams.put(5, 20); + notifyParams.put(6, 30); + pollingParam.setNotifyParams(notifyParams); + pollingParam.setSuccessValue("SUCCESS"); + return pollingParam; + } +} diff --git a/roncoo-pay-app-order-polling/src/main/resources/application.yml b/roncoo-pay-app-order-polling/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..41f330d4dd6c0bebd8134d1779db0effecdeae67 --- /dev/null +++ b/roncoo-pay-app-order-polling/src/main/resources/application.yml @@ -0,0 +1,12 @@ +server: + port: 8096 + servlet: + session: + timeout: 30 +spring: + application: + name: roncoo-pay-app-order-polling +logging: + config: classpath:logback.xml +mybatis: + mapper-locations: classpath*:mybatis/mapper/**/*.xml diff --git a/roncoo-pay-app-order-polling/src/main/resources/logback.xml b/roncoo-pay-app-order-polling/src/main/resources/logback.xml new file mode 100644 index 0000000000000000000000000000000000000000..66a2e9564d9fc74e64771672bfbefd4556e4946d --- /dev/null +++ b/roncoo-pay-app-order-polling/src/main/resources/logback.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + ${PATTERN} + + + + + + ${FILE_PATH}/${APPLICATION_NAME}/${APPLICATION_NAME}.log + + ${FILE_PATH}/${APPLICATION_NAME}/${APPLICATION_NAME}.%d{yyyy-MM-dd}.log + + 100 + + + ${PATTERN} + + + + + + + + + + + diff --git a/roncoo-pay-app-reconciliation/.classpath b/roncoo-pay-app-reconciliation/.classpath deleted file mode 100644 index 937b4f0d67a8b7ad83e99268860e656cb406fcdc..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-reconciliation/.classpath +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/roncoo-pay-app-reconciliation/.gitignore b/roncoo-pay-app-reconciliation/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..c456c4a3ad64e41cb40d64cf0ed1cfa63e4ebac4 --- /dev/null +++ b/roncoo-pay-app-reconciliation/.gitignore @@ -0,0 +1,25 @@ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ diff --git a/roncoo-pay-app-reconciliation/.project b/roncoo-pay-app-reconciliation/.project deleted file mode 100644 index daa808eb05066e5195ebb1c7a197eb8c047c75d2..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-reconciliation/.project +++ /dev/null @@ -1,30 +0,0 @@ - - - roncoo-app-reconciliation - - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.genuitec.eclipse.springframework.springbuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.sonar.ide.eclipse.core.sonarNature - com.genuitec.eclipse.springframework.springnature - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/roncoo-pay-app-reconciliation/pom.xml b/roncoo-pay-app-reconciliation/pom.xml index 8183ad49a561bf937e5028ed1b4fe3815a7db41a..3893c94ce925594c137206d85a2867d54057baca 100644 --- a/roncoo-pay-app-reconciliation/pom.xml +++ b/roncoo-pay-app-reconciliation/pom.xml @@ -1,135 +1,52 @@ 4.0.0 + - com.roncoo.pay.common + com.roncoo.pay roncoo-pay - 0.0.4-SNAPSHOT + 2.1.2-SNAPSHOT - com.roncoo.pay.app + + com.roncoo.pay roncoo-pay-app-reconciliation roncoo-pay-app-reconciliation - http://maven.apache.org + 对账流程app,发起对账核心业务 UTF-8 - - - com.roncoo.pay.common - roncoo-pay-common-core - ${project.parent.version} - - - com.roncoo.pay.service roncoo-pay-service - ${project.parent.version} - - - junit - junit - - test + org.springframework.boot + spring-boot-starter-web + + commons-io + commons-io + + + org.springframework.boot + spring-boot-devtools + runtime + - - roncoo-pay-app-reconciliation + ${project.name} - - - - org.apache.maven.plugins - maven-jar-plugin - - target/classes/ - - - com.roncoo.pay.app.reconciliation.ReconciliationTask - - false - true - lib/ - - - . - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - package - - copy-dependencies - - - jar - jar - - ${project.build.directory}/lib - - - - - - - - org.apache.maven.plugins - maven-deploy-plugin - 2.7 - - false - - - - org.apache.maven.plugins - maven-eclipse-plugin - 2.8 - - - org.apache.maven.plugins - maven-compiler-plugin - 3.2 - - true - true - true - -nowarn - 1.7 - 1.7 - UTF-8 - - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - attach-sources - - jar - - - + org.springframework.boot + spring-boot-maven-plugin diff --git a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/AppReconciliationApplication.java b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/AppReconciliationApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..e431acd6cf67f164acdb145a8de8322be3968349 --- /dev/null +++ b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/AppReconciliationApplication.java @@ -0,0 +1,22 @@ +package com.roncoo.pay; + +import org.springframework.boot.WebApplicationType; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +@EnableScheduling +public class AppReconciliationApplication { + + public static ConfigurableApplicationContext context; + + + public static void main(String[] args) { +// SpringApplication.run(AppReconciliationApplication.class, args); + context = new SpringApplicationBuilder().sources(AppReconciliationApplication.class).web(WebApplicationType.NONE).run(args); + } + +} + diff --git a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/ReconciliationTask.java b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/ReconciliationTask.java index 75e3c9f4e5ea6b8a22fc14f6450fa0c4963f621e..55e14cf34c282d3a3113f77258ad6896ed374b9d 100644 --- a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/ReconciliationTask.java +++ b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/ReconciliationTask.java @@ -1,12 +1,12 @@ /* * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,145 +15,153 @@ */ package com.roncoo.pay.app.reconciliation; -import java.io.File; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.context.support.ClassPathXmlApplicationContext; - +import com.roncoo.pay.AppReconciliationApplication; import com.roncoo.pay.app.reconciliation.biz.ReconciliationCheckBiz; import com.roncoo.pay.app.reconciliation.biz.ReconciliationFileDownBiz; import com.roncoo.pay.app.reconciliation.biz.ReconciliationFileParserBiz; import com.roncoo.pay.app.reconciliation.biz.ReconciliationValidateBiz; import com.roncoo.pay.app.reconciliation.utils.DateUtil; -import com.roncoo.pay.app.reconciliation.utils.SpringContextUtil; import com.roncoo.pay.app.reconciliation.vo.ReconciliationInterface; import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch; import com.roncoo.pay.reconciliation.enums.BatchStatusEnum; import com.roncoo.pay.reconciliation.service.RpAccountCheckBatchService; import com.roncoo.pay.reconciliation.vo.ReconciliationEntityVo; import com.roncoo.pay.user.service.BuildNoService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; /** * 对账处理(包括下载对账文件、转换对账文件、对账) . - * + *

* 龙果学院:www.roncoo.com - * + * * @author:shenjialong */ +@Component public class ReconciliationTask { - private static final Log LOG = LogFactory.getLog(ReconciliationTask.class); - - public static void main(String[] args) { - - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); - - try { - // 加载Spring配置文件 - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "spring-context.xml" }); - // 初始化SpringContextUtil - final SpringContextUtil ctxUtil = new SpringContextUtil(); - ctxUtil.setApplicationContext(context); - - @SuppressWarnings("rawtypes") - // 获取全部有效的对账接口(目前是写死了,可以做持久化到数据库,再查出来) - List reconciliationInterList = ReconciliationInterface.getInterface(); - - // 获取业务biz实体 - ReconciliationFileDownBiz fileDownBiz = (ReconciliationFileDownBiz) SpringContextUtil.getBean("reconciliationFileDownBiz"); - ReconciliationFileParserBiz parserBiz = (ReconciliationFileParserBiz) SpringContextUtil.getBean("reconciliationFileParserBiz"); - ReconciliationCheckBiz checkBiz = (ReconciliationCheckBiz) SpringContextUtil.getBean("reconciliationCheckBiz"); - ReconciliationValidateBiz validateBiz = (ReconciliationValidateBiz) SpringContextUtil.getBean("reconciliationValidateBiz"); - RpAccountCheckBatchService batchService = (RpAccountCheckBatchService) SpringContextUtil.getBean("rpAccountCheckBatchService"); - BuildNoService buildNoService = (BuildNoService) SpringContextUtil.getBean("buildNoService"); - - // 根据不同的渠道发起对账 - for (int num = 0; num < reconciliationInterList.size(); num++) { - // 判断接口是否正确 - ReconciliationInterface reconciliationInter = (ReconciliationInterface) reconciliationInterList.get(num); - if (reconciliationInter == null) { - LOG.info("对账接口信息" + reconciliationInter + "为空"); - continue; - } - // 获取需要对账的对账单时间 - Date billDate = DateUtil.addDay(new Date(), -reconciliationInter.getBillDay()); - // 获取对账渠道 - String interfaceCode = reconciliationInter.getInterfaceCode(); - - /** step1:判断是否对过账 **/ - RpAccountCheckBatch batch = new RpAccountCheckBatch(); - Boolean checked = validateBiz.isChecked(interfaceCode, billDate); - if (checked) { - LOG.info("账单日[" + sdf.format(billDate) + "],支付方式[" + interfaceCode + "],已经对过账,不能再次发起自动对账。"); - continue; - } - // 创建对账批次 - batch.setCreater("reconciliationSystem"); - batch.setCreateTime(new Date()); - batch.setBillDate(billDate); - batch.setBatchNo(buildNoService.buildReconciliationNo()); - batch.setBankType(interfaceCode); - - /** step2:对账文件下载 **/ - File file = null; - try { - LOG.info("ReconciliationFileDownBiz,对账文件下载开始"); - file = fileDownBiz.downReconciliationFile(interfaceCode, billDate); - if (file == null) { - continue; - } - LOG.info("对账文件下载结束"); - } catch (Exception e) { - LOG.error("对账文件下载异常:", e); - batch.setStatus(BatchStatusEnum.FAIL.name()); - batch.setRemark("对账文件下载异常"); - batchService.saveData(batch); - continue; - } - - /** step3:解析对账文件 **/ - List bankList = null; - try { - LOG.info("=ReconciliationFileParserBiz=>对账文件解析开始>>>"); - - // 解析文件 - bankList = parserBiz.parser(batch, file, billDate, interfaceCode); - // 如果下载文件异常,退出 - if (BatchStatusEnum.ERROR.name().equals(batch.getStatus())) { - continue; - } - LOG.info("对账文件解析结束"); - } catch (Exception e) { - LOG.error("对账文件解析异常:", e); - batch.setStatus(BatchStatusEnum.FAIL.name()); - batch.setRemark("对账文件解析异常"); - batchService.saveData(batch); - continue; - } - - /** step4:对账流程 **/ - try { - checkBiz.check(bankList, interfaceCode, batch); - } catch (Exception e) { - LOG.error("对账异常:", e); - batch.setStatus(BatchStatusEnum.FAIL.name()); - batch.setRemark("对账异常"); - batchService.saveData(batch); - continue; - } - - } - - /** step5:清理缓冲池 **/ - // 如果缓冲池中有三天前的数据就清理掉并记录差错 - validateBiz.validateScratchPool(); - } catch (Exception e) { - LOG.error("roncoo-app-reconciliation error:", e); - } - - } + private static final Log LOG = LogFactory.getLog(ReconciliationTask.class); + + @Autowired + private ReconciliationFileDownBiz fileDownBiz; + @Autowired + private ReconciliationFileParserBiz parserBiz; + @Autowired + private ReconciliationCheckBiz checkBiz; + @Autowired + private ReconciliationValidateBiz validateBiz; + @Autowired + private RpAccountCheckBatchService batchService; + @Autowired + private BuildNoService buildNoService; + + @PostConstruct + public void taskRun() { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + + try { + + @SuppressWarnings("rawtypes") + // 获取全部有效的对账接口(目前是写死了,可以做持久化到数据库,再查出来) + List reconciliationInterList = ReconciliationInterface.getInterface(); + + // 根据不同的渠道发起对账 + for (int num = 0; num < reconciliationInterList.size(); num++) { + // 判断接口是否正确 + ReconciliationInterface reconciliationInter = (ReconciliationInterface) reconciliationInterList.get(num); + if (reconciliationInter == null) { + LOG.info("对账接口信息" + reconciliationInter + "为空"); + continue; + } + // 获取需要对账的对账单时间 + Date billDate = DateUtil.addDay(new Date(), -reconciliationInter.getBillDay()); + // 获取对账渠道 + String interfaceCode = reconciliationInter.getInterfaceCode(); + + /** step1:判断是否对过账 **/ + RpAccountCheckBatch batch = new RpAccountCheckBatch(); + Boolean checked = validateBiz.isChecked(interfaceCode, billDate); + if (checked) { + LOG.info("账单日[" + sdf.format(billDate) + "],支付方式[" + interfaceCode + "],已经对过账,不能再次发起自动对账。"); + continue; + } + // 创建对账批次 + batch.setCreater("reconciliationSystem"); + batch.setCreateTime(new Date()); + batch.setBillDate(billDate); + batch.setBatchNo(buildNoService.buildReconciliationNo()); + batch.setBankType(interfaceCode); + + /** step2:对账文件下载 **/ + File file = null; + try { + LOG.info("ReconciliationFileDownBiz,对账文件下载开始"); + file = fileDownBiz.downReconciliationFile(interfaceCode, billDate); + if (file == null) { + continue; + } + LOG.info("对账文件下载结束"); + } catch (Exception e) { + LOG.error("对账文件下载异常:", e); + batch.setStatus(BatchStatusEnum.FAIL.name()); + batch.setRemark("对账文件下载异常"); + batchService.saveData(batch); + continue; + } + + /** step3:解析对账文件 **/ + List bankList = null; + try { + LOG.info("=ReconciliationFileParserBiz=>对账文件解析开始>>>"); + + // 解析文件 + bankList = parserBiz.parser(batch, file, billDate, interfaceCode); + // 如果下载文件异常,退出 + if (BatchStatusEnum.ERROR.name().equals(batch.getStatus())) { + continue; + } + LOG.info("对账文件解析结束"); + } catch (Exception e) { + LOG.error("对账文件解析异常:", e); + batch.setStatus(BatchStatusEnum.FAIL.name()); + batch.setRemark("对账文件解析异常"); + batchService.saveData(batch); + continue; + } + + /** step4:对账流程 **/ + try { + checkBiz.check(bankList, interfaceCode, batch); + } catch (Exception e) { + LOG.error("对账异常:", e); + batch.setStatus(BatchStatusEnum.FAIL.name()); + batch.setRemark("对账异常"); + batchService.saveData(batch); + continue; + } + + } + + /** step5:清理缓冲池 **/ + // 如果缓冲池中有三天前的数据就清理掉并记录差错 + validateBiz.validateScratchPool(); + } catch (Exception e) { + LOG.error("roncoo-app-reconciliation error:", e); + } finally { + try { + AppReconciliationApplication.context.close(); + } catch (Exception e) { + LOG.error(e); + } + } + } } diff --git a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationCheckBiz.java b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationCheckBiz.java index 3b27557ae18f3069aeffddb7af911480d5a1ff8c..faa9a5650f7f839da1fa7af1e134b936e8bad411 100644 --- a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationCheckBiz.java +++ b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationCheckBiz.java @@ -15,15 +15,6 @@ */ package com.roncoo.pay.app.reconciliation.biz; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch; import com.roncoo.pay.reconciliation.entity.RpAccountCheckMistake; import com.roncoo.pay.reconciliation.entity.RpAccountCheckMistakeScratchPool; @@ -34,6 +25,14 @@ import com.roncoo.pay.reconciliation.service.RpAccountCheckTransactionService; import com.roncoo.pay.reconciliation.vo.ReconciliationEntityVo; import com.roncoo.pay.trade.entity.RpTradePaymentRecord; import com.roncoo.pay.trade.enums.TradeStatusEnum; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; /** * 对账的核心业务biz. diff --git a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationDataGetBiz.java b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationDataGetBiz.java index 7d1600e3f3b60bfc22e5fd630da7fc69edd08a3c..b6045a35cfb847c6c0fc90872bd72421d48b69de 100644 --- a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationDataGetBiz.java +++ b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationDataGetBiz.java @@ -15,21 +15,16 @@ */ package com.roncoo.pay.app.reconciliation.biz; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - +import com.roncoo.pay.trade.entity.RpTradePaymentRecord; +import com.roncoo.pay.trade.enums.TradeStatusEnum; +import com.roncoo.pay.trade.service.RpTradePaymentQueryService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.roncoo.pay.trade.entity.RpTradePaymentRecord; -import com.roncoo.pay.trade.enums.TradeStatusEnum; -import com.roncoo.pay.trade.service.RpTradePaymentQueryService; +import java.text.SimpleDateFormat; +import java.util.*; /** * 平台数据获取biz业务类. diff --git a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationFileDownBiz.java b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationFileDownBiz.java index 6153725518cc350e3e4ce5d42be771781ebef476..d03c53c8be4feb2242f2f592ee2121b57a18dc1b 100644 --- a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationFileDownBiz.java +++ b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationFileDownBiz.java @@ -15,16 +15,15 @@ */ package com.roncoo.pay.app.reconciliation.biz; -import java.io.File; -import java.util.Date; - +import com.roncoo.pay.common.core.utils.StringUtil; +import com.roncoo.pay.reconciliation.fileDown.service.ReconciliationFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.roncoo.pay.common.core.utils.StringUtil; -import com.roncoo.pay.reconciliation.fileDown.service.ReconciliationFactory; +import java.io.File; +import java.util.Date; /** * 对账文件下载业务逻辑. diff --git a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationFileParserBiz.java b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationFileParserBiz.java index 5ae1a7670b748a2479f1d1dbbf4dc0faee86cfa9..e467e0c71f21a6caa12044ee26f3fd3d475011e4 100644 --- a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationFileParserBiz.java +++ b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationFileParserBiz.java @@ -15,11 +15,9 @@ */ package com.roncoo.pay.app.reconciliation.biz; -import java.io.File; -import java.io.IOException; -import java.util.Date; -import java.util.List; - +import com.roncoo.pay.app.reconciliation.parser.ParserInterface; +import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch; +import com.roncoo.pay.reconciliation.vo.ReconciliationEntityVo; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.BeanFactory; @@ -27,9 +25,10 @@ import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.stereotype.Component; -import com.roncoo.pay.app.reconciliation.parser.ParserInterface; -import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch; -import com.roncoo.pay.reconciliation.vo.ReconciliationEntityVo; +import java.io.File; +import java.io.IOException; +import java.util.Date; +import java.util.List; /** * 对账文件解析业务逻辑. diff --git a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationValidateBiz.java b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationValidateBiz.java index 6279e17e25a78e11b2a7415103345c28faf6f838..f5ef1913faebfeef21be796cb2d1c30fa0666e5a 100644 --- a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationValidateBiz.java +++ b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/biz/ReconciliationValidateBiz.java @@ -15,18 +15,6 @@ */ package com.roncoo.pay.app.reconciliation.biz; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - import com.roncoo.pay.app.reconciliation.utils.DateUtil; import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch; import com.roncoo.pay.reconciliation.entity.RpAccountCheckMistake; @@ -37,6 +25,13 @@ import com.roncoo.pay.reconciliation.enums.ReconciliationMistakeTypeEnum; import com.roncoo.pay.reconciliation.service.RpAccountCheckBatchService; import com.roncoo.pay.reconciliation.service.RpAccountCheckMistakeScratchPoolService; import com.roncoo.pay.reconciliation.service.RpAccountCheckTransactionService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.*; /** * 对账验证biz,(检查是否已经对过账). diff --git a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/parser/ALIPAYParser.java b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/parser/ALIPAYParser.java index 57b5cee717b9b61c732638c970268402a79f1008..58bc1be13b36bf007558281a44d69b20c2ac41b1 100644 --- a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/parser/ALIPAYParser.java +++ b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/parser/ALIPAYParser.java @@ -15,6 +15,19 @@ */ package com.roncoo.pay.app.reconciliation.parser; +import com.roncoo.pay.app.reconciliation.vo.AlipayAccountLogVO; +import com.roncoo.pay.common.core.enums.PayWayEnum; +import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch; +import com.roncoo.pay.reconciliation.enums.BatchStatusEnum; +import com.roncoo.pay.reconciliation.vo.ReconciliationEntityVo; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.springframework.stereotype.Component; + import java.io.File; import java.io.IOException; import java.math.BigDecimal; @@ -25,20 +38,6 @@ import java.util.Date; import java.util.Iterator; import java.util.List; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; -import org.springframework.stereotype.Component; - -import com.roncoo.pay.app.reconciliation.vo.AlipayAccountLogVO; -import com.roncoo.pay.common.core.enums.PayWayEnum; -import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch; -import com.roncoo.pay.reconciliation.enums.BatchStatusEnum; -import com.roncoo.pay.reconciliation.vo.ReconciliationEntityVo; - /** * 支付宝对账单解析器 . * @@ -74,7 +73,7 @@ public class ALIPAYParser implements ParserInterface { try { document = reader.read(file); // 使用dom4j的Xpath找到AccountQueryAccountLogVO节点 - List projects = document.selectNodes("alipay/response/account_page_query_result/account_log_list/AccountQueryAccountLogVO"); + List projects = document.getRootElement().element("response").element("account_page_query_result").element("account_log_list").elements();; Iterator it = projects.iterator(); // 业务类型为在线支付的账户历史 diff --git a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/parser/ParserInterface.java b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/parser/ParserInterface.java index 5fdc6dbab6aa0e5481a62027c38592d00ff63c36..8db91253045435b671ee4415fb02a4e2359c015b 100644 --- a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/parser/ParserInterface.java +++ b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/parser/ParserInterface.java @@ -15,14 +15,14 @@ */ package com.roncoo.pay.app.reconciliation.parser; +import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch; +import com.roncoo.pay.reconciliation.vo.ReconciliationEntityVo; + import java.io.File; import java.io.IOException; import java.util.Date; import java.util.List; -import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch; -import com.roncoo.pay.reconciliation.vo.ReconciliationEntityVo; - /** * 定义一个解析的接口,实现着必须override接口中的parser方法. * diff --git a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/parser/WEIXINParser.java b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/parser/WEIXINParser.java index 26e174e272b33e167648dde6f81cef1d3b097d55..c4dc94319015f032d19581f0113e444a7116370c 100644 --- a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/parser/WEIXINParser.java +++ b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/parser/WEIXINParser.java @@ -15,32 +15,27 @@ */ package com.roncoo.pay.app.reconciliation.parser; -import java.io.File; -import java.io.IOException; -import java.math.BigDecimal; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - +import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch; +import com.roncoo.pay.reconciliation.enums.BatchStatusEnum; +import com.roncoo.pay.reconciliation.service.RpAccountCheckBatchService; +import com.roncoo.pay.reconciliation.utils.XmlUtils; +import com.roncoo.pay.reconciliation.vo.ReconciliationEntityVo; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.jdom2.JDOMException; +import org.dom4j.DocumentException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch; -import com.roncoo.pay.reconciliation.enums.BatchStatusEnum; -import com.roncoo.pay.reconciliation.service.RpAccountCheckBatchService; -import com.roncoo.pay.reconciliation.utils.XmlUtils; -import com.roncoo.pay.reconciliation.vo.ReconciliationEntityVo; +import java.io.File; +import java.io.IOException; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * 微信对账单解析器 . @@ -267,7 +262,7 @@ public class WEIXINParser implements ParserInterface { rpAccountCheckBatchService.saveData(batch); } } - } catch (JDOMException e) { + } catch (DocumentException e) { LOG.error("解析微信账单(判断返回是否正确)失败", e); } catch (IOException e) { LOG.error("解析微信账单(判断返回是否正确)失败", e); diff --git a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/vo/ReconciliationInterface.java b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/vo/ReconciliationInterface.java index fbe85bb55acdd876a448c149dfeb1a1f953a192b..a9acfc52bf57d6066af4335af4c6b78c9b475db8 100644 --- a/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/vo/ReconciliationInterface.java +++ b/roncoo-pay-app-reconciliation/src/main/java/com/roncoo/pay/app/reconciliation/vo/ReconciliationInterface.java @@ -15,12 +15,12 @@ */ package com.roncoo.pay.app.reconciliation.vo; -import java.util.ArrayList; -import java.util.List; - import com.roncoo.pay.common.core.enums.PayWayEnum; import com.roncoo.pay.common.core.enums.PublicStatusEnum; +import java.util.ArrayList; +import java.util.List; + /** * 对账接口实体 * diff --git a/roncoo-pay-app-reconciliation/src/main/resources/application.yml b/roncoo-pay-app-reconciliation/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..3297cabd8bcdcd6cf1c19e5d20c2b5dbc256670c --- /dev/null +++ b/roncoo-pay-app-reconciliation/src/main/resources/application.yml @@ -0,0 +1,13 @@ +server: + port: 8097 + servlet: + session: + timeout: 30 +spring: + application: + name: roncoo-pay-app-reconciliation +logging: + config: classpath:logback.xml +mybatis: + mapper-locations: classpath*:mybatis/mapper/**/*.xml + diff --git a/roncoo-pay-app-reconciliation/src/main/resources/log4j.properties b/roncoo-pay-app-reconciliation/src/main/resources/log4j.properties deleted file mode 100644 index 1398082d38eb22c49a8d52402d7c8ab2120f9844..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-reconciliation/src/main/resources/log4j.properties +++ /dev/null @@ -1,28 +0,0 @@ -#\u5F00\u53D1\u65E5\u5FD7\u5C06\u5728\u672C\u5730\u8F93\u51FA\uFF0C\u5E76\u8F93\u51FASQL - -log4j.rootLogger=${log4j.leve},A1,DRF -log4j.appender.A1=org.apache.log4j.ConsoleAppender -log4j.appender.A1.layout=org.apache.log4j.PatternLayout -# log4j.appender.A1.layout.ConversionPattern=%d %5p [%t] (%F:%L) - %m%n -log4j.appender.A1.layout.ConversionPattern=%d %5p [%F:%L] : %m%n - -log4j.appender.DRF=org.apache.log4j.DailyRollingFileAppender -log4j.appender.DRF.Threshold=${log4j.leve} -log4j.appender.DRF.DatePattern='.'yyyy-MM-dd -log4j.appender.DRF.File=logs/gw-app-reconcliation.log -log4j.appender.DRF.Append=true -log4j.appender.DRF.layout=org.apache.log4j.PatternLayout -log4j.appender.DRF.layout.ConversionPattern=[%-5p][%d{yyyyMMdd HH:mm:ss,SSS}][%C{1}:%L] %m%n - - -###\u8F93\u51FASQL -log4j.logger.com.ibatis=${log4j.ale} -log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=${log4j.ale} -log4j.logger.com.ibatis.common.jdbc.ScriptRunner=${log4j.ale} -log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=${log4j.ale} -log4j.logger.java.sql.Connection=${log4j.ale} -log4j.logger.java.sql.Statement=${log4j.ale} -log4j.logger.java.sql.PreparedStatement=${log4j.ale} -log4j.logger.com.alibaba.dubbo=${log4j.ale} - - diff --git a/roncoo-pay-app-reconciliation/src/main/resources/logback.xml b/roncoo-pay-app-reconciliation/src/main/resources/logback.xml new file mode 100644 index 0000000000000000000000000000000000000000..2002a79b1454be204d80db4c3711b8d7dd4220e0 --- /dev/null +++ b/roncoo-pay-app-reconciliation/src/main/resources/logback.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + ${PATTERN} + + + + + + ${FILE_PATH}/${APPLICATION_NAME}/${APPLICATION_NAME}.log + + ${FILE_PATH}/${APPLICATION_NAME}/${APPLICATION_NAME}.%d{yyyy-MM-dd}.log + + 100 + + + ${PATTERN} + + + + + + + + + + + diff --git a/roncoo-pay-app-reconciliation/src/main/resources/spring-context.xml b/roncoo-pay-app-reconciliation/src/main/resources/spring-context.xml deleted file mode 100644 index c9a8ebe256fd180a492a17e93f55353c90cd71bd..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-reconciliation/src/main/resources/spring-context.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/roncoo-pay-app-reconciliation/src/main/resources/spring-task.xml b/roncoo-pay-app-reconciliation/src/main/resources/spring-task.xml deleted file mode 100644 index a3a778de47b9d3f0471fdc76cdd7bacce490dd50..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-reconciliation/src/main/resources/spring-task.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/roncoo-pay-app-settlement/.classpath b/roncoo-pay-app-settlement/.classpath deleted file mode 100644 index 698778fef3378d2b00e5d4e260491f33b776287d..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-settlement/.classpath +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/roncoo-pay-app-settlement/.gitignore b/roncoo-pay-app-settlement/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..c456c4a3ad64e41cb40d64cf0ed1cfa63e4ebac4 --- /dev/null +++ b/roncoo-pay-app-settlement/.gitignore @@ -0,0 +1,25 @@ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ diff --git a/roncoo-pay-app-settlement/.project b/roncoo-pay-app-settlement/.project deleted file mode 100644 index daa25e6e85abec0140b82c7f4339eb1eb5742b70..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-settlement/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - roncoo-app-settlement - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/roncoo-pay-app-settlement/pom.xml b/roncoo-pay-app-settlement/pom.xml index df6999bd1d1240b281a5603c591e452d563ab9c6..e942046174e0ee585d8d187a8e6bdd0ecc7ff8c5 100644 --- a/roncoo-pay-app-settlement/pom.xml +++ b/roncoo-pay-app-settlement/pom.xml @@ -1,137 +1,49 @@ - 4.0.0 - - com.roncoo.pay.common - roncoo-pay - 0.0.4-SNAPSHOT - - com.roncoo.pay.app - roncoo-pay-app-settlement - roncoo-pay-app-settlement - http://maven.apache.org - - UTF-8 - - - - - com.roncoo.pay.common - roncoo-pay-common-core - ${project.parent.version} - - - - - com.roncoo.pay.service - roncoo-pay-service - ${project.parent.version} - - - - - junit - junit - - test - - - - - - - - - - roncoo-pay-app-settlement - - - - - - org.apache.maven.plugins - maven-jar-plugin - - target/classes/ - - - com.roncoo.pay.app.settlement.SettTask - - false - true - lib/ - - - . - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - package - - copy-dependencies - - - jar - jar - - ${project.build.directory}/lib - - - - - - - - org.apache.maven.plugins - maven-deploy-plugin - 2.7 - - false - - - - org.apache.maven.plugins - maven-eclipse-plugin - 2.8 - - - org.apache.maven.plugins - maven-compiler-plugin - 3.2 - - true - true - true - -nowarn - 1.7 - 1.7 - UTF-8 - - - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - attach-sources - - jar - - - - - - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + 4.0.0 + + com.roncoo.pay + roncoo-pay + 2.1.2-SNAPSHOT + + + com.roncoo.pay + roncoo-pay-app-settlement + + roncoo-pay-app-settlement + 结算定时处理app,发起定时跑批处理,统计结算数据 + + + UTF-8 + + + + + com.roncoo.pay.service + roncoo-pay-service + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + + + + + ${project.name} + + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/AppSettlementApplication.java b/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/AppSettlementApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..809a7df8cc8eb6baea65c016ab0a534a7946c057 --- /dev/null +++ b/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/AppSettlementApplication.java @@ -0,0 +1,19 @@ +package com.roncoo.pay; + +import org.springframework.boot.WebApplicationType; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.context.ConfigurableApplicationContext; + +@SpringBootApplication +public class AppSettlementApplication { + + public static ConfigurableApplicationContext context; + + public static void main(String[] args) { +// SpringApplication.run(AppSettlementApplication.class, args); + context = new SpringApplicationBuilder().sources(AppSettlementApplication.class).web(WebApplicationType.NONE).run(args); + } + +} + diff --git a/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/SettTask.java b/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/SettTask.java index aec0d07a2d9f4fda713efb7d570befe85cb25cb7..3de8aa88473989976a682fdd7b0044b9755ee450 100644 --- a/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/SettTask.java +++ b/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/SettTask.java @@ -15,38 +15,35 @@ */ package com.roncoo.pay.app.settlement; +import com.roncoo.pay.AppSettlementApplication; +import com.roncoo.pay.app.settlement.scheduled.SettScheduled; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; -import com.roncoo.pay.app.settlement.scheduled.SettScheduled; +import javax.annotation.PostConstruct; /** * 结算定时任务.(分商户统计账户历史进行汇总) * 龙果学院:www.roncoo.com * @author zenghao */ +@Component public class SettTask { private static final Log LOG = LogFactory.getLog(SettTask.class); private static final long MILLIS = 1000L; - private SettTask(){ - - } - + @Autowired + private SettScheduled settScheduled; - public static void main(String[] args) { + @PostConstruct + public void runTask() { try { - @SuppressWarnings("resource") - final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "spring-context.xml" }); - context.start(); - LOG.debug("结算定时任务开始执行"); - SettScheduled settScheduled = (SettScheduled) context.getBean("settScheduled"); - LOG.debug("执行(每日待结算数据汇总)任务开始"); settScheduled.launchDailySettCollect(); LOG.debug("执行(每日待结算数据汇总)任务结束"); @@ -57,11 +54,16 @@ public class SettTask { settScheduled.launchAutoSett(); LOG.debug("执行(定期自动结算)任务结束"); - context.stop(); + } catch (Exception e) { LOG.error("SettTask execute error:", e); } finally { - System.exit(0); + try { + AppSettlementApplication.context.close(); + } catch (Exception e) { + LOG.error(e); + } +// System.exit(0); LOG.debug("SettTask Complete"); } } diff --git a/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/biz/DailySettCollectBiz.java b/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/biz/DailySettCollectBiz.java index 3f1b1dc8fd7b687e301e8be4ae66761576306123..c07add70d22afda4edeaaa574896b92053ec822c 100644 --- a/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/biz/DailySettCollectBiz.java +++ b/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/biz/DailySettCollectBiz.java @@ -15,17 +15,16 @@ */ package com.roncoo.pay.app.settlement.biz; -import java.util.Date; - +import com.roncoo.pay.account.entity.RpAccount; +import com.roncoo.pay.account.service.RpSettHandleService; +import com.roncoo.pay.user.entity.RpUserPayConfig; +import com.roncoo.pay.user.service.RpUserPayConfigService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.roncoo.pay.account.entity.RpAccount; -import com.roncoo.pay.account.service.RpSettHandleService; -import com.roncoo.pay.user.entity.RpUserPayConfig; -import com.roncoo.pay.user.service.RpUserPayConfigService; +import java.util.Date; /** * 每日待结算数据汇总. diff --git a/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/biz/SettBiz.java b/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/biz/SettBiz.java index 664319af99727b6e17167116c9e91098e60a7cee..12d017e42c72581e7627ebc4978ec132c3607d07 100644 --- a/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/biz/SettBiz.java +++ b/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/biz/SettBiz.java @@ -15,19 +15,18 @@ */ package com.roncoo.pay.app.settlement.biz; -import java.util.Date; -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - import com.roncoo.pay.account.entity.RpAccount; import com.roncoo.pay.account.service.RpSettHandleService; import com.roncoo.pay.common.core.enums.PublicEnum; import com.roncoo.pay.user.entity.RpUserPayConfig; import com.roncoo.pay.user.service.RpUserPayConfigService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; /** * 结算业务逻辑类. diff --git a/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/scheduled/impl/SettScheduledImpl.java b/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/scheduled/impl/SettScheduledImpl.java index 28b3338acc4469eb9028c4e148330f7e3acaa0bd..a0d139bf883b0f7f2d9a405eb71b4da2d178fec5 100644 --- a/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/scheduled/impl/SettScheduledImpl.java +++ b/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/scheduled/impl/SettScheduledImpl.java @@ -15,16 +15,15 @@ */ package com.roncoo.pay.app.settlement.scheduled.impl; -import java.util.Date; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - import com.roncoo.pay.account.entity.RpAccount; import com.roncoo.pay.account.service.RpAccountQueryService; import com.roncoo.pay.app.settlement.biz.SettBiz; import com.roncoo.pay.app.settlement.scheduled.SettScheduled; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; /** diff --git a/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/utils/SettThreadPoolExecutor.java b/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/utils/SettThreadPoolExecutor.java index a43577707ada721cc0fd167707dfbe5fd587209f..30360cc034d9a505b4a3a98059f147f979e35311 100644 --- a/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/utils/SettThreadPoolExecutor.java +++ b/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/app/settlement/utils/SettThreadPoolExecutor.java @@ -15,14 +15,14 @@ */ package com.roncoo.pay.app.settlement.utils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - /** * 线程池工具类 * 龙果学院:www.roncoo.com diff --git a/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/config/ThreadPoolTaskConfig.java b/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/config/ThreadPoolTaskConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..dc9fdae50ecc08a40043a43ea3f74cba6d6f740e --- /dev/null +++ b/roncoo-pay-app-settlement/src/main/java/com/roncoo/pay/config/ThreadPoolTaskConfig.java @@ -0,0 +1,34 @@ +package com.roncoo.pay.config; + +import com.roncoo.pay.app.settlement.utils.SettThreadPoolExecutor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +@Configuration +public class ThreadPoolTaskConfig { + + @Bean(name = "settThreadPoolExecutor", initMethod = "init", destroyMethod = "destroy") + public SettThreadPoolExecutor settThreadPoolExecutor() { + SettThreadPoolExecutor settThreadPoolExecutor = new SettThreadPoolExecutor(); + //最小线程数 + settThreadPoolExecutor.setCorePoolSize(5); + //最大线程数 + settThreadPoolExecutor.setMaxPoolSize(10); + //线程池缓冲队列大小 + settThreadPoolExecutor.setWorkQueueSize(256); + //许线程闲置时间,单位:秒 + settThreadPoolExecutor.setKeepAliveTime(3); + return settThreadPoolExecutor; + } + + @Bean(name = "threadPoolTaskExecutor") + public ThreadPoolTaskExecutor threadPoolTaskExecutor() { + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); + threadPoolTaskExecutor.setCorePoolSize(20); + threadPoolTaskExecutor.setKeepAliveSeconds(30000); + threadPoolTaskExecutor.setMaxPoolSize(200); + threadPoolTaskExecutor.setQueueCapacity(1000); + return threadPoolTaskExecutor; + } +} diff --git a/roncoo-pay-app-settlement/src/main/resources/application.yml b/roncoo-pay-app-settlement/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..06a3aeef0edc553e103fabc351e3c7785f6aa83a --- /dev/null +++ b/roncoo-pay-app-settlement/src/main/resources/application.yml @@ -0,0 +1,14 @@ +server: + port: 8098 + servlet: + session: + timeout: 30 +spring: + application: + name: roncoo-pay-app-settlement +logging: + config: classpath:logback.xml +mybatis: + mapper-locations: classpath*:mybatis/mapper/**/*.xml + + diff --git a/roncoo-pay-app-settlement/src/main/resources/log4j.properties b/roncoo-pay-app-settlement/src/main/resources/log4j.properties deleted file mode 100644 index 1398082d38eb22c49a8d52402d7c8ab2120f9844..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-settlement/src/main/resources/log4j.properties +++ /dev/null @@ -1,28 +0,0 @@ -#\u5F00\u53D1\u65E5\u5FD7\u5C06\u5728\u672C\u5730\u8F93\u51FA\uFF0C\u5E76\u8F93\u51FASQL - -log4j.rootLogger=${log4j.leve},A1,DRF -log4j.appender.A1=org.apache.log4j.ConsoleAppender -log4j.appender.A1.layout=org.apache.log4j.PatternLayout -# log4j.appender.A1.layout.ConversionPattern=%d %5p [%t] (%F:%L) - %m%n -log4j.appender.A1.layout.ConversionPattern=%d %5p [%F:%L] : %m%n - -log4j.appender.DRF=org.apache.log4j.DailyRollingFileAppender -log4j.appender.DRF.Threshold=${log4j.leve} -log4j.appender.DRF.DatePattern='.'yyyy-MM-dd -log4j.appender.DRF.File=logs/gw-app-reconcliation.log -log4j.appender.DRF.Append=true -log4j.appender.DRF.layout=org.apache.log4j.PatternLayout -log4j.appender.DRF.layout.ConversionPattern=[%-5p][%d{yyyyMMdd HH:mm:ss,SSS}][%C{1}:%L] %m%n - - -###\u8F93\u51FASQL -log4j.logger.com.ibatis=${log4j.ale} -log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=${log4j.ale} -log4j.logger.com.ibatis.common.jdbc.ScriptRunner=${log4j.ale} -log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=${log4j.ale} -log4j.logger.java.sql.Connection=${log4j.ale} -log4j.logger.java.sql.Statement=${log4j.ale} -log4j.logger.java.sql.PreparedStatement=${log4j.ale} -log4j.logger.com.alibaba.dubbo=${log4j.ale} - - diff --git a/roncoo-pay-app-settlement/src/main/resources/logback.xml b/roncoo-pay-app-settlement/src/main/resources/logback.xml new file mode 100644 index 0000000000000000000000000000000000000000..ea4fd7f74d3b693cd5551ff5933a81c9aa225968 --- /dev/null +++ b/roncoo-pay-app-settlement/src/main/resources/logback.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + ${PATTERN} + + + + + + ${FILE_PATH}/${APPLICATION_NAME}/${APPLICATION_NAME}.log + + ${FILE_PATH}/${APPLICATION_NAME}/${APPLICATION_NAME}.%d{yyyy-MM-dd}.log + + 100 + + + ${PATTERN} + + + + + + + + + + + diff --git a/roncoo-pay-app-settlement/src/main/resources/spring-context.xml b/roncoo-pay-app-settlement/src/main/resources/spring-context.xml deleted file mode 100644 index ad491ed6c1eb5754238fccb5ee048724437b8058..0000000000000000000000000000000000000000 --- a/roncoo-pay-app-settlement/src/main/resources/spring-context.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/roncoo-pay-common-core/.classpath b/roncoo-pay-common-core/.classpath deleted file mode 100644 index a67314913efb2ec1ed7b610ce7c35f6ef3018d1f..0000000000000000000000000000000000000000 --- a/roncoo-pay-common-core/.classpath +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/roncoo-pay-common-core/.gitignore b/roncoo-pay-common-core/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..c456c4a3ad64e41cb40d64cf0ed1cfa63e4ebac4 --- /dev/null +++ b/roncoo-pay-common-core/.gitignore @@ -0,0 +1,25 @@ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ diff --git a/roncoo-pay-common-core/.project b/roncoo-pay-common-core/.project deleted file mode 100644 index b936c4d14e1b1dddd6ff24d4674e8784255ee6d7..0000000000000000000000000000000000000000 --- a/roncoo-pay-common-core/.project +++ /dev/null @@ -1,36 +0,0 @@ - - - roncoo-common-core - - - - - - org.eclipse.wst.common.project.facet.core.builder - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.wst.validation.validationbuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jem.workbench.JavaEMFNature - org.eclipse.wst.common.modulecore.ModuleCoreNature - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - org.eclipse.wst.common.project.facet.core.nature - - diff --git a/roncoo-pay-common-core/pom.xml b/roncoo-pay-common-core/pom.xml index 7f2cd95767061603c4744dcd5e301a6fcc7b30d0..d1d28c9a7c6d18e9c8e5877fbc6069353b96b75b 100644 --- a/roncoo-pay-common-core/pom.xml +++ b/roncoo-pay-common-core/pom.xml @@ -1,254 +1,57 @@ 4.0.0 + - com.roncoo.pay.common + com.roncoo.pay roncoo-pay - 0.0.4-SNAPSHOT + 2.1.2-SNAPSHOT + + com.roncoo.pay.common roncoo-pay-common-core + roncoo-pay-common-core - http://maven.apache.org + core 是支付系统核心基础包 + + UTF-8 - + + com.google.code.gson + gson + + + org.apache.httpcomponents + httpclient + + - org.springframework - spring-core + org.springframework.boot + spring-boot-starter-web - - org.springframework - spring-aop - - - - org.springframework - spring-aspects - - - org.springframework - spring-beans - - - org.springframework - spring-context - - - org.springframework - spring-context-support - - - org.springframework - spring-expression - - - org.springframework - spring-instrument - - - org.springframework - spring-instrument-tomcat - - - org.springframework - spring-jdbc - - - org.springframework - spring-jms - - - org.springframework - spring-orm - - - org.springframework - spring-oxm - - - org.springframework - spring-test - test - - - org.springframework - spring-tx - - - org.springframework - spring-web - - - org.springframework - spring-webmvc - - - org.springframework - spring-webmvc-portlet - - - - - - - org.mybatis - mybatis - - - org.mybatis - mybatis-spring - - - - - - org.slf4j - slf4j-api - - - org.slf4j - slf4j-log4j12 - - - log4j - log4j - - - - - - - mysql - mysql-connector-java - - - - commons-dbcp - commons-dbcp - - - - - - - - javassist - javassist - - - javax.transaction - jta - - - - cglib - cglib - - - - jstl - jstl - - - - com.alibaba - druid + org.mybatis.spring.boot + mybatis-spring-boot-starter + com.alibaba fastjson + commons-lang commons-lang - - commons-io - commons-io - - - - - commons-codec - commons-codec - - - - - commons-configuration - commons-configuration - - - - - com.google.zxing - core - - - - - com.google.code.gson - gson - - - - - org.hamcrest - hamcrest-core - - - - org.jdom - jdom - - - - alipay - alipay-sdk-java20151021120052 - - - - alipay - alipay-trade-sdk - - - - - - org.apache.activemq - activemq-all - - - org.apache.activemq - activemq-pool - - - - javax.validation - validation-api - - - - org.hibernate - hibernate-validator - - - - jaxen - jaxen - - - - commons-codec - commons-codec - - - + + + ${project.name} + diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/config/MqConfig.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/config/MqConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..fe80926a1d45749486d494736cc9a08a6de01857 --- /dev/null +++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/config/MqConfig.java @@ -0,0 +1,39 @@ +package com.roncoo.pay.common.core.config; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public class MqConfig { + + private static final Log LOG = LogFactory.getLog(MqConfig.class); + + /** 商户通知队列 **/ + public static String MERCHANT_NOTIFY_QUEUE = ""; + + /** 订单通知队列 **/ + public static String ORDER_NOTIFY_QUEUE = ""; + + private static Properties properties = null; + + static{ + if(null == properties){ + properties = new Properties(); + } + InputStream proFile = Thread.currentThread().getContextClassLoader().getResourceAsStream("mq_config.properties"); + try { + properties.load(proFile); + init(properties); + } catch (IOException e) { + LOG.error("=== load and init mq exception:" + e); + } + } + + private static void init(Properties properties){ + MERCHANT_NOTIFY_QUEUE = properties.getProperty("tradeQueueName.notify"); + ORDER_NOTIFY_QUEUE = properties.getProperty("orderQueryQueueName.query"); + } +} diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/dao/BaseDao.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/dao/BaseDao.java index 6d69006e814b8d830d887e8e70ae35d879311409..6a0598274307c75edd01158564f8adb8d09ff4c6 100644 --- a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/dao/BaseDao.java +++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/dao/BaseDao.java @@ -15,14 +15,12 @@ */ package com.roncoo.pay.common.core.dao; -import java.util.List; -import java.util.Map; - -import org.apache.ibatis.session.SqlSession; -import org.mybatis.spring.SqlSessionTemplate; - import com.roncoo.pay.common.core.page.PageBean; import com.roncoo.pay.common.core.page.PageParam; +import org.mybatis.spring.SqlSessionTemplate; + +import java.util.List; +import java.util.Map; /** * 数据访问层基础支撑接口. @@ -172,9 +170,8 @@ public interface BaseDao { * @return:PageBean * @throws */ - public PageBean listPage(PageParam pageParam, Map paramMap); + PageBean listPage(PageParam pageParam, Map paramMap); - public SqlSessionTemplate getSessionTemplate(); + SqlSessionTemplate getSessionTemplate(); - public SqlSession getSqlSession(); } diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/dao/impl/BaseDaoImpl.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/dao/impl/BaseDaoImpl.java index 2ee6ca6deefcdb1dc318c42f79eb743b83982cb4..1c3b21266030ff14d7909e917168ce91d8187d71 100644 --- a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/dao/impl/BaseDaoImpl.java +++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/dao/impl/BaseDaoImpl.java @@ -1,12 +1,12 @@ /* * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,29 +15,27 @@ */ package com.roncoo.pay.common.core.dao.impl; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.ibatis.session.SqlSession; -import org.mybatis.spring.SqlSessionTemplate; -import org.mybatis.spring.support.SqlSessionDaoSupport; -import org.springframework.beans.factory.annotation.Autowired; - import com.roncoo.pay.common.core.dao.BaseDao; import com.roncoo.pay.common.core.entity.BaseEntity; import com.roncoo.pay.common.core.exception.BizException; import com.roncoo.pay.common.core.page.PageBean; import com.roncoo.pay.common.core.page.PageParam; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.mybatis.spring.SqlSessionTemplate; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 据访问层基础支撑类. + * * @company:广州领课网络科技有限公司(龙果学院 www.roncoo.com). */ -public abstract class BaseDaoImpl extends SqlSessionDaoSupport implements BaseDao { +public abstract class BaseDaoImpl implements BaseDao { protected static final Log LOG = LogFactory.getLog(BaseDaoImpl.class); @@ -56,7 +54,7 @@ public abstract class BaseDaoImpl extends SqlSessionDaoSup public static final String SQL_LIST_BY = "listBy"; public static final String SQL_LIST_PAGE_COUNT = "listPageCount"; public static final String SQL_COUNT_BY_PAGE_PARAM = "countByPageParam"; // 根据当前分页参数进行统计 - + /** * 注入SqlSessionTemplate实例(要求Spring中进行SqlSessionTemplate的配置). @@ -73,10 +71,6 @@ public abstract class BaseDaoImpl extends SqlSessionDaoSup this.sessionTemplate = sessionTemplate; } - public SqlSession getSqlSession() { - return super.getSqlSession(); - } - /** * 单条插入数据. */ @@ -161,7 +155,7 @@ public abstract class BaseDaoImpl extends SqlSessionDaoSup /** * 根据条件查询 getBy: selectOne
- * + * * @param paramMap * @return */ @@ -171,7 +165,7 @@ public abstract class BaseDaoImpl extends SqlSessionDaoSup } return sessionTemplate.selectOne(getStatement(SQL_LIST_BY), paramMap); } - + /** * 根据条件查询列表数据. */ @@ -270,11 +264,11 @@ public abstract class BaseDaoImpl extends SqlSessionDaoSup /** * 函数功能说明 : 获取Mapper命名空间. 修改者名字: Along 修改日期: 2016-1-8 修改内容: - * + * + * @throws * @参数:@param sqlId * @参数:@return * @return:String - * @throws */ public String getStatement(String sqlId) { String name = this.getClass().getName(); diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/ApiCommonResultVo.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/ApiCommonResultVo.java new file mode 100644 index 0000000000000000000000000000000000000000..39d0ce53338ef7732fb49fd927c8a7734385b861 --- /dev/null +++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/ApiCommonResultVo.java @@ -0,0 +1,85 @@ +/* + * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.roncoo.pay.common.core.entity; + +import com.alibaba.fastjson.JSONObject; + +/** + * api请求正常返回结果,该实体作为API请求时,按照规范返回的实体. code 为返回码 msg 为返回描述 data 为返回的具体结果 Created + * 龙果学院:www.roncoo.com + * @author zenghao + */ +public class ApiCommonResultVo { + + public ApiCommonResultVo(int code, String msg, Object data) { + this.code = code; + this.msg = msg; + if (data != null) { + this.data = data; + } + } + + public ApiCommonResultVo(Object data) { + this.code = 0; + this.msg = ""; + if (data != null) { + this.data = data; + } + } + + /** + * 返回码 + */ + private int code; + + /** + * 返回描述 + */ + private String msg = ""; + + /** + * 返回数据 + */ + private Object data = new Object(); + + public void setCode(int code) { + this.code = code; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public void setData(Object data) { + this.data = data; + } + + public int getCode() { + return code; + } + + public String getMsg() { + return msg; + } + + public Object getData() { + return data; + } + + public static void main(String[] args) { + System.out.println(JSONObject.toJSONString(new ApiCommonResultVo(-1, "", null))); + } +} diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/ApiPageListResultVo.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/ApiPageListResultVo.java new file mode 100644 index 0000000000000000000000000000000000000000..385ce8b807ab2ae7366f3163439f593675387618 --- /dev/null +++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/ApiPageListResultVo.java @@ -0,0 +1,83 @@ +/* + * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.roncoo.pay.common.core.entity; + +import com.alibaba.fastjson.JSONObject; + +import java.util.ArrayList; + +/** + * API请求,返回分页数据时,统一实体类,将返回的数据统一封装到该实体中,返回给客户端 + * 龙果学院:www.roncoo.com + * @author zenghao + */ +public class ApiPageListResultVo { + + /** + * 返回码 + */ + private int code; + + /** + * 返回描述 + */ + private String msg = ""; + + /** + * 返回分页数据,默认为0页0条 + */ + private PageListVO data = new PageListVO(0,0,0,new ArrayList()); + + public void setCode(int code) { + this.code = code; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public void setData(PageListVO data) { + this.data = data; + } + + public int getCode() { + return code; + } + + public String getMsg() { + return msg; + } + + public PageListVO getData() { + return data; + } + + + + public static void main(String [] args ){ + + ApiPageListResultVo apiPageListResultVo = new ApiPageListResultVo(); + apiPageListResultVo.setCode(-1); + apiPageListResultVo.setMsg("测试数据"); + + PageListVO pageListVO = new PageListVO(0,2,33,new ArrayList()); + + apiPageListResultVo.setData(pageListVO); + + System.out.println(JSONObject.toJSONString(apiPageListResultVo)); + } + +} diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/BaseEntity.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/BaseEntity.java index 52e189262f40894947d5e056f4d1b117210aa1a3..4accd1ef6f5eb090ac313429e041da52ff156e40 100644 --- a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/BaseEntity.java +++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/BaseEntity.java @@ -15,10 +15,10 @@ */ package com.roncoo.pay.common.core.entity; -import java.util.Date; - import com.roncoo.pay.common.core.utils.StringUtil; +import java.util.Date; + /** * 基类. * @company:广州领课网络科技有限公司(龙果学院 www.roncoo.com). diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/PageListVO.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/PageListVO.java new file mode 100644 index 0000000000000000000000000000000000000000..c071eaa26219e009676f26e64decac139d437a34 --- /dev/null +++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/PageListVO.java @@ -0,0 +1,107 @@ +/* + * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.roncoo.pay.common.core.entity; + +import java.util.ArrayList; +import java.util.List; + +/** + * 返回的分页实体 + * 龙果学院:www.roncoo.com + * @author zenghao + */ +public class PageListVO { + + /** 总数量 **/ + private long total ; + + /** 页码 **/ + private int page; + + /** 每页条数 **/ + private int pageSize; + + /** 分页数据 **/ + private List pageData = new ArrayList(); + + /** + * 汇总数据 + */ + private Object summary; + + public PageListVO(long total , int page , int pageSize , List pageData){ + this.total = total; + this.page = page; + this.pageSize = pageSize; + + if (pageData != null){ + this.pageData = pageData; + } + + } + + public PageListVO(long total , int page , int pageSize , List pageData, Object summary){ + this.total = total; + this.page = page; + this.pageSize = pageSize; + this.summary = summary; + + if (pageData != null){ + this.pageData = pageData; + } + + } + + public Object getSummary() { + return summary; + } + + public void setSummary(Object summary) { + this.summary = summary; + } + + public void setTotal(int total) { + this.total = total; + } + + public void setPage(int page) { + this.page = page; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public void setPageData(List pageData) { + this.pageData = pageData; + } + + public long getTotal() { + return total; + } + + public int getPage() { + return page; + } + + public int getPageSize() { + return pageSize; + } + + public List getPageData() { + return pageData; + } +} diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/rpObject.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/rpObject.java new file mode 100644 index 0000000000000000000000000000000000000000..86217e3c8c9ac832781c586eae262f2ad0b6840b --- /dev/null +++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/entity/rpObject.java @@ -0,0 +1,25 @@ +/* + * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.roncoo.pay.common.core.entity; + +import java.io.Serializable; + +/** + * 龙果学院:www.roncoo.com + * @author zenghao + */ +public class rpObject extends Object implements Serializable { +} diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/enums/PayTypeEnum.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/enums/PayTypeEnum.java index ba13f8f48267f2350232e023a1a0e5d31926e8d5..96cb8510beb66790d57d5a821e86450ad79196e7 100644 --- a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/enums/PayTypeEnum.java +++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/enums/PayTypeEnum.java @@ -1,12 +1,12 @@ /* * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -28,11 +28,17 @@ import java.util.Map; public enum PayTypeEnum { SCANPAY("WEIXIN","扫码支付"), - + H5PAY("WEIXIN","H5支付"), DIRECT_PAY("ALIPAY","即时到账"), + HUA_BEI_FEN_QI_PAY("ALIPAY","花呗分期"), + + MICRO_PAY("WEIXIN","刷卡支付"), + + WX_PROGRAM_PAY("WEIXIN","微信小程序"), + F2F_PAY("ALIPAY","条码支付"), ALI_TEST("ALIPAY","支付宝测试"); @@ -97,7 +103,7 @@ public enum PayTypeEnum { } return null; } - + @SuppressWarnings({ "rawtypes", "unchecked" }) public static List getWayList(String way) { PayTypeEnum[] ary = PayTypeEnum.values(); diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/enums/SecurityRatingEnum.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/enums/SecurityRatingEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..6147cd82c766e9e9d43578421116430c3def0019 --- /dev/null +++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/enums/SecurityRatingEnum.java @@ -0,0 +1,103 @@ +/* + * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.roncoo.pay.common.core.enums; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 安全等级枚举 + * 龙果学院:www.roncoo.com + * @author:zenghao + */ +public enum SecurityRatingEnum { + + MD5("MD5"), + + MD5_IP("MD5+IP白名单"); + + /** 描述 */ + private String desc; + + private SecurityRatingEnum(String desc) { + this.desc = desc; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public static SecurityRatingEnum getEnum(String enumName) { + SecurityRatingEnum resultEnum = null; + SecurityRatingEnum[] enumAry = SecurityRatingEnum.values(); + for (int i = 0; i < enumAry.length; i++) { + if (enumAry[i].name().equals(enumName)) { + resultEnum = enumAry[i]; + break; + } + } + return resultEnum; + } + + public static Map> toMap() { + SecurityRatingEnum[] ary = SecurityRatingEnum.values(); + Map> enumMap = new HashMap>(); + for (int num = 0; num < ary.length; num++) { + Map map = new HashMap(); + String key = ary[num].name(); + map.put("desc", ary[num].getDesc()); + enumMap.put(key, map); + } + return enumMap; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static List toList() { + SecurityRatingEnum[] ary = SecurityRatingEnum.values(); + List list = new ArrayList(); + for (int i = 0; i < ary.length; i++) { + Map map = new HashMap(); + map.put("name", ary[i].name()); + map.put("desc", ary[i].getDesc()); + list.add(map); + } + return list; + } + + /** + * 取枚举的json字符串 + * + * @return + */ + public static String getJsonStr() { + SecurityRatingEnum[] enums = SecurityRatingEnum.values(); + StringBuffer jsonStr = new StringBuffer("["); + for (SecurityRatingEnum senum : enums) { + if (!"[".equals(jsonStr.toString())) { + jsonStr.append(","); + } + jsonStr.append("{id:'").append(senum).append("',desc:'").append(senum.getDesc()).append("'}"); + } + jsonStr.append("]"); + return jsonStr.toString(); + } +} diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/page/PageParam.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/page/PageParam.java index fb2dcfa4daef30d428d0799a1b91a4efe6b4ddaa..d79dc6955e2483de01f0222f3b757997a13eed50 100644 --- a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/page/PageParam.java +++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/page/PageParam.java @@ -58,7 +58,10 @@ public class PageParam implements Serializable { * @param pageNum * @param numPerPage */ - public PageParam(int pageNum , int numPerPage){} + public PageParam(int pageNum , int numPerPage){ + this.pageNum = pageNum; + this.numPerPage = numPerPage; + } /** 当前页数 */ public int getPageNum() { diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/Base64.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/Base64.java new file mode 100644 index 0000000000000000000000000000000000000000..788b7ae4446a42cf88511ca5fcdb8478c9b1de3c --- /dev/null +++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/Base64.java @@ -0,0 +1,327 @@ +package com.roncoo.pay.common.core.utils; + +public final class Base64 +{ + + static private final int BASELENGTH = 128; + static private final int LOOKUPLENGTH = 64; + static private final int TWENTYFOURBITGROUP = 24; + static private final int EIGHTBIT = 8; + static private final int SIXTEENBIT = 16; + static private final int FOURBYTE = 4; + static private final int SIGN = -128; + static private final char PAD = '='; + static private final boolean fDebug = false; + static final private byte[] base64Alphabet = new byte[BASELENGTH]; + static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH]; + + static + { + for (int i = 0; i < BASELENGTH; ++i) + { + base64Alphabet[i] = -1; + } + for (int i = 'Z'; i >= 'A'; i--) + { + base64Alphabet[i] = (byte) (i - 'A'); + } + for (int i = 'z'; i >= 'a'; i--) + { + base64Alphabet[i] = (byte) (i - 'a' + 26); + } + + for (int i = '9'; i >= '0'; i--) + { + base64Alphabet[i] = (byte) (i - '0' + 52); + } + + base64Alphabet['+'] = 62; + base64Alphabet['/'] = 63; + + for (int i = 0; i <= 25; i++) + { + lookUpBase64Alphabet[i] = (char) ('A' + i); + } + + for (int i = 26, j = 0; i <= 51; i++, j++) + { + lookUpBase64Alphabet[i] = (char) ('a' + j); + } + + for (int i = 52, j = 0; i <= 61; i++, j++) + { + lookUpBase64Alphabet[i] = (char) ('0' + j); + } + lookUpBase64Alphabet[62] = (char) '+'; + lookUpBase64Alphabet[63] = (char) '/'; + + } + + private static boolean isWhiteSpace(char octect) + { + return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9); + } + + private static boolean isPad(char octect) + { + return (octect == PAD); + } + + private static boolean isData(char octect) + { + return (octect < BASELENGTH && base64Alphabet[octect] != -1); + } + + /** + * Encodes hex octects into Base64 + * + * @param binaryData + * Array containing binaryData + * @return Encoded Base64 array + */ + public static String encode(byte[] binaryData) + { + + if (binaryData == null) + { + return null; + } + + int lengthDataBits = binaryData.length * EIGHTBIT; + if (lengthDataBits == 0) + { + return ""; + } + + int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP; + int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP; + int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 + : numberTriplets; + char encodedData[] = null; + + encodedData = new char[numberQuartet * 4]; + + byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0; + + int encodedIndex = 0; + int dataIndex = 0; + if (fDebug) + { + System.out.println("number of triplets = " + numberTriplets); + } + + for (int i = 0; i < numberTriplets; i++) + { + b1 = binaryData[dataIndex++]; + b2 = binaryData[dataIndex++]; + b3 = binaryData[dataIndex++]; + + if (fDebug) + { + System.out.println("b1= " + b1 + ", b2= " + b2 + ", b3= " + b3); + } + + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) + : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) + : (byte) ((b2) >> 4 ^ 0xf0); + byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) + : (byte) ((b3) >> 6 ^ 0xfc); + + if (fDebug) + { + System.out.println("val2 = " + val2); + System.out.println("k4 = " + (k << 4)); + System.out.println("vak = " + (val2 | (k << 4))); + } + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f]; + } + + // form integral number of 6-bit groups + if (fewerThan24bits == EIGHTBIT) + { + b1 = binaryData[dataIndex]; + k = (byte) (b1 & 0x03); + if (fDebug) + { + System.out.println("b1=" + b1); + System.out.println("b1<<2 = " + (b1 >> 2)); + } + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) + : (byte) ((b1) >> 2 ^ 0xc0); + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4]; + encodedData[encodedIndex++] = PAD; + encodedData[encodedIndex++] = PAD; + } + else if (fewerThan24bits == SIXTEENBIT) + { + b1 = binaryData[dataIndex]; + b2 = binaryData[dataIndex + 1]; + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) + : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) + : (byte) ((b2) >> 4 ^ 0xf0); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2]; + encodedData[encodedIndex++] = PAD; + } + + return new String(encodedData); + } + + /** + * Decodes Base64 data into octects + * + * @param encoded + * string containing Base64 data + * @return Array containind decoded data. + */ + public static byte[] decode(String encoded) + { + + if (encoded == null) + { + return null; + } + + char[] base64Data = encoded.toCharArray(); + // remove white spaces + int len = removeWhiteSpace(base64Data); + + if (len % FOURBYTE != 0) + { + return null;// should be divisible by four + } + + int numberQuadruple = (len / FOURBYTE); + + if (numberQuadruple == 0) + { + return new byte[0]; + } + + byte decodedData[] = null; + byte b1 = 0, b2 = 0, b3 = 0, b4 = 0; + char d1 = 0, d2 = 0, d3 = 0, d4 = 0; + + int i = 0; + int encodedIndex = 0; + int dataIndex = 0; + decodedData = new byte[(numberQuadruple) * 3]; + + for (; i < numberQuadruple - 1; i++) + { + + if (!isData((d1 = base64Data[dataIndex++])) + || !isData((d2 = base64Data[dataIndex++])) + || !isData((d3 = base64Data[dataIndex++])) + || !isData((d4 = base64Data[dataIndex++]))) + { + return null; + }// if found "no data" just return null + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + } + + if (!isData((d1 = base64Data[dataIndex++])) + || !isData((d2 = base64Data[dataIndex++]))) + { + return null;// if found "no data" just return null + } + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + + d3 = base64Data[dataIndex++]; + d4 = base64Data[dataIndex++]; + if (!isData((d3)) || !isData((d4))) + {// Check if they are PAD characters + if (isPad(d3) && isPad(d4)) + { + if ((b2 & 0xf) != 0)// last 4 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 1]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); + return tmp; + } + else if (!isPad(d3) && isPad(d4)) + { + b3 = base64Alphabet[d3]; + if ((b3 & 0x3) != 0)// last 2 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 2]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + return tmp; + } + else + { + return null; + } + } + else + { // No PAD e.g 3cQl + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + + } + + return decodedData; + } + + /** + * remove WhiteSpace from MIME containing encoded Base64 data. + * + * @param data + * the byte array of base64 data (with WS) + * @return the new length + */ + private static int removeWhiteSpace(char[] data) + { + if (data == null) + { + return 0; + } + + // count characters that's not whitespace + int newSize = 0; + int len = data.length; + for (int i = 0; i < len; i++) + { + if (!isWhiteSpace(data[i])) + { + data[newSize++] = data[i]; + } + } + return newSize; + } +} diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/DateUtils.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/DateUtils.java index f38e97acfc386d9877c099258a33da875d141ab7..7ab1d5355c45fbe1fee3f4cb82d85401fa2aa810 100644 --- a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/DateUtils.java +++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/DateUtils.java @@ -15,6 +15,9 @@ */ package com.roncoo.pay.common.core.utils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -23,8 +26,6 @@ import java.util.Calendar; import java.util.Date; import java.util.List; -import org.apache.log4j.Logger; - /** * 日期工具类 * @company:广州领课网络科技有限公司(龙果学院 www.roncoo.com). @@ -53,7 +54,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils { */ public final static int COMP_MODEL_DATETIME = 3; - private static Logger logger = Logger.getLogger(DateUtils.class); + private static Log logger = LogFactory.getLog(DateUtils.class); /** * 要用到的DATE Format的定义 @@ -409,31 +410,31 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils { * * @return t1到t2间的日数,如果t2 在 t1之后,返回正数,否则返回负数 */ - public static long daysBetween(java.sql.Timestamp t1, java.sql.Timestamp t2) { + public static long daysBetween(Timestamp t1, Timestamp t2) { return (t2.getTime() - t1.getTime()) / DAY_MILLI; } /** * 返回java.sql.Timestamp型的SYSDATE - * + * * @return java.sql.Timestamp型的SYSDATE * @since 1.0 * @history */ - public static java.sql.Timestamp getSysDateTimestamp() { - return new java.sql.Timestamp(System.currentTimeMillis()); + public static Timestamp getSysDateTimestamp() { + return new Timestamp(System.currentTimeMillis()); } /** * 利用缺省的Date格式(YYYY/MM/DD)转换String到java.sql.Timestamp - * + * * @param sDate * Date string * @return * @since 1.0 * @history */ - public static java.sql.Timestamp toSqlTimestamp(String sDate) { + public static Timestamp toSqlTimestamp(String sDate) { if (sDate == null) { return null; } @@ -441,16 +442,16 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils { &&sDate.length() != DateUtils.DATE_FORMAT_DATETIME.length()) { return null; } - return toSqlTimestamp(sDate, + return toSqlTimestamp(sDate, sDate.length() == DateUtils.DATE_FORMAT_DATEONLY.length() - ?DateUtils.DATE_FORMAT_DATEONLY - :DateUtils.DATE_FORMAT_DATETIME); + ? DateUtils.DATE_FORMAT_DATEONLY + : DateUtils.DATE_FORMAT_DATETIME); } /** * 利用缺省的Date格式(YYYY/MM/DD hh:mm:ss)转化String到java.sql.Timestamp - * + * * @param sDate * Date string * @param sFmt @@ -459,7 +460,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils { * @since 1.0 * @history */ - public static java.sql.Timestamp toSqlTimestamp(String sDate, String sFmt) { + public static Timestamp toSqlTimestamp(String sDate, String sFmt) { String temp = null; if (sDate == null || sFmt == null) { return null; @@ -483,23 +484,23 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils { return null; } // java.sql.Timestamp.value() 要求的格式必须为yyyy-mm-dd hh:mm:ss.fffffffff - return java.sql.Timestamp.valueOf(temp); + return Timestamp.valueOf(temp); } /** * 以YYYY/MM/DD HH24:MI:SS格式返回系统日期时间 - * + * * @return 系统日期时间 * @since 1.0 * @history */ public static String getSysDateTimeString() { - return toString(new java.util.Date(System.currentTimeMillis()), DateUtils.sdfDateTime); + return toString(new Date(System.currentTimeMillis()), DateUtils.sdfDateTime); } /** * 根据指定的Format转化java.util.Date到String - * + * * @param dt * java.util.Date instance * @param sFmt @@ -508,7 +509,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils { * @since 1.0 * @history */ - public static String toString(java.util.Date dt, String sFmt) { + public static String toString(Date dt, String sFmt) { if (dt == null || sFmt == null || "".equals(sFmt)) { return ""; } @@ -517,7 +518,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils { /** * 利用指定SimpleDateFormat instance转换java.util.Date到String - * + * * @param dt * java.util.Date instance * @param formatter @@ -526,7 +527,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils { * @since 1.0 * @history */ - private static String toString(java.util.Date dt, SimpleDateFormat formatter) { + private static String toString(Date dt, SimpleDateFormat formatter) { String sRet = null; try { @@ -541,14 +542,14 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils { /** * 转换java.sql.Timestamp到String,格式为YYYY/MM/DD HH24:MI - * + * * @param dt * java.sql.Timestamp instance * @return * @since 1.0 * @history */ - public static String toSqlTimestampString2(java.sql.Timestamp dt) { + public static String toSqlTimestampString2(Timestamp dt) { if (dt == null) { return null; } @@ -556,13 +557,13 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils { return temp.substring(0, 16); } - public static String toString(java.sql.Timestamp dt) { + public static String toString(Timestamp dt) { return dt == null ? "" : toSqlTimestampString2(dt); } /** * 根据指定的格式转换java.sql.Timestamp到String - * + * * @param dt * java.sql.Timestamp instance * @param sFmt @@ -572,7 +573,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils { * @since 1.0 * @history */ - public static String toSqlTimestampString(java.sql.Timestamp dt, String sFmt) { + public static String toSqlTimestampString(Timestamp dt, String sFmt) { String temp = null; String out = null; if (dt == null || sFmt == null) { @@ -603,14 +604,14 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils { /** * Timestamp 格式转换成yyyy-MM-dd timestampToSql(Timestamp 格式转换成yyyy-MM-dd) - * + * * @param timestamp * 时间 * @return createTimeStr yyyy-MM-dd 时间 * @Exception 异常对象 * @since V1.0 */ - public static String timestampToStringYMD(java.sql.Timestamp timestamp) { + public static String timestampToStringYMD(Timestamp timestamp) { SimpleDateFormat sdf = new SimpleDateFormat(DateUtils.DATE_FORMAT_DATEONLY); String createTimeStr = sdf.format(timestamp); return createTimeStr; @@ -618,7 +619,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils { /** * 判断一个时间是否在某个时间区间内 - * + * * @param now * 目标时间 * @param start @@ -635,7 +636,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils { /** * 判断时间是否在制定的时间段之类 - * + * * @param date * 需要判断的时间 * @param start @@ -644,7 +645,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils { * 时间段的截止时间 * @param interModel * 区间的模式 - * + * *
 	 * 		取值:
 	 * 			LEFT_OPEN_RIGHT_OPEN
@@ -654,7 +655,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 	 * 
* @param compModel * 比较的模式 - * + * *
 	 * 		取值:
 	 * 			COMP_MODEL_DATE		只比较日期,不比较时间
@@ -725,7 +726,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 得到当前周起始时间
-	 * 
+	 *
 	 * @param date
 	 * @return
 	 */
@@ -744,7 +745,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 得到当前周截止时间
-	 * 
+	 *
 	 * @param date
 	 * @return
 	 */
@@ -763,7 +764,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 得到当月起始时间
-	 * 
+	 *
 	 * @param date
 	 * @return
 	 */
@@ -780,7 +781,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 得到当前年起始时间
-	 * 
+	 *
 	 * @param date
 	 * @return
 	 */
@@ -799,7 +800,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 得到当前年最后一天
-	 * 
+	 *
 	 * @param date
 	 * @return
 	 */
@@ -818,7 +819,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 取得月天数
-	 * 
+	 *
 	 * @param date
 	 * @return
 	 */
@@ -830,7 +831,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 取得月第一天
-	 * 
+	 *
 	 * @param date
 	 * @return
 	 */
@@ -843,7 +844,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 取得月最后一天
-	 * 
+	 *
 	 * @param date
 	 * @return
 	 */
@@ -856,7 +857,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 取得季度第一天
-	 * 
+	 *
 	 * @param date
 	 * @return
 	 */
@@ -866,7 +867,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 取得季度最后一天
-	 * 
+	 *
 	 * @param date
 	 * @return
 	 */
@@ -876,7 +877,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 取得季度月
-	 * 
+	 *
 	 * @param date
 	 * @return
 	 */
@@ -920,9 +921,9 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 	}
 
 	/**
-	 * 
+	 *
 	 * 1 第一季度 2 第二季度 3 第三季度 4 第四季度
-	 * 
+	 *
 	 * @param date
 	 * @return
 	 */
@@ -962,7 +963,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 字符串转date
-	 * 
+	 *
 	 * @param dateString
 	 * @return
 	 */
@@ -979,7 +980,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 判断输入日期是一个星期中的第几天(星期天为一个星期第一天)
-	 * 
+	 *
 	 * @param date
 	 * @return
 	 */
@@ -1007,7 +1008,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 判断开始时间和结束时间,是否超出了当前时间的一定的间隔数限制 如:开始时间和结束时间,不能超出距离当前时间90天
-	 * 
+	 *
 	 * @param startDate
 	 *            开始时间
 	 * @param endDate
@@ -1031,7 +1032,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 判断开始时间和结束时间,是否超出了当前时间的一定的间隔数限制, 时间单位默认为天数 如:开始时间和结束时间,不能超出距离当前时间90天
-	 * 
+	 *
 	 * @param startDate
 	 *            开始时间
 	 * @param endDate
@@ -1053,7 +1054,7 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 判断开始时间和结束时间,是否超出了当前时间的一定的间隔数限制, 时间单位默认为天数 如:开始时间和结束时间,不能超出距离当前时间90天
-	 * 
+	 *
 	 * @param startDateStr
 	 *            开始时间
 	 * @param endDateStr
@@ -1076,14 +1077,14 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 
 	/**
 	 * 传入时间字符串及时间格式,返回对应的Date对象
-	 * 
+	 *
 	 * @param src
 	 *            时间字符串
 	 * @param pattern
 	 *            时间格式
 	 * @return Date
 	 */
-	public static java.util.Date getDateFromString(String src, String pattern) {
+	public static Date getDateFromString(String src, String pattern) {
 		SimpleDateFormat f = new SimpleDateFormat(pattern);
 		try {
 			return f.parse(src);
diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/EncryptUtil.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/EncryptUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..3128a1d84cde78bee06173b8fe1688f3de4be7ae
--- /dev/null
+++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/EncryptUtil.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group.
+ *  
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *  
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.roncoo.pay.common.core.utils;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * 加密工具类
+ * @company:广州领课网络科技有限公司(龙果学院 www.roncoo.com).
+ * @author zenghao
+ */
+public class EncryptUtil {
+
+	private static final Log LOG = LogFactory.getLog(EncryptUtil.class);
+
+	// 密码盐
+	public static final String PWDSALT = "PAY";
+
+	/**
+	 * 私有构造方法,将该工具类设为单例模式.
+	 */
+	private EncryptUtil() {
+	}
+
+	/**
+	 * 用MD5算法进行加密
+	 * 
+	 * @param str
+	 *            需要加密的字符串
+	 * @return MD5加密后的结果
+	 */
+	public static String encodeMD5String(String str) {
+		return encode(str, "MD5");
+	}
+
+	/**
+	 * 用SHA算法进行加密
+	 * 
+	 * @param str
+	 *            需要加密的字符串
+	 * @return SHA加密后的结果
+	 */
+	public static String encodeSHAString(String str) {
+		return encode(str, "SHA");
+	}
+
+	/**
+	 * 用base64算法进行加密
+	 * 
+	 * @param str
+	 *            需要加密的字符串
+	 * @return base64加密后的结果
+	 */
+	public static String encodeBase64String(String str) {
+		BASE64Encoder encoder = new BASE64Encoder();
+		return encoder.encode(str.getBytes());
+	}
+
+	/**
+	 * 用base64算法进行解密
+	 * 
+	 * @param str
+	 *            需要解密的字符串
+	 * @return base64解密后的结果
+	 * @throws IOException
+	 */
+	public static String decodeBase64String(String str) throws IOException {
+		BASE64Decoder encoder = new BASE64Decoder();
+		return new String(encoder.decodeBuffer(str));
+	}
+
+	private static String encode(String str, String method) {
+		MessageDigest mdInst = null;
+		// 把密文转换成十六进制的字符串形式
+		// 单线程用StringBuilder,速度快 多线程用stringbuffer,安全
+		StringBuilder dstr = new StringBuilder();
+		try {
+			// 获得MD5摘要算法的 MessageDigest对象
+			mdInst = MessageDigest.getInstance(method);
+			// 使用指定的字节更新摘要
+			mdInst.update(str.getBytes());
+			// 获得密文
+			byte[] md = mdInst.digest();
+			for (int i = 0; i < md.length; i++) {
+				int tmp = md[i];
+				if (tmp < 0) {
+					tmp += 256;
+				}
+				if (tmp < 16) {
+					dstr.append("0");
+				}
+				dstr.append(Integer.toHexString(tmp));
+			}
+		} catch (NoSuchAlgorithmException e) {
+			LOG.error(e);
+		}
+		return dstr.toString();
+	}
+
+}
diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/HttpClientUtil.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/HttpClientUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..4e99df9011537cb209244cd59e2da9f0a5d04260
--- /dev/null
+++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/HttpClientUtil.java
@@ -0,0 +1,29 @@
+package com.roncoo.pay.common.core.utils;
+
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+
+public class HttpClientUtil {
+
+    /** 链接超时时间 **/
+    private static final Integer CONNECT_TIME_OUT = 40 * 1000;
+
+    /** 数据传输超时时间 **/
+    private static final Integer SOCKET_TIME_OUT = 40 * 1000;
+
+
+    public static HttpClient getHttpClient(){
+        RequestConfig.Builder configBuilder = RequestConfig.custom();
+        configBuilder.setConnectTimeout(CONNECT_TIME_OUT);
+        configBuilder.setSocketTimeout(SOCKET_TIME_OUT);
+
+        HttpClientBuilder clientBuilder = HttpClients.custom();
+        clientBuilder.setDefaultRequestConfig(configBuilder.build());
+        HttpClient httpClient = clientBuilder.build();
+
+        return httpClient;
+    }
+
+}
diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/MD5Util.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/MD5Util.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b09b8d46a0f62d72697eaf64dca32715b255099
--- /dev/null
+++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/MD5Util.java
@@ -0,0 +1,109 @@
+
+package com.roncoo.pay.common.core.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.security.MessageDigest;
+
+/**
+ * 功能说明:MD5签名工具类
+ * 
+ * @author  Peter
+ * 龙果学院(www.roncoo.com)
+ */
+public class MD5Util {
+
+    private static final Logger LOG = LoggerFactory.getLogger(MD5Util.class);
+
+    /**
+     * 私有构造方法,将该工具类设为单例模式.
+     */
+    private MD5Util() {
+    }
+
+    private static final String[] hex = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
+
+    /**
+     * 32位MD5签名值
+     * @param password
+     * @return
+     */
+    public static String encode32(String password) {
+        try {
+            MessageDigest md5 = MessageDigest.getInstance("MD5");
+            byte[] byteArray = md5.digest(password.getBytes("utf-8"));
+            String passwordMD5 = byteArrayToHexString(byteArray);
+            return passwordMD5;
+        } catch (Exception e) {
+            LOG.error(e.toString());
+        }
+        return password;
+    }
+
+    /**
+     * 32位大写MD5签名值
+     * @param password
+     * @return
+     */
+    public static String encode32ToUpperCase(String password) {
+        return encode32(password).toUpperCase();
+    }
+
+    /**
+     * 16位MD5签名值
+     * @param password
+     * @return
+     */
+    public static String encode16(String password) {
+        return encode32(password).substring(8, 24);
+    }
+
+    /**
+     * 16位大写MD5签名值
+     * @param password
+     * @return
+     */
+    public static String encode16ToUpperCase(String password) {
+        return encode32ToUpperCase(password).substring(8,24);
+    }
+
+    public static String encode(String password , String enc) {
+        try {
+            MessageDigest md5 = MessageDigest.getInstance("MD5");
+            byte[] byteArray = md5.digest(password.getBytes(enc));
+            String passwordMD5 = byteArrayToHexString(byteArray);
+            return passwordMD5;
+        } catch (Exception e) {
+            LOG.error(e.toString());
+        }
+        return password;
+    }
+
+    private static String byteArrayToHexString(byte[] byteArray) {
+        StringBuffer sb = new StringBuffer();
+        for (byte b : byteArray) {
+            sb.append(byteToHexChar(b));
+        }
+        return sb.toString();
+    }
+
+    private static Object byteToHexChar(byte b) {
+        int n = b;
+        if (n < 0) {
+            n = 256 + n;
+        }
+        int d1 = n / 16;
+        int d2 = n % 16;
+        return hex[d1] + hex[d2];
+    }
+
+    public static void main(String [] args ){
+
+        String ss = "test";
+        System.out.println(MD5Util.encode32(ss));
+        System.out.println(MD5Util.encode32ToUpperCase(ss));
+        System.out.println(MD5Util.encode16(ss));
+        System.out.println(MD5Util.encode16ToUpperCase(ss));
+    }
+}
diff --git a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/StringUtil.java b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/StringUtil.java
index 7ac2b41a08765f97a9afa6931340b21b4f5c91a6..c98395fb6afbb19ae39659e865f46bd83233c8f2 100644
--- a/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/StringUtil.java
+++ b/roncoo-pay-common-core/src/main/java/com/roncoo/pay/common/core/utils/StringUtil.java
@@ -15,17 +15,13 @@
  */
 package com.roncoo.pay.common.core.utils;
 
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import java.io.UnsupportedEncodingException;
+import java.util.*;
+
 /**
  * String字符串工具类.
  * @company:广州领课网络科技有限公司(龙果学院 www.roncoo.com).
@@ -193,4 +189,18 @@ public final class StringUtil {
         return list;
     }
 
+    /**
+     * 判断对象是否为空
+     *
+     * @param obj
+     * @return
+     */
+    public static boolean isNotNull(Object obj) {
+        if (obj != null && obj.toString() != null && !"".equals(obj.toString().trim())) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
 }
diff --git a/roncoo-pay-service/.classpath b/roncoo-pay-service/.classpath
deleted file mode 100644
index da3f7efbe5f7774a4d56ed73c2c9e3f20cf4c9c8..0000000000000000000000000000000000000000
--- a/roncoo-pay-service/.classpath
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-	
-		
-			
-			
-		
-	
-	
-		
-			
-		
-	
-	
-		
-			
-			
-		
-	
-	
-		
-			
-		
-	
-	
-		
-			
-			
-		
-	
-	
-
diff --git a/roncoo-pay-service/.gitignore b/roncoo-pay-service/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..c456c4a3ad64e41cb40d64cf0ed1cfa63e4ebac4
--- /dev/null
+++ b/roncoo-pay-service/.gitignore
@@ -0,0 +1,25 @@
+/target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+/build/
diff --git a/roncoo-pay-service/.project b/roncoo-pay-service/.project
deleted file mode 100644
index 6e2cc4c4a240f8231213351e4645c50e24dcd3ff..0000000000000000000000000000000000000000
--- a/roncoo-pay-service/.project
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-	roncoo-service
-	
-	
-	
-	
-		
-			org.eclipse.wst.common.project.facet.core.builder
-			
-			
-		
-		
-			org.eclipse.jdt.core.javabuilder
-			
-			
-		
-		
-			org.eclipse.wst.validation.validationbuilder
-			
-			
-		
-		
-			org.eclipse.m2e.core.maven2Builder
-			
-			
-		
-	
-	
-		org.eclipse.jem.workbench.JavaEMFNature
-		org.eclipse.wst.common.modulecore.ModuleCoreNature
-		org.eclipse.jdt.core.javanature
-		org.eclipse.m2e.core.maven2Nature
-		org.eclipse.wst.common.project.facet.core.nature
-	
-
diff --git a/roncoo-pay-service/pom.xml b/roncoo-pay-service/pom.xml
index 53f1f0e564e321a4acc70b56633019969d38c92f..e3d71978a9169ba2cc1ebaa652b13ea21204a1d6 100644
--- a/roncoo-pay-service/pom.xml
+++ b/roncoo-pay-service/pom.xml
@@ -2,15 +2,16 @@
 
 	4.0.0
 	
-		com.roncoo.pay.common
+		com.roncoo.pay
 		roncoo-pay
-		0.0.4-SNAPSHOT
+		2.1.2-SNAPSHOT
 	
 
 	com.roncoo.pay.service
 	roncoo-pay-service
+
 	roncoo-pay-service
-	http://maven.apache.org
+	支付系统核心业务
 
 	
 		UTF-8
@@ -18,85 +19,68 @@
 
 	
 
+        
+            org.apache.httpcomponents
+            httpmime
+        
+
 		
 			com.roncoo.pay.common
 			roncoo-pay-common-core
-			${project.parent.version}
 		
 
-		
+		
+			mysql
+			mysql-connector-java
+			runtime
+		
+		
+			org.springframework.boot
+			spring-boot-starter-jdbc
+		
+		
+			org.springframework.boot
+			spring-boot-starter-data-redis
+		
+		
+			org.springframework.boot
+			spring-boot-starter-activemq
+		
+		
+			org.apache.activemq
+			activemq-pool
+		
+
+		
+			com.alibaba
+			druid
+		
+		
+			com.alipay.sdk
+			alipay-sdk-java
+		
+
 		
 			commons-httpclient
 			commons-httpclient
-			3.1
 		
-
 		
 			dom4j
 			dom4j
-			1.6.1
 		
-
 		
-			org.apache.shiro
-			shiro-ehcache
-			1.2.5
+			org.jdom
+			jdom
 		
-
 		
-			org.apache.shiro
-			shiro-web
-			1.2.5
+			com.baomidou
+			mybatis-plus
 		
-		
 
 	
 
-	
 	
-		roncoo-pay-service
-		
-			
-				org.apache.maven.plugins
-				maven-deploy-plugin
-				2.7
-				
-					false
-				
-			
-			
-				org.apache.maven.plugins
-				maven-eclipse-plugin
-				2.8
-			
-			
-				org.apache.maven.plugins
-				maven-compiler-plugin
-				3.2
-				
-					true
-					true
-					true
-					-nowarn
-					1.7
-					1.7
-					UTF-8
-				
-			
-			
-				org.apache.maven.plugins
-				maven-source-plugin
-				2.1.2
-				
-					
-						attach-sources
-						
-							jar
-						
-					
-				
-			
-		
+		${project.name}
 	
 
 
diff --git a/roncoo-pay-service/src/lib/alipay-sdk-java20151021120052.jar b/roncoo-pay-service/src/lib/alipay-sdk-java20151021120052.jar
deleted file mode 100755
index e941e2c63a68f9d38ac237ccd766e29b288533ac..0000000000000000000000000000000000000000
Binary files a/roncoo-pay-service/src/lib/alipay-sdk-java20151021120052.jar and /dev/null differ
diff --git a/roncoo-pay-service/src/lib/alipay-trade-sdk.jar b/roncoo-pay-service/src/lib/alipay-trade-sdk.jar
deleted file mode 100755
index 6e4f5c9a36c89d0caafdb323abde1f0d5c25848c..0000000000000000000000000000000000000000
Binary files a/roncoo-pay-service/src/lib/alipay-trade-sdk.jar and /dev/null differ
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/RpAccountDao.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/RpAccountDao.java
index e0172556633f7fa6f11252e752e532334513614c..14c3b9f8eaaad058ca9053d3291bdfd91860cd75 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/RpAccountDao.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/RpAccountDao.java
@@ -15,11 +15,11 @@
  */
 package com.roncoo.pay.account.dao;
 
-import java.util.Map;
-
 import com.roncoo.pay.account.entity.RpAccount;
 import com.roncoo.pay.common.core.dao.BaseDao;
 
+import java.util.Map;
+
 /**
  * 账户dao
  * 龙果学院:www.roncoo.com
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/RpAccountHistoryDao.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/RpAccountHistoryDao.java
index ac50f907904084f39b9a0fac2511cc393fa195f3..4668c621370c5f6944ef53c516ca807f1caf6353 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/RpAccountHistoryDao.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/RpAccountHistoryDao.java
@@ -15,13 +15,13 @@
  */
 package com.roncoo.pay.account.dao;
 
-import java.util.List;
-import java.util.Map;
-
 import com.roncoo.pay.account.entity.RpAccountHistory;
 import com.roncoo.pay.account.vo.DailyCollectAccountHistoryVo;
 import com.roncoo.pay.common.core.dao.BaseDao;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 账户历史dao
  * 龙果学院:www.roncoo.com
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpAccountDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpAccountDaoImpl.java
index 9db0eb5e3059d3146a47269f319b597f8e790ab7..a148b1e7d1146dc5ae12a310c4822e4c9cdf6ede 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpAccountDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpAccountDaoImpl.java
@@ -19,12 +19,11 @@ import com.roncoo.pay.account.dao.RpAccountDao;
 import com.roncoo.pay.account.entity.RpAccount;
 import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl;
 import com.roncoo.pay.common.core.enums.PublicStatusEnum;
+import org.springframework.stereotype.Repository;
 
 import java.util.HashMap;
 import java.util.Map;
 
-import org.springframework.stereotype.Repository;
-
 
 /**
  * 账户dao实现类
@@ -32,7 +31,7 @@ import org.springframework.stereotype.Repository;
  * @author:zenghao
  */
 @Repository
-public class RpAccountDaoImpl  extends BaseDaoImpl implements RpAccountDao{
+public class RpAccountDaoImpl  extends BaseDaoImpl implements RpAccountDao {
 	public RpAccount getByAccountNo(String accountNo){
 		Map paramMap = new HashMap();
 		paramMap.put("accountNo", accountNo);
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpAccountHistoryDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpAccountHistoryDaoImpl.java
index d057109b81238a4d899c5d947cc1b8e247799a9e..4220f8f057113a307fe838c4de86c65b91f0b16d 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpAccountHistoryDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpAccountHistoryDaoImpl.java
@@ -15,16 +15,15 @@
  */
 package com.roncoo.pay.account.dao.impl;
 
-import com.roncoo.pay.account.dao.RpAccountHistoryDao;
 import com.roncoo.pay.account.entity.RpAccountHistory;
+import com.roncoo.pay.account.dao.RpAccountHistoryDao;
 import com.roncoo.pay.account.vo.DailyCollectAccountHistoryVo;
 import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl;
+import org.springframework.stereotype.Repository;
 
 import java.util.List;
 import java.util.Map;
 
-import org.springframework.stereotype.Repository;
-
 
 /**
  * 账户历史dao实现类
@@ -32,7 +31,7 @@ import org.springframework.stereotype.Repository;
  * @author:zenghao
  */
 @Repository
-public class RpAccountHistoryDaoImpl  extends BaseDaoImpl implements RpAccountHistoryDao{
+public class RpAccountHistoryDaoImpl  extends BaseDaoImpl implements RpAccountHistoryDao {
 	
 	public List listPageByParams(Map params){
 		return this.listBy(params);
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpSettDailyCollectDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpSettDailyCollectDaoImpl.java
index 3df94bc7732afc83fbbb0c7c250d812b8c3e40ab..b9d0d7f67545548c2e5a89c098c31431d9bec6e7 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpSettDailyCollectDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpSettDailyCollectDaoImpl.java
@@ -15,11 +15,10 @@
  */
 package com.roncoo.pay.account.dao.impl;
 
-import org.springframework.stereotype.Repository;
-
 import com.roncoo.pay.account.dao.RpSettDailyCollectDao;
 import com.roncoo.pay.account.entity.RpSettDailyCollect;
 import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl;
+import org.springframework.stereotype.Repository;
 
 /**
  *  每日待结算汇总dao实现类
@@ -27,6 +26,6 @@ import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl;
  * @author:zenghao
  */
 @Repository
-public class RpSettDailyCollectDaoImpl  extends BaseDaoImpl implements RpSettDailyCollectDao{
+public class RpSettDailyCollectDaoImpl  extends BaseDaoImpl implements RpSettDailyCollectDao {
 
 }
\ No newline at end of file
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpSettRecordAnnexDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpSettRecordAnnexDaoImpl.java
index 22925793e5c80efb2649817a9d9da9edbba76a0c..049e5ca9a6693f15a29cac8b23cf334b75f7d06a 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpSettRecordAnnexDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpSettRecordAnnexDaoImpl.java
@@ -15,11 +15,10 @@
  */
 package com.roncoo.pay.account.dao.impl;
 
-import org.springframework.stereotype.Repository;
-
 import com.roncoo.pay.account.dao.RpSettRecordAnnexDao;
 import com.roncoo.pay.account.entity.RpSettRecordAnnex;
 import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl;
+import org.springframework.stereotype.Repository;
 
 /**
  *  结算记录附件dao实现类
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpSettRecordDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpSettRecordDaoImpl.java
index 375f388ca0f533440b0373fe9f4a31fef572c60f..6db9fe0a95c0e07832c37bc8c9ad1265dd6fc2fa 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpSettRecordDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/dao/impl/RpSettRecordDaoImpl.java
@@ -15,11 +15,10 @@
  */
 package com.roncoo.pay.account.dao.impl;
 
-import org.springframework.stereotype.Repository;
-
 import com.roncoo.pay.account.dao.RpSettRecordDao;
 import com.roncoo.pay.account.entity.RpSettRecord;
 import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl;
+import org.springframework.stereotype.Repository;
 
 /**
  *  结算记录dao实现类
@@ -27,6 +26,6 @@ import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl;
  * @author:zenghao
  */
 @Repository
-public class RpSettRecordDaoImpl  extends BaseDaoImpl implements RpSettRecordDao{
+public class RpSettRecordDaoImpl  extends BaseDaoImpl implements RpSettRecordDao {
 
 }
\ No newline at end of file
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpAccount.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpAccount.java
index e7160b0e15c2055df67112098b9042913abec1f6..1e66e0d003a9b6973e69708c79687934edc0ef0e 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpAccount.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpAccount.java
@@ -15,11 +15,11 @@
  */
 package com.roncoo.pay.account.entity;
 
+import com.roncoo.pay.common.core.entity.BaseEntity;
+
 import java.io.Serializable;
 import java.math.BigDecimal;
 
-import com.roncoo.pay.common.core.entity.BaseEntity;
-
 /**
  * 账户信息
  * 龙果学院:www.roncoo.com
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpAccountHistory.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpAccountHistory.java
index 173eebc35a0617f68561581d14206e6b39993f5e..a9fa4edc77b5d55b0daa99784901707cd37c7719 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpAccountHistory.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpAccountHistory.java
@@ -15,13 +15,14 @@
  */
 package com.roncoo.pay.account.entity;
 
-import java.io.Serializable;
-import java.math.BigDecimal;
-
 import com.roncoo.pay.account.enums.AccountFundDirectionEnum;
 import com.roncoo.pay.common.core.entity.BaseEntity;
+import com.roncoo.pay.common.core.utils.DateUtils;
 import com.roncoo.pay.trade.enums.TrxTypeEnum;
 
+import java.io.Serializable;
+import java.math.BigDecimal;
+
 /**
  * 账户历史信息
  * 龙果学院:www.roncoo.com
@@ -170,4 +171,16 @@ public class RpAccountHistory extends BaseEntity implements Serializable {
     public void setUserNo(String userNo) {
         this.userNo = userNo == null ? null : userNo.trim();
     }
+    
+    public String getAmountDesc() {
+    	if(this.getFundDirection().equals(AccountFundDirectionEnum.ADD.name())){
+    		return "+"+this.amount.doubleValue()+"";
+    	}else{
+    		return "-"+this.amount.doubleValue()+"";
+    	}
+    }
+    
+    public String getCreateTimeDesc() {
+    	return DateUtils.formatDate(this.getCreateTime(), "yyyy-MM-dd HH:mm:ss");
+    }
 }
\ No newline at end of file
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpSettDailyCollect.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpSettDailyCollect.java
index 4b461d61dcd1da042f6f2ed5bdd0c33817af3119..47d68703862a66de3afd8e3f7f8f1718e0a6063a 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpSettDailyCollect.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpSettDailyCollect.java
@@ -15,11 +15,11 @@
  */
 package com.roncoo.pay.account.entity;
 
+import com.roncoo.pay.common.core.entity.BaseEntity;
+
 import java.math.BigDecimal;
 import java.util.Date;
 
-import com.roncoo.pay.common.core.entity.BaseEntity;
-
 /**
  * 每日待结算汇总实体
  * 龙果学院:www.roncoo.com
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpSettRecord.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpSettRecord.java
index 4add18bb01c7b943e590843a8c7733c924b7e01b..da94856daddb4f339277e30d300fd9b6cc248a3c 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpSettRecord.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpSettRecord.java
@@ -15,14 +15,15 @@
  */
 package com.roncoo.pay.account.entity;
 
-import java.math.BigDecimal;
-import java.util.Date;
-
 import com.roncoo.pay.account.enums.SettModeTypeEnum;
 import com.roncoo.pay.account.enums.SettRecordStatusEnum;
 import com.roncoo.pay.common.core.entity.BaseEntity;
+import com.roncoo.pay.common.core.utils.DateUtils;
 import com.roncoo.pay.user.enums.BankAccountTypeEnum;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 /**
  * 结算记录
  * 龙果学院:www.roncoo.com
@@ -548,5 +549,9 @@ public class RpSettRecord extends BaseEntity {
     public String getSettStatusDesc() {
     	return SettRecordStatusEnum.getEnum(this.getSettStatus()).getDesc();
     }
+    
+    public String getCreateTimeDesc() {
+    	return DateUtils.formatDate(this.getCreateTime(), "yyyy-MM-dd HH:mm:ss");
+    }
 
 }
\ No newline at end of file
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpSettRecordAnnex.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpSettRecordAnnex.java
index dafdd626ac9e73a18bca1ac7ff7b295cfa87968b..eb06ef7f913c8108ef65f67e7c1fcb58d4b6060c 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpSettRecordAnnex.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/entity/RpSettRecordAnnex.java
@@ -15,11 +15,11 @@
  */
 package com.roncoo.pay.account.entity;
 
-import java.io.Serializable;
-
 import com.roncoo.pay.common.core.entity.BaseEntity;
 import com.roncoo.pay.common.core.enums.PublicEnum;
 
+import java.io.Serializable;
+
 /**
  * 结算附件表
  * 龙果学院:www.roncoo.com
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/exception/AccountBizException.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/exception/AccountBizException.java
index 0d46043cedbaa1f6e03319c1a3907e7f4bfedf54..35ef77965dbdfe6bff2589e6609fd5315dedbcbf 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/exception/AccountBizException.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/exception/AccountBizException.java
@@ -15,11 +15,10 @@
  */
 package com.roncoo.pay.account.exception;
 
+import com.roncoo.pay.common.core.exception.BizException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.roncoo.pay.common.core.exception.BizException;
-
 /**
  * 账户服务业务异常类,异常代码8位数字组成,前4位固定1001打头,后4位自定义
  * 龙果学院:www.roncoo.com
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/exception/SettBizException.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/exception/SettBizException.java
index 2b5c729974ee3d2646b8f09f0c5ac9dcb798bfb2..76ec7ecbdefdda9adb560c8b5db8d181e41dac56 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/exception/SettBizException.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/exception/SettBizException.java
@@ -15,11 +15,10 @@
  */
 package com.roncoo.pay.account.exception;
 
+import com.roncoo.pay.common.core.exception.BizException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import com.roncoo.pay.common.core.exception.BizException;
-
 /**
  * 结算服务业务异常类,异常代码8位数字组成,前4位固定1001打头,后4位自定义
  * 龙果学院:www.roncoo.com
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/RpAccountQueryService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/RpAccountQueryService.java
index 08b6901047ff6f072eb4cbe889263988d5a5c918..d55e9ff469f67fd116ecaded15833df0e8410ba2 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/RpAccountQueryService.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/RpAccountQueryService.java
@@ -15,9 +15,6 @@
  */
 package com.roncoo.pay.account.service;
 
-import java.util.List;
-import java.util.Map;
-
 import com.roncoo.pay.account.entity.RpAccount;
 import com.roncoo.pay.account.entity.RpAccountHistory;
 import com.roncoo.pay.account.vo.DailyCollectAccountHistoryVo;
@@ -25,6 +22,9 @@ import com.roncoo.pay.common.core.exception.BizException;
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 账户查询service接口
  * 龙果学院:www.roncoo.com
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/RpAccountTransactionService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/RpAccountTransactionService.java
index 0196422deddf1290c9b841cd51cb28c41a7ca3d9..ee07c9789f6bc1b81c4ae0b0e21d6e7306615291 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/RpAccountTransactionService.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/RpAccountTransactionService.java
@@ -15,11 +15,11 @@
  */
 package com.roncoo.pay.account.service;
 
-import java.math.BigDecimal;
-
 import com.roncoo.pay.account.entity.RpAccount;
 import com.roncoo.pay.common.core.exception.BizException;
 
+import java.math.BigDecimal;
+
 /**
  *  账户操作service接口
  * 龙果学院:www.roncoo.com
@@ -28,10 +28,10 @@ import com.roncoo.pay.common.core.exception.BizException;
 public interface RpAccountTransactionService {
 
 	/** 加款:有银行流水 **/
-	RpAccount creditToAccount(String userNo, BigDecimal amount, String requestNo,String bankTrxNo, String trxType, String remark) throws BizException;
+	RpAccount creditToAccount(String userNo, BigDecimal amount, String requestNo, String bankTrxNo, String trxType, String remark) throws BizException;
 
 	/** 减款 :有银行流水**/
-	RpAccount debitToAccount(String userNo, BigDecimal amount, String requestNo,String bankTrxNo, String trxType, String remark) throws BizException;
+	RpAccount debitToAccount(String userNo, BigDecimal amount, String requestNo, String bankTrxNo, String trxType, String remark) throws BizException;
 	
 	/** 加款 **/
 	RpAccount creditToAccount(String userNo, BigDecimal amount, String requestNo, String trxType, String remark) throws BizException;
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/RpSettQueryService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/RpSettQueryService.java
index 198e74dae6a83c621f6d8e739ce412ca5fba65a3..41bc1f23b26bacb5e1593fc73a9ee6452f301dc4 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/RpSettQueryService.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/RpSettQueryService.java
@@ -15,13 +15,13 @@
  */
 package com.roncoo.pay.account.service;
 
-import java.util.Map;
-
 import com.roncoo.pay.account.entity.RpSettRecord;
 import com.roncoo.pay.common.core.exception.BizException;
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 
+import java.util.Map;
+
 /**
  * 结算查询service接口
  * 龙果学院:www.roncoo.com
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountHistoryServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountHistoryServiceImpl.java
index e850bb50fb9b32184219a1e466ffe5f1405888e4..61b98c85acf440d3fa9c754cdbbb16f26f7fdd3d 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountHistoryServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountHistoryServiceImpl.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group.
- *  
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- *  
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- *  
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -20,7 +20,6 @@ import com.roncoo.pay.account.entity.RpAccountHistory;
 import com.roncoo.pay.account.service.RpAccountHistoryService;
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -37,7 +36,7 @@ public class RpAccountHistoryServiceImpl implements RpAccountHistoryService{
 
 	@Autowired
 	private RpAccountHistoryDao rpAccountHistoryDao;
-	
+
 	@Override
 	public void saveData(RpAccountHistory rpAccountHistory) {
 		rpAccountHistoryDao.insert(rpAccountHistory);
@@ -57,6 +56,7 @@ public class RpAccountHistoryServiceImpl implements RpAccountHistoryService{
 	public PageBean listPage(PageParam pageParam, RpAccountHistory rpAccountHistory) {
 		Map paramMap = new HashMap();
 		paramMap.put("accountNo", rpAccountHistory.getAccountNo());
+		paramMap.put("userNo", rpAccountHistory.getUserNo());
 		return rpAccountHistoryDao.listPage(pageParam, paramMap);
 	}
-}
\ No newline at end of file
+}
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountQueryServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountQueryServiceImpl.java
index a1e8d063c569ef55c319e6e8359845427eab615e..09b0911ad29dc2368c149d4d93c5384eb482bd7f 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountQueryServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountQueryServiceImpl.java
@@ -15,18 +15,6 @@
  */
 package com.roncoo.pay.account.service.impl;
 
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import com.roncoo.pay.account.dao.RpAccountDao;
 import com.roncoo.pay.account.dao.RpAccountHistoryDao;
 import com.roncoo.pay.account.entity.RpAccount;
@@ -39,6 +27,17 @@ import com.roncoo.pay.common.core.exception.BizException;
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.common.core.utils.DateUtils;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 账户查询service实现类
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountServiceImpl.java
index 3c59de47b7d80ebf1a967fae9a314f8e305a9325..72573e1ffc7ee919b1b4b74f38a4522d7b0bf8ec 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountServiceImpl.java
@@ -20,7 +20,6 @@ import com.roncoo.pay.account.entity.RpAccount;
 import com.roncoo.pay.account.service.RpAccountService;
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountTransactionServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountTransactionServiceImpl.java
index a5023ed7343654f5483237436a6a2b0dd425402e..97c7e5df5ca31f8d30d79ab085687282cfe45204 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountTransactionServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpAccountTransactionServiceImpl.java
@@ -15,17 +15,6 @@
  */
 package com.roncoo.pay.account.service.impl;
 
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import com.roncoo.pay.account.dao.RpAccountDao;
 import com.roncoo.pay.account.dao.RpAccountHistoryDao;
 import com.roncoo.pay.account.entity.RpAccount;
@@ -37,6 +26,16 @@ import com.roncoo.pay.common.core.enums.PublicEnum;
 import com.roncoo.pay.common.core.utils.DateUtils;
 import com.roncoo.pay.common.core.utils.StringUtil;
 import com.roncoo.pay.trade.enums.TrxTypeEnum;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * 账户操作service实现类
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpSettHandleServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpSettHandleServiceImpl.java
index 913d23fa794b73eabcefdfc764c4e6e15131bed3..82a3c33cdaaef413cc67977bbddc63698c9928c2 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpSettHandleServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpSettHandleServiceImpl.java
@@ -15,14 +15,6 @@
  */
 package com.roncoo.pay.account.service.impl;
 
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import com.roncoo.pay.account.dao.RpSettDailyCollectDao;
 import com.roncoo.pay.account.dao.RpSettRecordDao;
 import com.roncoo.pay.account.entity.RpAccount;
@@ -48,6 +40,13 @@ import com.roncoo.pay.user.enums.BankAccountTypeEnum;
 import com.roncoo.pay.user.exception.UserBizException;
 import com.roncoo.pay.user.service.RpUserBankAccountService;
 import com.roncoo.pay.user.service.RpUserInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
 
 /**
  * 结算核心业务处理实现类
@@ -153,7 +152,7 @@ public class RpSettHandleServiceImpl implements RpSettHandleService {
 	 */
 
 	@Transactional(rollbackFor = Exception.class)
-	private void launchSett(String userNo, String userName, String accountNo, BigDecimal settAmount, RpUserBankAccount bankAccount,String settType) {
+	private void launchSett(String userNo, String userName, String accountNo, BigDecimal settAmount, RpUserBankAccount bankAccount, String settType) {
 		
 		// 所行查询账户
 		RpSettRecord settRecord = new RpSettRecord();
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpSettQueryServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpSettQueryServiceImpl.java
index a756598f9df43a8721a2e066e4eb8a2741f1ded0..23f52b2b2130b6ce544082332c1806f673e0b05d 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpSettQueryServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/service/impl/RpSettQueryServiceImpl.java
@@ -15,11 +15,6 @@
  */
 package com.roncoo.pay.account.service.impl;
 
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import com.roncoo.pay.account.dao.RpSettDailyCollectDao;
 import com.roncoo.pay.account.dao.RpSettRecordDao;
 import com.roncoo.pay.account.entity.RpSettRecord;
@@ -27,6 +22,10 @@ import com.roncoo.pay.account.service.RpSettQueryService;
 import com.roncoo.pay.common.core.exception.BizException;
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
 
 /**
  * 结算查询service实现类
@@ -51,7 +50,7 @@ public class RpSettQueryServiceImpl implements RpSettQueryService {
 	 * @return
 	 * @throws BizException
 	 */
-	public PageBean querySettRecordListPage(PageParam pageParam, Map params) throws BizException{
+	public PageBean querySettRecordListPage(PageParam pageParam, Map params) throws BizException {
 		return rpSettRecordDao.listPage(pageParam, params);
 	}
 
@@ -65,7 +64,7 @@ public class RpSettQueryServiceImpl implements RpSettQueryService {
 	 * @return
 	 * @throws BizException
 	 */
-	public PageBean querySettDailyCollectListPage(PageParam pageParam, Map params) throws BizException{
+	public PageBean querySettDailyCollectListPage(PageParam pageParam, Map params) throws BizException {
 		return settDailyCollectMapper.listPage(pageParam, params);
 	}
 	
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/utils/AccountConfigUtil.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/utils/AccountConfigUtil.java
index 23206da9c45c825881131985b2e5b14fd515b422..2abb06ecd6d0be090fc663137ead4e0a93946325 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/account/utils/AccountConfigUtil.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/account/utils/AccountConfigUtil.java
@@ -15,12 +15,12 @@
  */
 package com.roncoo.pay.account.utils;
 
-import java.io.IOException;
-import java.util.Properties;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import java.io.IOException;
+import java.util.Properties;
+
 /**
  * 龙果学院:www.roncoo.com
  * @author:zenghao
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/banklink/utils/weixin/UploadUtils.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/banklink/utils/weixin/UploadUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..8277d9dac37377261b11667a9e88e8ff07d9a2cf
--- /dev/null
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/banklink/utils/weixin/UploadUtils.java
@@ -0,0 +1,109 @@
+package com.roncoo.pay.banklink.utils.weixin;
+
+import com.roncoo.pay.trade.utils.WeixinConfigUtil;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.protocol.HTTP;
+import org.apache.http.ssl.SSLContexts;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.SSLContext;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.security.KeyStore;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 微信图片上传
+ */
+public class UploadUtils {
+
+    private static final Logger logger = LoggerFactory.getLogger(UploadUtils.class);
+
+    public static Map upload(File file) {
+        Map returnMap = new HashMap<>();
+        returnMap.put("return_msg", "上传失败");
+        try {
+            String mch_id = WeixinConfigUtil.readConfig("service_mch_id");
+            String media_hash = WxCommonUtil.md5HashCode(new FileInputStream(file));
+            String sign_type = "HMAC-SHA256";
+            Map paramMap = new HashMap<>();
+            paramMap.put("mch_id", mch_id);
+            paramMap.put("media_hash", media_hash);
+            paramMap.put("sign_type", sign_type);
+            String sign = WxCommonUtil.sha256Sign(paramMap, WeixinConfigUtil.readConfig("service_pay_key"));
+            MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
+            multipartEntityBuilder.addTextBody("mch_id", mch_id, ContentType.MULTIPART_FORM_DATA);
+            multipartEntityBuilder.addBinaryBody("media", file, ContentType.create("image/png"), file.getName());
+            multipartEntityBuilder.addTextBody("media_hash", media_hash, ContentType.MULTIPART_FORM_DATA);
+            multipartEntityBuilder.addTextBody("sign_type", sign_type, ContentType.MULTIPART_FORM_DATA);
+            multipartEntityBuilder.addTextBody("sign", sign, ContentType.MULTIPART_FORM_DATA);
+
+            FileInputStream instream = null;
+            SSLContext sslcontext = null;
+            try {
+                KeyStore keyStore = KeyStore.getInstance("PKCS12");
+                instream = new FileInputStream(new File(WeixinConfigUtil.readConfig("service_key_store_url")));
+                keyStore.load(instream, mch_id.toCharArray());
+                sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mch_id.toCharArray()).build();
+            } catch (Exception e) {
+                returnMap.put("return_msg", e.getMessage());
+                logger.error("官方微信--证书加载失败!{}", e);
+            } finally {
+                try {
+                    if (instream != null) {
+                        instream.close();
+                    }
+                } catch (IOException e) {
+                    returnMap.put("return_msg", e.getMessage());
+                    logger.error("官方微信--证书加载失败!{}", e);
+                }
+            }
+            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
+            CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
+            try {
+                // 请求微信图片上传接口
+                HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/secapi/mch/uploadmedia");
+                RequestConfig config = RequestConfig.custom().setConnectTimeout(10000).setConnectionRequestTimeout(10000).setSocketTimeout(10000).build();
+                httpPost.setConfig(config);
+                httpPost.addHeader(HTTP.CONTENT_TYPE, "multipart/form-data; charset=UTF-8");
+                httpPost.addHeader(HTTP.USER_AGENT, "wxpay sdk java v1.0 " + mch_id);
+                httpPost.setEntity(multipartEntityBuilder.build());
+                CloseableHttpResponse response = httpclient.execute(httpPost);
+                String result = EntityUtils.toString(response.getEntity(), "UTF-8");
+                logger.info("官方微信--请求返回结果:{}", result);
+                Map resultMap = WxCommonUtil.xmlToMap(result);
+                return resultMap;
+            } catch (Exception e) {
+                logger.error("官方微信--请求失败!{}", e);
+                return returnMap;
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage());
+            return returnMap;
+        }
+    }
+
+    /**
+     * 删除临时文件
+     *
+     * @param files
+     */
+    public static void deleteFile(File... files) {
+        for (File file : files) {
+            if (file.exists()) {
+                file.delete();
+            }
+        }
+    }
+}
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/banklink/utils/weixin/WeiXinMicroUtils.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/banklink/utils/weixin/WeiXinMicroUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..f4baf9f113c578f012ca2a9b3051fb5b649d8961
--- /dev/null
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/banklink/utils/weixin/WeiXinMicroUtils.java
@@ -0,0 +1,137 @@
+package com.roncoo.pay.banklink.utils.weixin;
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.roncoo.pay.trade.entity.RpMicroSubmitRecord;
+import com.roncoo.pay.trade.utils.WeixinConfigUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+
+/**
+ * 微信小微商户工具
+ * Created by Quanf
+ * 2018/12/21
+ */
+public class WeiXinMicroUtils {
+
+    private static final Logger LOG = LoggerFactory.getLogger(WeiXinMicroUtils.class);
+
+    private static final String MCH_ID = WeixinConfigUtil.readConfig("service_mch_id");
+
+    private static final String KEY_STORE_URL = WeixinConfigUtil.readConfig("service_key_store_url");
+
+    private static final String PAY_KEY = WeixinConfigUtil.readConfig("service_pay_key");
+
+    private static final String APIV3_SECRET = WeixinConfigUtil.readConfig("service_APIv3_secret");
+
+    private static final String MICRO_QUERY_URL = "https://api.mch.weixin.qq.com/applyment/micro/getstate";
+
+    private static final String MICRO_SUBMIT_URL = "https://api.mch.weixin.qq.com/applyment/micro/submit";
+
+
+    /**
+     * 小微商户-进件
+     *
+     * @param submitParam
+     * @return
+     */
+    public static Map microSubmit(RpMicroSubmitRecord submitParam) {
+        Map returnMap = new HashMap<>();
+
+        LOG.info("官方微信--小微商户-进件");
+        // 获取证书信息
+        Map certificates = WxCommonUtil.getCertificates(MCH_ID, PAY_KEY);
+        certificates = JSONObject.parseObject(certificates.get("certificates").toString());
+        JsonElement jsonelement = new JsonParser().parse(certificates.get("data").toString());
+        JsonArray arr = jsonelement.getAsJsonArray();
+        Iterator it = arr.iterator();
+        String associatedData = null;
+        String nonce = null;
+        String ciphertextEncrypt = null;
+        String serialNo = null;
+        while (it.hasNext()) {
+            JsonElement ele = it.next();
+            JsonObject o = ele.getAsJsonObject();//数组里面的每一个元素都是一个对象,所以用getAsObject
+            serialNo = o.get("serial_no").getAsString();
+            JsonObject infoEle = o.get("encrypt_certificate").getAsJsonObject();//你要的是对象里面的info属性,info的值是一个object
+            associatedData = infoEle.get("associated_data").getAsString();//从获取到的info对象获取name的值
+            nonce = infoEle.get("nonce").getAsString();//同理
+            ciphertextEncrypt = infoEle.get("ciphertext").getAsString();//同理
+        }
+        try {
+            // 获取证书明文,备用字段1:APIv3Secret
+            String ciphertext = WxCommonUtil.aesgcmDecrypt(associatedData, nonce, ciphertextEncrypt, APIV3_SECRET);
+            SortedMap paramMap = new TreeMap<>();
+            paramMap.put("version", "3.0");
+            paramMap.put("cert_sn", serialNo);
+            paramMap.put("mch_id", MCH_ID);
+            paramMap.put("nonce_str", WxCommonUtil.createNonceStr());
+            paramMap.put("sign_type", "HMAC-SHA256");
+            paramMap.put("business_code", submitParam.getBusinessCode());// 业务申请编号,订单号,查询状态时需要
+            paramMap.put("id_card_copy", submitParam.getIdCardCopy());
+            paramMap.put("id_card_national", submitParam.getIdCardNational());
+            paramMap.put("id_card_name", WxCommonUtil.rsaEncrypt(submitParam.getIdCardName(), ciphertext));
+            paramMap.put("id_card_number", WxCommonUtil.rsaEncrypt(submitParam.getIdCardNumber(), ciphertext));
+            paramMap.put("id_card_valid_time", submitParam.getIdCardValidTime());
+            paramMap.put("account_name", WxCommonUtil.rsaEncrypt(submitParam.getIdCardName(), ciphertext));
+            paramMap.put("account_bank", submitParam.getAccountBank());
+            paramMap.put("bank_address_code", submitParam.getBankAddressCode());
+            paramMap.put("account_number", WxCommonUtil.rsaEncrypt(submitParam.getAccountNumber(), ciphertext));
+            paramMap.put("store_name", submitParam.getStoreName());
+            paramMap.put("store_address_code", submitParam.getStoreAddressCode());
+            paramMap.put("store_street", submitParam.getStoreStreet());
+            paramMap.put("store_entrance_pic", submitParam.getStoreEntrancePic());
+            paramMap.put("indoor_pic", submitParam.getIndoorPic());
+            paramMap.put("merchant_shortname", submitParam.getMerchantShortname());//将在支付完成页向买家展示
+            paramMap.put("service_phone", submitParam.getServicePhone());//将在交易记录中向买家展示,请确保电话畅通以便微信回拨确认
+            paramMap.put("product_desc", submitParam.getProductDesc());
+            paramMap.put("rate", submitParam.getRate());
+            paramMap.put("contact", WxCommonUtil.rsaEncrypt(submitParam.getIdCardName(), ciphertext));
+            paramMap.put("contact_phone", WxCommonUtil.rsaEncrypt(submitParam.getContactPhone(), ciphertext));
+            paramMap.put("sign", WxCommonUtil.sha256Sign(paramMap, PAY_KEY));
+            String data = WxCommonUtil.mapToXml(paramMap);
+            String returnStr = WxCommonUtil.requestPostSSL(MCH_ID, KEY_STORE_URL, data, MICRO_SUBMIT_URL);
+            returnMap = WxCommonUtil.xmlToMap(returnStr);
+        } catch (Exception e) {
+            returnMap.put("return_msg", e.getMessage());
+            e.printStackTrace();
+            LOG.error(e.getMessage());
+        }
+        return returnMap;
+    }
+
+
+    /**
+     * 小微商户-进件查询
+     *
+     * @param businessCode
+     * @return
+     */
+    public static Map microQuery(String businessCode) {
+        Map returnMap = new HashMap<>();
+        LOG.info("官方微信--小微商户-进件查询");
+        try {
+            // 获取证书明文,备用字段1:APIv3Secret
+            SortedMap paramMap = new TreeMap<>();
+            paramMap.put("version", "1.0");
+            paramMap.put("mch_id", MCH_ID);
+            paramMap.put("nonce_str", WxCommonUtil.createNonceStr());
+            paramMap.put("business_code", businessCode);
+            paramMap.put("sign_type", "HMAC-SHA256");
+            paramMap.put("sign", WxCommonUtil.sha256Sign(paramMap, PAY_KEY));
+            String data = WxCommonUtil.mapToXml(paramMap);
+            String returnStr = WxCommonUtil.requestPostSSL(MCH_ID, KEY_STORE_URL, data, MICRO_QUERY_URL);
+            returnMap = WxCommonUtil.xmlToMap(returnStr);
+        } catch (Exception e) {
+            returnMap.put("errMsg", e.getMessage());
+            e.printStackTrace();
+            LOG.error(e.getMessage());
+        }
+        return returnMap;
+    }
+}
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/banklink/utils/weixin/WxCityNo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/banklink/utils/weixin/WxCityNo.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a94cbc47bd79621ab4ce6938ca13001ac7d8736
--- /dev/null
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/banklink/utils/weixin/WxCityNo.java
@@ -0,0 +1,70 @@
+
+package com.roncoo.pay.banklink.utils.weixin;
+
+import org.springframework.core.io.ClassPathResource;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class WxCityNo {
+
+    /**
+     * @author:
+     * @date:2018/8/30
+     * @description:从txt文件读取List
+     */
+    public static List getList() {
+        List strList = new ArrayList();
+        InputStreamReader read = null;
+        BufferedReader reader = null;
+        try {
+            read = new InputStreamReader(new ClassPathResource("WxCityNo.txt").getInputStream(), "utf-8");
+            reader = new BufferedReader(read);
+            String line;
+            while ((line = reader.readLine()) != null) {
+                Map strMap = new HashMap<>();
+                strMap.put("name", line.substring(0, line.indexOf("=")));
+                strMap.put("desc", line.substring(line.indexOf("=") + 1));
+                strList.add(strMap);
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (read != null) {
+                try {
+                    read.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+
+        }
+        return strList;
+    }
+
+    public static String getCityNameByNo(String cityNo) {
+        List list = getList();
+        String cityName = null;
+        for (int i = 0; i < list.size(); i++) {
+            Map map = (HashMap) list.get(i);
+            if (cityNo.equals(map.get("name"))) {
+                cityName = (String) map.get("desc");
+            }
+        }
+        return cityName;
+    }
+}
\ No newline at end of file
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/banklink/utils/weixin/WxCommonUtil.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/banklink/utils/weixin/WxCommonUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..1189d19aa07071ce3aa8fee85306ee0f175b2a6a
--- /dev/null
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/banklink/utils/weixin/WxCommonUtil.java
@@ -0,0 +1,357 @@
+package com.roncoo.pay.banklink.utils.weixin;
+
+import com.roncoo.pay.common.core.utils.Base64;
+import com.roncoo.pay.common.core.utils.HttpClientUtil;
+import com.roncoo.pay.common.core.utils.MD5Util;
+import com.roncoo.pay.common.core.utils.StringUtil;
+import org.apache.commons.codec.binary.Hex;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.protocol.HTTP;
+import org.apache.http.ssl.SSLContexts;
+import org.apache.http.util.EntityUtils;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.crypto.Cipher;
+import javax.crypto.Mac;
+import javax.crypto.spec.GCMParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import javax.net.ssl.SSLContext;
+import javax.security.cert.X509Certificate;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.KeyStore;
+import java.security.MessageDigest;
+import java.security.PublicKey;
+import java.util.*;
+
+/**
+ * 微信前面工具
+ */
+public final class WxCommonUtil {
+
+    private static final Logger logger = LoggerFactory.getLogger(WxCommonUtil.class);
+
+    private static final String HTTP_CONTENT_TYPE = "application/x-www-form-urlencoded; charset=UTF-8";
+    private static final String CHARSET_UTF_8 = "UTF-8";
+    private static final String HTTP_USER_AGENT = "wxpay sdk java v1.0 ";
+    private static final int TIMEOUT = 10000;
+
+    private WxCommonUtil() {
+
+    }
+
+    /**
+     * 获取MD5签名
+     *
+     * @param paramMap 签名参数(sign不参与签名)
+     * @param key      签名密钥
+     * @return MD5签名结果
+     */
+    public final static String md5Sign(Map paramMap, String key) {
+        String payParam = getSignTemp(paramMap, key);
+        String sign = MD5Util.encode32ToUpperCase(payParam);
+        logger.info("MD5签名结果:{}", sign);
+        return sign;
+    }
+
+    /**
+     * 获取HMAC-SHA256签名
+     *
+     * @param paramMap 签名参数(sign不参与签名)
+     * @param key      签名密钥
+     * @return HMAC-SHA256签名结果
+     */
+    public final static String sha256Sign(Map paramMap, String key) {
+        try {
+            String payParam = getSignTemp(paramMap, key);
+            Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
+            SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
+            sha256_HMAC.init(secret_key);
+            byte[] array = sha256_HMAC.doFinal(payParam.getBytes("UTF-8"));
+            StringBuilder sb = new StringBuilder();
+            for (byte item : array) {
+                sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+            }
+            String sign = sb.toString().toUpperCase();
+            logger.info("HMAC-SHA256签名结果:{}", sign);
+            return sign;
+        } catch (Exception e) {
+            logger.error("HMAC-SHA256签名异常:{}", e);
+            return null;
+        }
+    }
+
+    /**
+     * 获取签名参数字符串
+     *
+     * @param paramMap 签名参数(sign字段不参与签名)
+     * @param payKey   签名密钥
+     * @return 待签名字符串
+     */
+    private final static String getSignTemp(Map paramMap, String payKey) {
+        ArrayList keyList = new ArrayList<>(paramMap.keySet());
+        Collections.sort(keyList);
+
+        StringBuilder signParam = new StringBuilder();
+        for (String key : keyList) {
+            if (!"sign".equals(key) && StringUtil.isNotNull(paramMap.get(key))) {
+                signParam.append(key).append("=").append(paramMap.get(key)).append("&");
+            }
+        }
+        signParam.delete(signParam.length() - 1, signParam.length());
+        logger.info("签名原文:{}", signParam.toString());
+
+        signParam.append("&key=").append(payKey);
+        return signParam.toString();
+    }
+
+    /**
+     * 生产随机数
+     *
+     * @return
+     */
+    public final static String createNonceStr() {
+        StringBuilder nonceStr = new StringBuilder();
+        Random random = new Random();
+        for (int i = 0, lenght = 31; i < lenght; i++) {
+            nonceStr.append(random.nextInt(10));
+        }
+        logger.info("微信服务商随机字符串:[{}]", nonceStr);
+        return nonceStr.toString();
+    }
+
+    /**
+     * Map转Xml
+     *
+     * @param paramMap 待转换参数
+     * @return
+     */
+    public final static String mapToXml(final Map paramMap) {
+        StringBuilder xmlBuilder = new StringBuilder();
+        xmlBuilder.append("");
+        for (Map.Entry entry : paramMap.entrySet()) {
+            xmlBuilder.append("<").append(entry.getKey()).append(">").append(entry.getValue()).append("");
+        }
+        xmlBuilder.append("");
+        logger.info("微信服务商--Map转XML结果:{}", xmlBuilder.toString());
+        return xmlBuilder.toString();
+    }
+
+    /**
+     * Xml转Map
+     *
+     * @param resultStr 带转换字符串
+     * @return
+     */
+    public final static Map xmlToMap(final String resultStr) {
+        if (resultStr == null || StringUtil.isEmpty(resultStr)) {
+            logger.error("微信服务商--待解析的XML报文为空!");
+            return null;
+        }
+        try {
+            Map resultMap = new HashMap<>();
+            Document doc = DocumentHelper.parseText(resultStr);
+            List list = doc.getRootElement().elements();
+            for (Element element : list) {
+                resultMap.put(element.getName(), element.getText());
+            }
+            return resultMap;
+        } catch (DocumentException e) {
+            logger.error("微信服务商--解析XML失败!{}", e);
+            return null;
+        }
+    }
+
+    /**
+     * post请求(带证书)
+     *
+     * @param mchId       (商户号)证书的key
+     * @param keyStoreUrl 证书的路径
+     * @param data        发送的数据
+     * @param requestUrl  发送的路径
+     * @return 请求结果
+     */
+    public final static String requestPostSSL(final String mchId, final String keyStoreUrl, final String data, final String requestUrl) {
+        logger.info("官方微信--请求商户号:{},证书路径:{},请求地址:{},请求参数:{}", mchId, keyStoreUrl, requestUrl, data);
+        FileInputStream instream = null;
+        SSLContext sslcontext = null;
+        try {
+            KeyStore keyStore = KeyStore.getInstance("PKCS12");
+            instream = new FileInputStream(new File(keyStoreUrl));
+            keyStore.load(instream, mchId.toCharArray());// 这里写密码..默认是你的MCHID
+            sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchId.toCharArray()).build();
+        } catch (Exception e) {
+            logger.error("官方微信--证书加载失败!{}", e);
+        } finally {
+            try {
+                if (instream != null) {
+                    instream.close();
+                }
+            } catch (IOException e) {
+                logger.error("官方微信--证书加载失败!{}", e);
+            }
+        }
+        @SuppressWarnings("deprecation")
+        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
+        CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
+        try {
+            HttpPost httpPost = new HttpPost(requestUrl);
+            RequestConfig config = RequestConfig.custom().setConnectTimeout(TIMEOUT).setConnectionRequestTimeout(TIMEOUT).setSocketTimeout(TIMEOUT).build();
+            httpPost.setConfig(config);
+            httpPost.addHeader(HTTP.CONTENT_TYPE, HTTP_CONTENT_TYPE);
+            httpPost.addHeader(HTTP.USER_AGENT, HTTP_USER_AGENT + mchId);
+            httpPost.setEntity(new StringEntity(data, CHARSET_UTF_8));
+            CloseableHttpResponse response = httpclient.execute(httpPost);
+            String result = EntityUtils.toString(response.getEntity(), CHARSET_UTF_8);
+            logger.info("官方微信--请求返回结果:{}", result);
+            return result;
+        } catch (Exception e) {
+            logger.error("官方微信--请求失败!{}", e);
+            return null;
+        }
+    }
+
+    /**
+     * post请求(不带证书)
+     *
+     * @param data       请求参数
+     * @param requestUrl 请求地址
+     * @return 请求返回结果
+     */
+    public static String requestPost(final String data, final String requestUrl) {
+        logger.info("官方微信--请求地址:{},请求参数:{}", requestUrl, data);
+        HttpClient httpClient = HttpClientUtil.getHttpClient();
+        HttpPost httpPost = new HttpPost(requestUrl);
+        StringEntity stringEntity = new StringEntity(data, "UTF-8");
+        httpPost.setEntity(stringEntity);
+        try {
+            HttpResponse httpResponse = httpClient.execute(httpPost);
+            HttpEntity httpEntity = httpResponse.getEntity();
+            String result = EntityUtils.toString(httpEntity, "UTF-8");
+            logger.info("官方微信--请求返回结果:{}", result);
+            return result;
+        } catch (IOException e) {
+            logger.error("官方微信--请求失败!{}", e);
+            return null;
+        }
+    }
+
+    /**
+     * get请求
+     *
+     * @param requestUrl 请求地址
+     * @return 请求返回结果
+     */
+    public static String requestGet(final String requestUrl) {
+        logger.info("官方微信--GET请求地址:{}", requestUrl);
+        HttpClient httpClient = HttpClientUtil.getHttpClient();
+        HttpGet httpGet = new HttpGet(requestUrl);
+        try {
+            HttpResponse httpResponse = httpClient.execute(httpGet);
+            HttpEntity httpEntity = httpResponse.getEntity();
+            String result = EntityUtils.toString(httpEntity, "UTF-8");
+            logger.info("官方微信--GET请求返回结果:{}", result);
+            return result;
+        } catch (IOException e) {
+            logger.error("官方微信--GET请求失败!{}", e);
+            return null;
+        }
+    }
+
+    /**
+     * 获取平台证书
+     *
+     * @param mchId
+     * @param merchantSecret
+     * @return
+     */
+    public static Map getCertificates(String mchId, String merchantSecret) {
+        logger.info("官方微信--获取平台证书");
+        SortedMap paramMap = new TreeMap<>();
+        paramMap.put("mch_id", mchId);
+        paramMap.put("nonce_str", createNonceStr());
+        paramMap.put("sign_type", "HMAC-SHA256");
+        paramMap.put("sign", sha256Sign(paramMap, merchantSecret));
+
+        String data = mapToXml(paramMap);
+        logger.info("官方微信--获取平台证书-请求参数:\r\n{}", data);
+        String result = requestPost(data, "https://api.mch.weixin.qq.com/risk/getcertficates");
+        logger.info("官方微信--获取平台证书-返回结果:\r\n{}", result);
+
+        Map resultMap = xmlToMap(result);
+        logger.info("官方微信--获取平台证书-解析结果:{}", resultMap);
+        return resultMap;
+    }
+
+    /**
+     * @param content    对敏感内容(入参Content)加密
+     * @param ciphertext 平台证书接口得到的参数certificates包含了加密的平台证书内容ciphertext
+     * @return
+     * @throws Exception
+     */
+    public static String rsaEncrypt(String content, String ciphertext) throws Exception {
+        final byte[] PublicKeyBytes = ciphertext.getBytes();
+        X509Certificate certificate = X509Certificate.getInstance(PublicKeyBytes);
+        PublicKey publicKey = certificate.getPublicKey();
+        Cipher ci = Cipher.getInstance("RSA/ECB/PKCS1Padding", "SunJCE");
+        ci.init(Cipher.ENCRYPT_MODE, publicKey);
+        return Base64.encode(ci.doFinal(content.getBytes("UTF-8")));
+    }
+
+
+    /**
+     * @param aad        encrypt_certificate.associated_data
+     * @param iv         encrypt_certificate.nonce
+     * @param cipherText encrypt_certificate.ciphertext
+     * @return 返回ciphertext明文
+     * @throws Exception
+     */
+    public static String aesgcmDecrypt(String aad, String iv, String cipherText, String APIv3Secret) throws Exception {
+        final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "SunJCE");
+        SecretKeySpec key = new SecretKeySpec(APIv3Secret.getBytes(), "AES");
+        GCMParameterSpec spec = new GCMParameterSpec(128, iv.getBytes());
+        cipher.init(Cipher.DECRYPT_MODE, key, spec);
+        cipher.updateAAD(aad.getBytes());
+        return new String(cipher.doFinal(Base64.decode(cipherText)));
+    }
+
+
+    /**
+     * 文件转MD5Hash
+     *
+     * @param fis
+     * @return
+     */
+    public static String md5HashCode(InputStream fis) {
+        try {
+            MessageDigest MD5 = MessageDigest.getInstance("MD5");
+            byte[] buffer = new byte[8192];
+            int length;
+            while ((length = fis.read(buffer)) != -1) {
+                MD5.update(buffer, 0, length);
+            }
+            return new String(Hex.encodeHex(MD5.digest()));
+        } catch (Exception e) {
+            logger.error(e.getMessage());
+            return null;
+        }
+    }
+
+}
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/config/ActiveMqConfig.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/config/ActiveMqConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..a6f18ca55390db3348e26f45b1f2561feae1bc9f
--- /dev/null
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/config/ActiveMqConfig.java
@@ -0,0 +1,103 @@
+package com.roncoo.pay.config;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.activemq.jms.pool.PooledConnectionFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.jms.connection.SingleConnectionFactory;
+import org.springframework.jms.core.JmsTemplate;
+
+@Configuration
+@PropertySource("classpath:mq_config.properties")
+public class ActiveMqConfig {
+
+    @Value("${mq.brokerURL}")
+    private String mqBrokerURL;
+    @Value("${mq.userName}")
+    private String mqUserName;
+    @Value("${mq.password}")
+    private String mqPassword;
+    @Value("#{10}")
+    private Integer maxConnections;
+
+    @Value("${tradeQueueName.notify}")
+    private String tradeQueueDestinationName;
+    @Value("${orderQueryQueueName.query}")
+    private String orderQueryDestinationName;
+
+    /**
+     * 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供
+     *
+     * @return 真正的连接工厂
+     */
+    @Bean(name = "targetConnectionFactory")
+    public ActiveMQConnectionFactory activeMQConnectionFactory() {
+        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
+        activeMQConnectionFactory.setBrokerURL(mqBrokerURL);
+        activeMQConnectionFactory.setUserName(mqUserName);
+        activeMQConnectionFactory.setPassword(mqPassword);
+        return activeMQConnectionFactory;
+    }
+
+    /**
+     * Spring用于管理真正的ConnectionFactory的ConnectionFactory
+     *
+     * @param pooledConnectionFactory Pooled连接工厂
+     * @return 连接工厂
+     */
+    @Primary
+    @Bean(name = "connectionFactory")
+    public SingleConnectionFactory singleConnectionFactory(@Qualifier("pooledConnectionFactory") PooledConnectionFactory pooledConnectionFactory) {
+        SingleConnectionFactory singleConnectionFactory = new SingleConnectionFactory();
+        singleConnectionFactory.setTargetConnectionFactory(pooledConnectionFactory);
+        return singleConnectionFactory;
+    }
+
+    /**
+     * ActiveMQ为我们提供了一个PooledConnectionFactory,通过往里面注入一个ActiveMQConnectionFactory
+     * 可以用来将Connection、Session和MessageProducer池化,这样可以大大的减少我们的资源消耗。
+     * 要依赖于 activemq-pool包
+     *
+     * @param activeMQConnectionFactory 目标连接工厂
+     * @return Pooled连接工厂
+     */
+    @Bean(name = "pooledConnectionFactory")
+    public PooledConnectionFactory pooledConnectionFactory(@Qualifier("targetConnectionFactory") ActiveMQConnectionFactory activeMQConnectionFactory) {
+        PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory();
+        pooledConnectionFactory.setConnectionFactory(activeMQConnectionFactory);
+        pooledConnectionFactory.setMaxConnections(maxConnections);
+        return pooledConnectionFactory;
+    }
+
+    /**
+     * 商户通知队列模板
+     *
+     * @param singleConnectionFactory 连接工厂
+     * @return 商户通知队列模板
+     */
+    @Bean(name = "notifyJmsTemplate")
+    public JmsTemplate notifyJmsTemplate(@Qualifier("connectionFactory") SingleConnectionFactory singleConnectionFactory) {
+        JmsTemplate notifyJmsTemplate = new JmsTemplate();
+        notifyJmsTemplate.setConnectionFactory(singleConnectionFactory);
+        notifyJmsTemplate.setDefaultDestinationName(tradeQueueDestinationName);
+        return notifyJmsTemplate;
+    }
+
+    /**
+     * 队列模板
+     *
+     * @param singleConnectionFactory 连接工厂
+     * @return 队列模板
+     */
+    @Bean(name = "jmsTemplate")
+    public JmsTemplate jmsTemplate(@Qualifier("connectionFactory") SingleConnectionFactory singleConnectionFactory) {
+        JmsTemplate notifyJmsTemplate = new JmsTemplate();
+        notifyJmsTemplate.setConnectionFactory(singleConnectionFactory);
+        notifyJmsTemplate.setDefaultDestinationName(orderQueryDestinationName);
+        return notifyJmsTemplate;
+    }
+}
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/config/DruidDataConfig.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/config/DruidDataConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef091e1bbdda1903d196dbd915ebd164216be44a
--- /dev/null
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/config/DruidDataConfig.java
@@ -0,0 +1,54 @@
+package com.roncoo.pay.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.PropertySource;
+
+@Configuration
+@PropertySource("classpath:jdbc.properties")
+public class DruidDataConfig {
+
+    @Value("${jdbc.driver}")
+    private String driverClassName;
+    @Value("${jdbc.url}")
+    private String url;
+    @Value("${jdbc.username}")
+    private String username;
+    @Value("${jdbc.password}")
+    private String password;
+    @Value("${jdbc.initialSize}")
+    private Integer initialSize;
+    @Value("${jdbc.minIdle}")
+    private Integer minIdle;
+    @Value("${jdbc.maxActive}")
+    private Integer maxActive;
+    @Value("${jdbc.maxWait}")
+    private Integer maxWait;
+
+    @Primary
+    @Bean(name = "dataSource", initMethod = "init", destroyMethod = "clone")
+    public DruidDataSource druidDataSource() {
+        DruidDataSource dataSource = new DruidDataSource();
+
+        //基本属性driverClassName、 url、user、password
+        dataSource.setDriverClassName(driverClassName);
+        dataSource.setUrl(url);
+        dataSource.setUsername(username);
+        dataSource.setPassword(password);
+
+        //初始化时建立物理连接的个数,缺省值为0
+        dataSource.setInitialSize(initialSize);
+        //最小连接池数量
+        dataSource.setMinIdle(minIdle);
+        //最大连接池数量,缺省值为8
+        dataSource.setMaxActive(maxActive);
+        //获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁
+        dataSource.setMaxWait(maxWait);
+
+        return dataSource;
+    }
+
+}
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/dao/impl/RpNotifyRecordDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/dao/impl/RpNotifyRecordDaoImpl.java
index 28cb9ef27cd7296f67844416c1f54b3315b68574..2460ed4611f9902baf0e8dbe3302f21ef82d1f2d 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/dao/impl/RpNotifyRecordDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/dao/impl/RpNotifyRecordDaoImpl.java
@@ -3,7 +3,6 @@ package com.roncoo.pay.notify.dao.impl;
 import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl;
 import com.roncoo.pay.notify.dao.RpNotifyRecordDao;
 import com.roncoo.pay.notify.entity.RpNotifyRecord;
-
 import org.springframework.stereotype.Repository;
 
 import java.util.HashMap;
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/dao/impl/RpNotifyRecordLogDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/dao/impl/RpNotifyRecordLogDaoImpl.java
index 2b60d364f79f6930dd09a3119d7ca95a88cb3de4..29aa20947dbea0f4f1db121e8770e52a6a5fe5fd 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/dao/impl/RpNotifyRecordLogDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/dao/impl/RpNotifyRecordLogDaoImpl.java
@@ -3,7 +3,6 @@ package com.roncoo.pay.notify.dao.impl;
 import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl;
 import com.roncoo.pay.notify.dao.RpNotifyRecordLogDao;
 import com.roncoo.pay.notify.entity.RpNotifyRecordLog;
-
 import org.springframework.stereotype.Repository;
 
 /**
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/entity/RpNotifyRecord.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/entity/RpNotifyRecord.java
index 61183f58b143a970580c74aa4145bfcde070b541..62e866d8e5da0df7a72fd56b903d6d2f911b3fd2 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/entity/RpNotifyRecord.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/entity/RpNotifyRecord.java
@@ -15,7 +15,7 @@ import java.util.Date;
  */
 public class RpNotifyRecord  extends BaseEntity {
 
-    private static final long serialVersionUID = -6104194914044220447L;
+    
 
 //    private Long notifyId;
 //
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/entity/RpNotifyRecordLog.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/entity/RpNotifyRecordLog.java
index 15d64d6afdbc08ab4d89b544337b5a9fc484ef23..b832cce3b5eab02add4c9b3cbb01477b24722aee 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/entity/RpNotifyRecordLog.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/entity/RpNotifyRecordLog.java
@@ -12,11 +12,6 @@ import java.util.Date;
  * @版本:V1.0
  */
 public class RpNotifyRecordLog extends BaseEntity {
-    /**
-     *
-     */
-    private static final long serialVersionUID = 459406550725396000L;
-
     /** 通知记录ID **/
     private String notifyId;
 
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/entity/RpOrderResultQueryVo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/entity/RpOrderResultQueryVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..858fa98aa5cf0fd028e1bbd6b6ab84419abe0def
--- /dev/null
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/entity/RpOrderResultQueryVo.java
@@ -0,0 +1,120 @@
+package com.roncoo.pay.notify.entity;
+
+import com.alibaba.fastjson.JSONObject;
+import com.roncoo.pay.common.core.entity.BaseEntity;
+import com.roncoo.pay.notify.enums.NotifyStatusEnum;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @功能说明:   订单结果查询实体,主要用于MQ查询上游订单结果时,查询规则及查询结果
+ * @创建者: Peter
+ * @创建时间: 16/6/2  上午11:20
+ * @公司名称:广州市领课网络科技有限公司 龙果学院(www.roncoo.com)
+ * @版本:V1.0
+ */
+public class RpOrderResultQueryVo extends BaseEntity {
+
+    private static final long serialVersionUID = -6104194914044220447L;
+
+    private Date createTime;
+
+    /** 通知规则 */
+    private String notifyRule;
+
+    /** 最后一次通知时间 **/
+    private Date lastNotifyTime;
+
+    /** 通知次数 **/
+    private Integer notifyTimes;
+
+    /** 限制通知次数 **/
+    private Integer limitNotifyTimes;
+
+    /** 银行订单号 **/
+    private String bankOrderNo;
+
+    public RpOrderResultQueryVo() {
+        super();
+    }
+
+    public RpOrderResultQueryVo(Date createTime, String notifyRule, Date lastNotifyTime, Integer notifyTimes, Integer limitNotifyTimes,
+                                String bankOrderNo, NotifyStatusEnum status) {
+        super();
+        this.createTime = createTime;
+        this.notifyRule = notifyRule;
+        this.lastNotifyTime = lastNotifyTime;
+        this.notifyTimes = notifyTimes;
+        this.limitNotifyTimes = limitNotifyTimes;
+        this.bankOrderNo = bankOrderNo;
+        super.setStatus(status.name());
+    }
+
+
+
+    /** 通知规则 */
+    public String getNotifyRule() {
+        return notifyRule;
+    }
+
+    /** 通知规则 */
+    public void setNotifyRule(String notifyRule) {
+        this.notifyRule = notifyRule;
+    }
+
+    /**
+     * 获取通知规则的Map.
+     * @return
+     */
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    public Map getNotifyRuleMap(){
+        return (Map) JSONObject.parseObject(getNotifyRule());
+    }
+
+    /** 最后一次通知时间 **/
+    public Date getLastNotifyTime() {
+        return lastNotifyTime;
+    }
+
+    /** 最后一次通知时间 **/
+    public void setLastNotifyTime(Date lastNotifyTime) {
+        this.lastNotifyTime = lastNotifyTime;
+    }
+
+    /** 通知次数 **/
+    public Integer getNotifyTimes() {
+        return notifyTimes;
+    }
+
+    /** 通知次数 **/
+    public void setNotifyTimes(Integer notifyTimes) {
+        this.notifyTimes = notifyTimes;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /** 限制通知次数 **/
+    public Integer getLimitNotifyTimes() {
+        return limitNotifyTimes;
+    }
+
+    /** 限制通知次数 **/
+    public void setLimitNotifyTimes(Integer limitNotifyTimes) {
+        this.limitNotifyTimes = limitNotifyTimes;
+    }
+
+    public String getBankOrderNo() {
+        return bankOrderNo;
+    }
+
+    public void setBankOrderNo(String bankOrderNo) {
+        this.bankOrderNo = bankOrderNo;
+    }
+}
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/service/RpNotifyService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/service/RpNotifyService.java
index 7cc9f245158a16950fba90c850682bf59c224e2e..203618e6d0cb85d3fb83b7a36c1f93abf498c4f5 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/service/RpNotifyService.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/service/RpNotifyService.java
@@ -10,58 +10,77 @@ import java.util.Map;
 /**
  * @功能说明:
  * @创建者: Peter
- * @创建时间: 16/6/2  上午10:41
+ * @创建时间: 16/6/2 上午10:41
  * @公司名称:广州市领课网络科技有限公司 龙果学院(www.roncoo.com)
  * @版本:V1.0
  */
 
-
 public interface RpNotifyService {
 
-    /**
-     * 发送消息通知
-     * @param notifyUrl 通知地址
-     * @param merchantOrderNo   商户订单号
-     * @param merchantNo    商户编号
-     */
-    public void notifySend(String notifyUrl,String merchantOrderNo,String merchantNo);
+	/**
+	 * 发送消息通知
+	 * 
+	 * @param notifyUrl
+	 *            通知地址
+	 * @param merchantOrderNo
+	 *            商户订单号
+	 * @param merchantNo
+	 *            商户编号
+	 */
+	public void notifySend(String notifyUrl, String merchantOrderNo, String merchantNo);
 
+	/**
+	 * 订单通知
+	 * 
+	 * @param bankOrderNo
+	 *            订单编号
+	 */
+	void orderSend(String bankOrderNo);
 
-    /**
-     * 通过ID获取通知记录
-     * @param id
-     * @return
-     */
-    public RpNotifyRecord getNotifyRecordById(String id);
+	/**
+	 * 通过ID获取通知记录
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public RpNotifyRecord getNotifyRecordById(String id);
 
-    /**
-     * 根据商户编号,商户订单号,通知类型获取通知记录
-     * @param merchantNo    商户编号
-     * @param merchantOrderNo   商户订单号
-     * @param notifyType    消息类型
-     * @return
-     */
-    public RpNotifyRecord getNotifyByMerchantNoAndMerchantOrderNoAndNotifyType(String merchantNo , String merchantOrderNo , String notifyType);
+	/**
+	 * 根据商户编号,商户订单号,通知类型获取通知记录
+	 * 
+	 * @param merchantNo
+	 *            商户编号
+	 * @param merchantOrderNo
+	 *            商户订单号
+	 * @param notifyType
+	 *            消息类型
+	 * @return
+	 */
+	public RpNotifyRecord getNotifyByMerchantNoAndMerchantOrderNoAndNotifyType(String merchantNo,
+                                                                               String merchantOrderNo, String notifyType);
 
+	public PageBean queryNotifyRecordListPage(PageParam pageParam, Map paramMap);
 
-    public PageBean  queryNotifyRecordListPage(PageParam pageParam , Map paramMap);
-    /**
-     * 创建消息通知
-     * @param rpNotifyRecord
-     */
-    public long createNotifyRecord(RpNotifyRecord rpNotifyRecord);
+	/**
+	 * 创建消息通知
+	 * 
+	 * @param rpNotifyRecord
+	 */
+	public long createNotifyRecord(RpNotifyRecord rpNotifyRecord);
 
-    /**
-     * 修改消息通知
-     * @param rpNotifyRecord
-     */
-    public void updateNotifyRecord(RpNotifyRecord rpNotifyRecord);
+	/**
+	 * 修改消息通知
+	 * 
+	 * @param rpNotifyRecord
+	 */
+	public void updateNotifyRecord(RpNotifyRecord rpNotifyRecord);
 
-    /**
-     * 创建消息通知记录
-     * @param rpNotifyRecordLog
-     * @return
-     */
-    public long createNotifyRecordLog(RpNotifyRecordLog rpNotifyRecordLog);
+	/**
+	 * 创建消息通知记录
+	 * 
+	 * @param rpNotifyRecordLog
+	 * @return
+	 */
+	public long createNotifyRecordLog(RpNotifyRecordLog rpNotifyRecordLog);
 
 }
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/service/impl/RpNotifyServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/service/impl/RpNotifyServiceImpl.java
index b9ad5126ea14a50dc8d49910459667e7f060b0dd..911610e7bb05766ab06ee4592d5b4ccc2e5ae708 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/service/impl/RpNotifyServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/notify/service/impl/RpNotifyServiceImpl.java
@@ -1,6 +1,7 @@
 package com.roncoo.pay.notify.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.roncoo.pay.common.core.config.MqConfig;
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.notify.dao.RpNotifyRecordDao;
@@ -10,124 +11,152 @@ import com.roncoo.pay.notify.entity.RpNotifyRecordLog;
 import com.roncoo.pay.notify.enums.NotifyStatusEnum;
 import com.roncoo.pay.notify.enums.NotifyTypeEnum;
 import com.roncoo.pay.notify.service.RpNotifyService;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jms.core.JmsTemplate;
 import org.springframework.jms.core.MessageCreator;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import javax.jms.JMSException;
 import javax.jms.Message;
 import javax.jms.Session;
-
 import java.util.Map;
 
 /**
  * @功能说明:
  * @创建者: Peter
- * @创建时间: 16/6/2  上午10:42
+ * @创建时间: 16/6/2 上午10:42
  * @公司名称:广州市领课网络科技有限公司 龙果学院(www.roncoo.com)
  * @版本:V1.0
  */
 @Service("rpNotifyService")
 public class RpNotifyServiceImpl implements RpNotifyService {
 
-    @Autowired
-    private JmsTemplate notifyJmsTemplate;
-
-    @Autowired
-    private RpNotifyRecordDao rpNotifyRecordDao;
-
-    @Autowired
-    private RpNotifyRecordLogDao rpNotifyRecordLogDao;
-    /**
-     * 发送消息通知
-     *
-     * @param notifyUrl       通知地址
-     * @param merchantOrderNo 商户订单号
-     * @param merchantNo      商户编号
-     */
-    @Override
-    public void notifySend(String notifyUrl, String merchantOrderNo, String merchantNo) {
-
-        RpNotifyRecord record = new RpNotifyRecord();
-        record.setNotifyTimes(0);
-        record.setLimitNotifyTimes(5);
-        record.setStatus(NotifyStatusEnum.CREATED.name());
-        record.setUrl(notifyUrl);
-        record.setMerchantOrderNo(merchantOrderNo);
-        record.setMerchantNo(merchantNo);
-        record.setNotifyType(NotifyTypeEnum.MERCHANT.name());
-
-        Object toJSON = JSONObject.toJSON(record);
-        final String str = toJSON.toString();
-
-        notifyJmsTemplate.send(new MessageCreator() {
-            public Message createMessage(Session session) throws JMSException {
-                return session.createTextMessage(str);
-            }
-        });
-    }
-
-    /**
-     * 通过ID获取通知记录
-     *
-     * @param id
-     * @return
-     */
-    @Override
-    public RpNotifyRecord getNotifyRecordById(String id) {
-        return rpNotifyRecordDao.getById(id);
-    }
-
-    /**
-     * 根据商户编号,商户订单号,通知类型获取通知记录
-     *
-     * @param merchantNo      商户编号
-     * @param merchantOrderNo 商户订单号
-     * @param notifyType      消息类型
-     * @return
-     */
-    @Override
-    public RpNotifyRecord getNotifyByMerchantNoAndMerchantOrderNoAndNotifyType(String merchantNo, String merchantOrderNo, String notifyType) {
-        return rpNotifyRecordDao.getNotifyByMerchantNoAndMerchantOrderNoAndNotifyType(merchantNo,merchantOrderNo,notifyType);
-    }
-
-    @Override
-    public PageBean queryNotifyRecordListPage(PageParam pageParam, Map paramMap) {
-        return rpNotifyRecordDao.listPage(pageParam,paramMap);
-    }
-
-    /**
-     * 创建消息通知
-     *
-     * @param rpNotifyRecord
-     */
-    @Override
-    public long createNotifyRecord(RpNotifyRecord rpNotifyRecord) {
-        return rpNotifyRecordDao.insert(rpNotifyRecord);
-    }
-
-    /**
-     * 修改消息通知
-     *
-     * @param rpNotifyRecord
-     */
-    @Override
-    public void updateNotifyRecord(RpNotifyRecord rpNotifyRecord) {
-        rpNotifyRecordDao.update(rpNotifyRecord);
-    }
-
-    /**
-     * 创建消息通知记录
-     *
-     * @param rpNotifyRecordLog
-     * @return
-     */
-    @Override
-    public long createNotifyRecordLog(RpNotifyRecordLog rpNotifyRecordLog) {
-        return rpNotifyRecordLogDao.insert(rpNotifyRecordLog);
-    }
-
+	@Autowired
+	private JmsTemplate notifyJmsTemplate;
+
+	@Autowired
+	private RpNotifyRecordDao rpNotifyRecordDao;
+
+	@Autowired
+	private RpNotifyRecordLogDao rpNotifyRecordLogDao;
+
+	@Resource(name = "jmsTemplate")
+	private JmsTemplate jmsTemplate;
+
+	/**
+	 * 发送消息通知
+	 *
+	 * @param notifyUrl
+	 *            通知地址
+	 * @param merchantOrderNo
+	 *            商户订单号
+	 * @param merchantNo
+	 *            商户编号
+	 */
+	@Override
+	public void notifySend(String notifyUrl, String merchantOrderNo, String merchantNo) {
+
+		RpNotifyRecord record = new RpNotifyRecord();
+		record.setNotifyTimes(0);
+		record.setLimitNotifyTimes(5);
+		record.setStatus(NotifyStatusEnum.CREATED.name());
+		record.setUrl(notifyUrl);
+		record.setMerchantOrderNo(merchantOrderNo);
+		record.setMerchantNo(merchantNo);
+		record.setNotifyType(NotifyTypeEnum.MERCHANT.name());
+
+		Object toJSON = JSONObject.toJSON(record);
+		final String str = toJSON.toString();
+		
+		notifyJmsTemplate.setDefaultDestinationName(MqConfig.MERCHANT_NOTIFY_QUEUE);
+		notifyJmsTemplate.send(new MessageCreator() {
+			public Message createMessage(Session session) throws JMSException {
+				return session.createTextMessage(str);
+			}
+		});
+	}
+
+	/**
+	 * 订单通知
+	 * 
+	 * @param merchantOrderNo
+	 */
+	@Override
+	public void orderSend(String bankOrderNo) {
+		final String orderNo = bankOrderNo;
+		
+		jmsTemplate.setDefaultDestinationName(MqConfig.ORDER_NOTIFY_QUEUE);
+		jmsTemplate.send(new MessageCreator() {
+			public Message createMessage(Session session) throws JMSException {
+				return session.createTextMessage(orderNo);
+			}
+		});
+	}
+
+	/**
+	 * 通过ID获取通知记录
+	 *
+	 * @param id
+	 * @return
+	 */
+	@Override
+	public RpNotifyRecord getNotifyRecordById(String id) {
+		return rpNotifyRecordDao.getById(id);
+	}
+
+	/**
+	 * 根据商户编号,商户订单号,通知类型获取通知记录
+	 *
+	 * @param merchantNo
+	 *            商户编号
+	 * @param merchantOrderNo
+	 *            商户订单号
+	 * @param notifyType
+	 *            消息类型
+	 * @return
+	 */
+	@Override
+	public RpNotifyRecord getNotifyByMerchantNoAndMerchantOrderNoAndNotifyType(String merchantNo,
+                                                                               String merchantOrderNo, String notifyType) {
+		return rpNotifyRecordDao.getNotifyByMerchantNoAndMerchantOrderNoAndNotifyType(merchantNo, merchantOrderNo,
+				notifyType);
+	}
+
+	@Override
+	public PageBean queryNotifyRecordListPage(PageParam pageParam, Map paramMap) {
+		return rpNotifyRecordDao.listPage(pageParam, paramMap);
+	}
+
+	/**
+	 * 创建消息通知
+	 *
+	 * @param rpNotifyRecord
+	 */
+	@Override
+	public long createNotifyRecord(RpNotifyRecord rpNotifyRecord) {
+		return rpNotifyRecordDao.insert(rpNotifyRecord);
+	}
+
+	/**
+	 * 修改消息通知
+	 *
+	 * @param rpNotifyRecord
+	 */
+	@Override
+	public void updateNotifyRecord(RpNotifyRecord rpNotifyRecord) {
+		rpNotifyRecordDao.update(rpNotifyRecord);
+	}
+
+	/**
+	 * 创建消息通知记录
+	 *
+	 * @param rpNotifyRecordLog
+	 * @return
+	 */
+	@Override
+	public long createNotifyRecordLog(RpNotifyRecordLog rpNotifyRecordLog) {
+		return rpNotifyRecordLogDao.insert(rpNotifyRecordLog);
+	}
 
 }
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PermissionBaseDao.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PermissionBaseDao.java
index dd1210855f91645d0c98b1ef6e30558e53428078..5b70de86e6e74f29acd6b226ac7e3be3d57225e7 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PermissionBaseDao.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PermissionBaseDao.java
@@ -15,14 +15,12 @@
  */
 package com.roncoo.pay.permission.dao;
 
-import java.util.List;
-import java.util.Map;
-
-import org.apache.ibatis.session.SqlSession;
-import org.mybatis.spring.SqlSessionTemplate;
-
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
+import org.mybatis.spring.SqlSessionTemplate;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * 权限点数据访问层基础支撑接口
@@ -175,9 +173,7 @@ public interface PermissionBaseDao {
 	 * @return:PageBean
 	 * @throws
 	 */
-	public PageBean listPage(PageParam pageParam, Map paramMap);
-
-	public SqlSessionTemplate getSessionTemplate();
+	PageBean listPage(PageParam pageParam, Map paramMap);
 
-	public SqlSession getSqlSession();
+	SqlSessionTemplate getSessionTemplate();
 }
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsMenuDao.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsMenuDao.java
index e7293a234a0475ae77d6cb61b53de93f771ccc6a..6d7812cb5dff030b7a06e0c586807e16b8985d7a 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsMenuDao.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsMenuDao.java
@@ -15,11 +15,11 @@
  */
 package com.roncoo.pay.permission.dao;
 
+import com.roncoo.pay.permission.entity.PmsMenu;
+
 import java.util.List;
 import java.util.Map;
 
-import com.roncoo.pay.permission.entity.PmsMenu;
-
 /**
  * 权限菜单
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsMenuRoleDao.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsMenuRoleDao.java
index 0f3dfa9eb48f85681b344f1b6fe5130b82517acd..9adf1e72a7de57512cf4e8baaee71a6a2ee6d5e0 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsMenuRoleDao.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsMenuRoleDao.java
@@ -15,10 +15,10 @@
  */
 package com.roncoo.pay.permission.dao;
 
-import java.util.List;
-
 import com.roncoo.pay.permission.entity.PmsMenuRole;
 
+import java.util.List;
+
 /**
  * 菜单角色关联表
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsOperatorDao.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsOperatorDao.java
index 633bbdf560472f39427c37a980a0e432f8fedfd9..90745e2de4ad4a99ed2814187805e64a773e6d4a 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsOperatorDao.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsOperatorDao.java
@@ -15,10 +15,10 @@
  */
 package com.roncoo.pay.permission.dao;
 
-import java.util.List;
-
 import com.roncoo.pay.permission.entity.PmsOperator;
 
+import java.util.List;
+
 /**
  * 操作员dao
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsOperatorRoleDao.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsOperatorRoleDao.java
index eaf372196994766bf14f77a56e77c20291630deb..09a2c24cf5f33153cb6f124eb3c072b19547673c 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsOperatorRoleDao.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsOperatorRoleDao.java
@@ -15,10 +15,10 @@
  */
 package com.roncoo.pay.permission.dao;
 
-import java.util.List;
-
 import com.roncoo.pay.permission.entity.PmsOperatorRole;
 
+import java.util.List;
+
 /**
  * 操作员与角色dao
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsPermissionDao.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsPermissionDao.java
index 97417ff92c04a4e22390f71cdd1293669a6401b0..7ea584840a715e4222fcac478b3b63d75ff4cac5 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsPermissionDao.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsPermissionDao.java
@@ -15,10 +15,10 @@
  */
 package com.roncoo.pay.permission.dao;
 
-import java.util.List;
-
 import com.roncoo.pay.permission.entity.PmsPermission;
 
+import java.util.List;
+
 /**
  * 权限点dao
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsRoleDao.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsRoleDao.java
index a581224b5215d3661300e9ba06dce0a1d75e0787..f947c75126bbf9318b3c293fa274efdc68358ae5 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsRoleDao.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsRoleDao.java
@@ -15,10 +15,10 @@
  */
 package com.roncoo.pay.permission.dao;
 
-import java.util.List;
-
 import com.roncoo.pay.permission.entity.PmsRole;
 
+import java.util.List;
+
 /**
  * 权限角色dao
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsRolePermissionDao.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsRolePermissionDao.java
index 9fea7da3f9d68413090d7cc6d5516c7caa0df78c..8cac9a1e240652635f061f04ba3c250bc42b3c0d 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsRolePermissionDao.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/PmsRolePermissionDao.java
@@ -15,10 +15,10 @@
  */
 package com.roncoo.pay.permission.dao;
 
-import java.util.List;
-
 import com.roncoo.pay.permission.entity.PmsRolePermission;
 
+import java.util.List;
+
 /**
  * 角色权限dao
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PermissionBaseDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PermissionBaseDaoImpl.java
index eae5200422f387756e6ae3de86ff7d7bed9681ea..b3fdea6a90a9c9b40c6ba6ff43c630da9d25df65 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PermissionBaseDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PermissionBaseDaoImpl.java
@@ -15,23 +15,20 @@
  */
 package com.roncoo.pay.permission.dao.impl;
 
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.ibatis.session.SqlSession;
-import org.mybatis.spring.SqlSessionTemplate;
-import org.mybatis.spring.support.SqlSessionDaoSupport;
-import org.springframework.beans.factory.annotation.Autowired;
-
 import com.roncoo.pay.common.core.exception.BizException;
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.permission.dao.PermissionBaseDao;
 import com.roncoo.pay.permission.entity.PermissionBaseEntity;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 数据访问层基础支撑类.
@@ -40,7 +37,7 @@ import com.roncoo.pay.permission.entity.PermissionBaseEntity;
  * 
  * @author:shenjialong
  */
-public abstract class PermissionBaseDaoImpl extends SqlSessionDaoSupport implements PermissionBaseDao {
+public abstract class PermissionBaseDaoImpl implements PermissionBaseDao {
 
 	protected static final Log LOG = LogFactory.getLog(PermissionBaseDaoImpl.class);
 
@@ -75,10 +72,6 @@ public abstract class PermissionBaseDaoImpl exte
 		this.sessionTemplate = sessionTemplate;
 	}
 
-	public SqlSession getSqlSession() {
-		return super.getSqlSession();
-	}
-
 	/**
 	 * 单条插入数据.
 	 */
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsMenuDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsMenuDaoImpl.java
index f956e01e61036286388b873956724e7f24347dda..373da68df71ebd72cbc40835a80aac6034755649 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsMenuDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsMenuDaoImpl.java
@@ -15,15 +15,14 @@
  */
 package com.roncoo.pay.permission.dao.impl;
 
+import com.roncoo.pay.permission.dao.PmsMenuDao;
+import com.roncoo.pay.permission.entity.PmsMenu;
+import org.springframework.stereotype.Repository;
+
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
-import org.springframework.stereotype.Repository;
-
-import com.roncoo.pay.permission.dao.PmsMenuDao;
-import com.roncoo.pay.permission.entity.PmsMenu;
-
 /**
  * 权限菜单
  *
@@ -38,7 +37,7 @@ public class PmsMenuDaoImpl extends PermissionBaseDaoImpl implements Pm
 	@Override
 	public List listByRoleIds(String roleIdsStr) {
 		List roldIds = Arrays.asList(roleIdsStr.split(","));
-		return super.getSqlSession().selectList(getStatement("listByRoleIds"), roldIds);
+		return super.getSessionTemplate().selectList(getStatement("listByRoleIds"), roldIds);
 	}
 
 	/**
@@ -51,7 +50,7 @@ public class PmsMenuDaoImpl extends PermissionBaseDaoImpl implements Pm
 	@SuppressWarnings("rawtypes")
 	@Override
 	public List listByParent(Long parentId) {
-		return super.getSqlSession().selectList(getStatement("listByParent"), parentId);
+		return super.getSessionTemplate().selectList(getStatement("listByParent"), parentId);
 	}
 
 	/**
@@ -63,7 +62,7 @@ public class PmsMenuDaoImpl extends PermissionBaseDaoImpl implements Pm
 	 */
 	@Override
 	public List listByParentId(Long parentId) {
-		return super.getSqlSession().selectList(getStatement("listByParentId"), parentId);
+		return super.getSessionTemplate().selectList(getStatement("listByParentId"), parentId);
 	}
 
 	/***
@@ -76,7 +75,7 @@ public class PmsMenuDaoImpl extends PermissionBaseDaoImpl implements Pm
 	 * @return
 	 */
 	public List getMenuByNameAndIsLeaf(Map map) {
-		return super.getSqlSession().selectList(getStatement("listBy"), map);
+		return super.getSessionTemplate().selectList(getStatement("listBy"), map);
 	}
 
 }
\ No newline at end of file
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsMenuRoleDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsMenuRoleDaoImpl.java
index ad88f70b079d74b8dca40e166a56fe4717a91b5a..85fbc59669b602728b5e96e213d5abfc1ac6c3b8 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsMenuRoleDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsMenuRoleDaoImpl.java
@@ -15,12 +15,11 @@
  */
 package com.roncoo.pay.permission.dao.impl;
 
-import java.util.List;
-
-import org.springframework.stereotype.Repository;
-
 import com.roncoo.pay.permission.dao.PmsMenuRoleDao;
 import com.roncoo.pay.permission.entity.PmsMenuRole;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
 
 /**
  * 菜单角色
@@ -34,7 +33,7 @@ public class PmsMenuRoleDaoImpl extends PermissionBaseDaoImpl imple
 
 	@Override
 	public void deleteByRoleId(Long roleId) {
-		super.getSqlSession().delete(getStatement("deleteByRoleId"), roleId);
+		super.getSessionTemplate().delete(getStatement("deleteByRoleId"), roleId);
 	}
 
 	/**
@@ -46,6 +45,6 @@ public class PmsMenuRoleDaoImpl extends PermissionBaseDaoImpl imple
 	 */
 	@Override
 	public List listByRoleId(Long roleId) {
-		return super.getSqlSession().selectList(getStatement("listByRoleId"), roleId);
+		return super.getSessionTemplate().selectList(getStatement("listByRoleId"), roleId);
 	}
 }
\ No newline at end of file
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsOperatorDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsOperatorDaoImpl.java
index bbb1ecb343674e202c8433adefdffd3c2d477340..ac98722521e57ebebcbdf841a1ff50e99eab560c 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsOperatorDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsOperatorDaoImpl.java
@@ -15,12 +15,11 @@
  */
 package com.roncoo.pay.permission.dao.impl;
 
-import java.util.List;
-
-import org.springframework.stereotype.Repository;
-
 import com.roncoo.pay.permission.dao.PmsOperatorDao;
 import com.roncoo.pay.permission.entity.PmsOperator;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
 
 /**
  * 权限操作员dao实现
@@ -41,12 +40,12 @@ public class PmsOperatorDaoImpl extends PermissionBaseDaoImpl imple
 	 */
 
 	public PmsOperator findByLoginName(String loginName) {
-		return super.getSqlSession().selectOne(getStatement("findByLoginName"), loginName);
+		return super.getSessionTemplate().selectOne(getStatement("findByLoginName"), loginName);
 	}
 
 	@Override
 	public List listByRoleId(Long roleId) {
-		return super.getSqlSession().selectList(getStatement("listByRoleId"), roleId);
+		return super.getSessionTemplate().selectList(getStatement("listByRoleId"), roleId);
 	}
 
 }
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsOperatorLogDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsOperatorLogDaoImpl.java
index 35ce2460e002772f1b13463c67ad60548465c4b2..a4617767e7b3a72f0fbfd8a1543c15c62627cb4a 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsOperatorLogDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsOperatorLogDaoImpl.java
@@ -15,10 +15,9 @@
  */
 package com.roncoo.pay.permission.dao.impl;
 
-import org.springframework.stereotype.Repository;
-
 import com.roncoo.pay.permission.dao.PmsOperatorLogDao;
 import com.roncoo.pay.permission.entity.PmsOperatorLog;
+import org.springframework.stereotype.Repository;
 
 /**
  * 权限操作员dao实现
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsOperatorRoleDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsOperatorRoleDaoImpl.java
index b2cfe7d60823593b510ee1598cf256fa4833f310..aa6318915d8d48705a44ba12d28d280c600af6bf 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsOperatorRoleDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsOperatorRoleDaoImpl.java
@@ -15,15 +15,14 @@
  */
 package com.roncoo.pay.permission.dao.impl;
 
+import com.roncoo.pay.permission.dao.PmsOperatorRoleDao;
+import com.roncoo.pay.permission.entity.PmsOperatorRole;
+import org.springframework.stereotype.Repository;
+
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.springframework.stereotype.Repository;
-
-import com.roncoo.pay.permission.dao.PmsOperatorRoleDao;
-import com.roncoo.pay.permission.entity.PmsOperatorRole;
-
 /**
  * 权限-操作员与角色dao实现
  *
@@ -42,7 +41,7 @@ public class PmsOperatorRoleDaoImpl extends PermissionBaseDaoImpl listByOperatorId(Long operatorId) {
-		return super.getSqlSession().selectList(getStatement("listByOperatorId"), operatorId);
+		return super.getSessionTemplate().selectList(getStatement("listByOperatorId"), operatorId);
 	}
 
 	/**
@@ -52,7 +51,7 @@ public class PmsOperatorRoleDaoImpl extends PermissionBaseDaoImpl listByRoleId(Long roleId) {
-		return super.getSqlSession().selectList(getStatement("listByRoleId"), roleId);
+		return super.getSessionTemplate().selectList(getStatement("listByRoleId"), roleId);
 	}
 
 	/**
@@ -63,7 +62,7 @@ public class PmsOperatorRoleDaoImpl extends PermissionBaseDaoImpl paramMap = new HashMap();
 		paramMap.put("roleId", roleId);
 		paramMap.put("operatorId", operatorId);
-		super.getSqlSession().delete(getStatement("deleteByRoleIdAndOperatorId"), paramMap);
+		super.getSessionTemplate().delete(getStatement("deleteByRoleIdAndOperatorId"), paramMap);
 	}
 
 }
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsPermissionDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsPermissionDaoImpl.java
index 0cf6a52b8d2079fd38d1cb33016ca8079dca9e22..85de92749903fa75bc16448ab44db55f73455e19 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsPermissionDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsPermissionDaoImpl.java
@@ -15,16 +15,15 @@
  */
 package com.roncoo.pay.permission.dao.impl;
 
+import com.roncoo.pay.permission.dao.PmsPermissionDao;
+import com.roncoo.pay.permission.entity.PmsPermission;
+import org.springframework.stereotype.Repository;
+
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.springframework.stereotype.Repository;
-
-import com.roncoo.pay.permission.dao.PmsPermissionDao;
-import com.roncoo.pay.permission.entity.PmsPermission;
-
 /**
  * 权限功能点dao实现
  *
@@ -43,7 +42,7 @@ public class PmsPermissionDaoImpl extends PermissionBaseDaoImpl i
 	 */
 	public List findByIds(String idStr) {
 		List ids = Arrays.asList(idStr.split(","));
-		return this.getSqlSession().selectList(getStatement("findByIds"), ids);
+		return this.getSessionTemplate().selectList(getStatement("findByIds"), ids);
 	}
 
 	/**
@@ -53,7 +52,7 @@ public class PmsPermissionDaoImpl extends PermissionBaseDaoImpl i
 	 * @return
 	 */
 	public PmsPermission getByPermissionName(String permissionName) {
-		return this.getSqlSession().selectOne(getStatement("getByPermissionName"), permissionName);
+		return this.getSessionTemplate().selectOne(getStatement("getByPermissionName"), permissionName);
 
 	}
 
@@ -64,7 +63,7 @@ public class PmsPermissionDaoImpl extends PermissionBaseDaoImpl i
 	 * @return
 	 */
 	public PmsPermission getByPermission(String permission) {
-		return this.getSqlSession().selectOne(getStatement("getByPermission"), permission);
+		return this.getSessionTemplate().selectOne(getStatement("getByPermission"), permission);
 	}
 
 	/**
@@ -78,7 +77,7 @@ public class PmsPermissionDaoImpl extends PermissionBaseDaoImpl i
 		Map paramMap = new HashMap();
 		paramMap.put("permissionName", permissionName);
 		paramMap.put("id", id);
-		return this.getSqlSession().selectOne(getStatement("getByPermissionNameNotEqId"), paramMap);
+		return this.getSessionTemplate().selectOne(getStatement("getByPermissionNameNotEqId"), paramMap);
 	}
 
 	/**
@@ -90,6 +89,6 @@ public class PmsPermissionDaoImpl extends PermissionBaseDaoImpl i
 	public List listAllByMenuId(Long menuId) {
 		Map param = new HashMap();
 		param.put("menuId", menuId);
-		return this.getSqlSession().selectList(getStatement("listAllByMenuId"), param);
+		return this.getSessionTemplate().selectList(getStatement("listAllByMenuId"), param);
 	}
 }
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsRoleDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsRoleDaoImpl.java
index 318c726f6865d8e48ec0558275fc4198d9a7872d..6f5abef7a3d22975e22108c364729bbd27a12591 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsRoleDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsRoleDaoImpl.java
@@ -15,15 +15,14 @@
  */
 package com.roncoo.pay.permission.dao.impl;
 
+import com.roncoo.pay.permission.dao.PmsRoleDao;
+import com.roncoo.pay.permission.entity.PmsRole;
+import org.springframework.stereotype.Repository;
+
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.springframework.stereotype.Repository;
-
-import com.roncoo.pay.permission.dao.PmsRoleDao;
-import com.roncoo.pay.permission.entity.PmsRole;
-
 /**
  * 权限角色dao实现
  *
@@ -40,7 +39,7 @@ public class PmsRoleDaoImpl extends PermissionBaseDaoImpl implements Pm
 	 * @return roleList .
 	 */
 	public List listAll() {
-		return super.getSqlSession().selectList(getStatement("listAll"));
+		return super.getSessionTemplate().selectList(getStatement("listAll"));
 	}
 
 	/**
@@ -50,7 +49,7 @@ public class PmsRoleDaoImpl extends PermissionBaseDaoImpl implements Pm
 	 * @return
 	 */
 	public List listByPermissionId(Long permissionId) {
-		return super.getSqlSession().selectList(getStatement("listByPermissionId"), permissionId);
+		return super.getSessionTemplate().selectList(getStatement("listByPermissionId"), permissionId);
 	}
 
 	/**
@@ -64,6 +63,6 @@ public class PmsRoleDaoImpl extends PermissionBaseDaoImpl implements Pm
 		Map paramMap = new HashMap();
 		paramMap.put("roleName", roleName);
 		paramMap.put("roleCode", roleCode);
-		return super.getSqlSession().selectOne(getStatement("getByRoleNameOrRoleCode"), paramMap);
+		return super.getSessionTemplate().selectOne(getStatement("getByRoleNameOrRoleCode"), paramMap);
 	}
 }
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsRolePermissionDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsRolePermissionDaoImpl.java
index 91c7c2603b87c36807d5065f0377dd4e4ad5bfae..42d9ef84f6bc6e9f9c3610bf611b1f4ddac33db8 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsRolePermissionDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/dao/impl/PmsRolePermissionDaoImpl.java
@@ -15,16 +15,15 @@
  */
 package com.roncoo.pay.permission.dao.impl;
 
+import com.roncoo.pay.permission.dao.PmsRolePermissionDao;
+import com.roncoo.pay.permission.entity.PmsRolePermission;
+import org.springframework.stereotype.Repository;
+
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.springframework.stereotype.Repository;
-
-import com.roncoo.pay.permission.dao.PmsRolePermissionDao;
-import com.roncoo.pay.permission.entity.PmsRolePermission;
-
 /**
  * 权限-角色与权限点dao实现
  *
@@ -43,7 +42,7 @@ public class PmsRolePermissionDaoImpl extends PermissionBaseDaoImpl listByRoleId(final long roleId) {
-		return super.getSqlSession().selectList(getStatement("listByRoleId"), roleId);
+		return super.getSessionTemplate().selectList(getStatement("listByRoleId"), roleId);
 	}
 
 	/**
@@ -54,17 +53,17 @@ public class PmsRolePermissionDaoImpl extends PermissionBaseDaoImpl listByRoleIds(String roleIdsStr) {
 		List roldIds = Arrays.asList(roleIdsStr.split(","));
-		return super.getSqlSession().selectList(getStatement("listByRoleIds"), roldIds);
+		return super.getSessionTemplate().selectList(getStatement("listByRoleIds"), roldIds);
 	}
 	
 	public void deleteByRoleIdAndPermissionId(Long roleId, Long permissionId){
 		Map paramMap = new HashMap();
 		paramMap.put("roleId", roleId);
 		paramMap.put("permissionId", permissionId);
-		super.getSqlSession().delete(getStatement("deleteByRoleIdAndPermissionId"), paramMap);
+		super.getSessionTemplate().delete(getStatement("deleteByRoleIdAndPermissionId"), paramMap);
 	}
 	
 	public void deleteByRoleId(Long roleId){
-		super.getSqlSession().delete(getStatement("deleteByRoleId"), roleId);
+		super.getSessionTemplate().delete(getStatement("deleteByRoleId"), roleId);
 	}
 }
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/exception/PermissionException.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/exception/PermissionException.java
index 0437c69080136816e47ec0eebeadbd31bc297a1b..fb9267c6fcd927f9d89cb7ac107e448597364330 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/exception/PermissionException.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/exception/PermissionException.java
@@ -1,11 +1,9 @@
 package com.roncoo.pay.permission.exception;
 
+import com.roncoo.pay.common.core.exception.BizException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.roncoo.pay.account.exception.AccountBizException;
-import com.roncoo.pay.common.core.exception.BizException;
-
 /**
  * 管理系统权限模块异常.
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsMenuService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsMenuService.java
index 49d6e197c36eaafec08c9fc4ca817cb3a8fa5157..8475a20e4f276b3066d45c64b4cc55bbd22b7fe8 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsMenuService.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsMenuService.java
@@ -15,11 +15,11 @@
  */
 package com.roncoo.pay.permission.service;
 
+import com.roncoo.pay.permission.entity.PmsMenu;
+
 import java.util.List;
 import java.util.Map;
 
-import com.roncoo.pay.permission.entity.PmsMenu;
-
 /**
  * 菜单service接口
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsOperatorRoleService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsOperatorRoleService.java
index 96854df44b13e5790b181455e79c8efeed6eeaa6..fc3a6310c4d7963d1938fc837661055f7e73c75d 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsOperatorRoleService.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsOperatorRoleService.java
@@ -15,12 +15,12 @@
  */
 package com.roncoo.pay.permission.service;
 
-import java.util.List;
-import java.util.Set;
-
 import com.roncoo.pay.permission.entity.PmsOperator;
 import com.roncoo.pay.permission.entity.PmsOperatorRole;
 
+import java.util.List;
+import java.util.Set;
+
 /**
  * 操作员角色service接口
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsOperatorService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsOperatorService.java
index 659bb9daad73451aaf585aeca214fbf7bc13f641..6c507c7004a53d70156d37d61a43df922502afdc 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsOperatorService.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsOperatorService.java
@@ -15,12 +15,9 @@
  */
 package com.roncoo.pay.permission.service;
 
-import java.util.List;
-
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.permission.entity.PmsOperator;
-import com.roncoo.pay.permission.entity.PmsOperatorRole;
 
 /**
  * 操作员service接口
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsPermissionService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsPermissionService.java
index 62236c5030abbe774bab8e73434ff6466e727a71..b3478764826835c64f1b8b0a319cda20e6621c6b 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsPermissionService.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsPermissionService.java
@@ -15,12 +15,12 @@
  */
 package com.roncoo.pay.permission.service;
 
-import java.util.List;
-
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.permission.entity.PmsPermission;
 
+import java.util.List;
+
 /**
  * 权限service接口
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsRolePermissionService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsRolePermissionService.java
index 76fd48ce3b3d9feda64f063090aca921d9a1eb6b..6196d98c091092e9827e563119eaa4b5928ea5e9 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsRolePermissionService.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsRolePermissionService.java
@@ -15,12 +15,12 @@
  */
 package com.roncoo.pay.permission.service;
 
-import java.util.Set;
-
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.permission.entity.PmsRolePermission;
 
+import java.util.Set;
+
 /**
  * 角色权限service接口
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsRoleService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsRoleService.java
index 4127ff69a4f5f28d579a27eb328485063d85840b..a67d2ce3999f730ee3621461e79d078bc00d120b 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsRoleService.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/PmsRoleService.java
@@ -15,12 +15,12 @@
  */
 package com.roncoo.pay.permission.service;
 
-import java.util.List;
-
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.permission.entity.PmsRole;
 
+import java.util.List;
+
 /**
  * 角色service接口
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsMenuRoleServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsMenuRoleServiceImpl.java
index f78f3fa1b7d4006acf589ac4d09f113f62a70f81..281c3379efbb1daa82b5ee8c1a7c1abf2b4e82fc 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsMenuRoleServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsMenuRoleServiceImpl.java
@@ -15,16 +15,15 @@
  */
 package com.roncoo.pay.permission.service.impl;
 
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import com.alibaba.druid.util.StringUtils;
 import com.roncoo.pay.permission.dao.PmsMenuRoleDao;
 import com.roncoo.pay.permission.entity.PmsMenuRole;
 import com.roncoo.pay.permission.service.PmsMenuRoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
 
 /**
  * 菜单角色service接口实现
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsMenuServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsMenuServiceImpl.java
index 4329f463c79fd35de34c05ddbfbc83a55c3c2ba4..59a3008fc3a53c6a9d3565a3283ead932c028085 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsMenuServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsMenuServiceImpl.java
@@ -15,17 +15,16 @@
  */
 package com.roncoo.pay.permission.service.impl;
 
-import java.util.List;
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import com.roncoo.pay.permission.dao.PmsMenuDao;
 import com.roncoo.pay.permission.dao.PmsMenuRoleDao;
 import com.roncoo.pay.permission.entity.PmsMenu;
 import com.roncoo.pay.permission.entity.PmsMenuRole;
 import com.roncoo.pay.permission.service.PmsMenuService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * 菜单service接口实现
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsOperatorLogServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsOperatorLogServiceImpl.java
index afd64fa113487c15a5384068ea91487ecad8f309..3d57e637c9d3a2fcb2bacebd587227e0001c475a 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsOperatorLogServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsOperatorLogServiceImpl.java
@@ -15,17 +15,16 @@
  */
 package com.roncoo.pay.permission.service.impl;
 
-import java.util.HashMap;
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.permission.dao.PmsOperatorLogDao;
 import com.roncoo.pay.permission.entity.PmsOperatorLog;
 import com.roncoo.pay.permission.service.PmsOperatorLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * 操作员service接口实现
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsOperatorRoleServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsOperatorRoleServiceImpl.java
index a16d78b20efc0cd8d4cf0ec7b09ff8fc711fcb63..9499da35916920150e9d88b40df0b1282d7f3633 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsOperatorRoleServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsOperatorRoleServiceImpl.java
@@ -15,17 +15,6 @@
  */
 package com.roncoo.pay.permission.service.impl;
 
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import com.roncoo.pay.permission.dao.PmsOperatorDao;
 import com.roncoo.pay.permission.dao.PmsOperatorRoleDao;
 import com.roncoo.pay.permission.dao.PmsRoleDao;
@@ -33,6 +22,11 @@ import com.roncoo.pay.permission.entity.PmsOperator;
 import com.roncoo.pay.permission.entity.PmsOperatorRole;
 import com.roncoo.pay.permission.entity.PmsRole;
 import com.roncoo.pay.permission.service.PmsOperatorRoleService;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
 
 /**
  * 操作员角色service接口实现
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsOperatorServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsOperatorServiceImpl.java
index 853bf9f30559f011389e297db02f9a0a04db1ec8..afe591c2761b6221d5e2d288871fda2cd6203259 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsOperatorServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsOperatorServiceImpl.java
@@ -15,17 +15,6 @@
  */
 package com.roncoo.pay.permission.service.impl;
 
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import com.roncoo.pay.common.core.enums.PublicStatusEnum;
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
@@ -34,6 +23,12 @@ import com.roncoo.pay.permission.dao.PmsOperatorRoleDao;
 import com.roncoo.pay.permission.entity.PmsOperator;
 import com.roncoo.pay.permission.entity.PmsOperatorRole;
 import com.roncoo.pay.permission.service.PmsOperatorService;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
 
 /**
  * 操作员service接口实现
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsPermissionServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsPermissionServiceImpl.java
index 0abb3e1ae3027cfd313766d4de9538bb22a8e17d..98401c1daffc46b0f8ddb72e85abe64bc6c445b6 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsPermissionServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsPermissionServiceImpl.java
@@ -15,13 +15,6 @@
  */
 package com.roncoo.pay.permission.service.impl;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.permission.dao.PmsPermissionDao;
@@ -29,6 +22,12 @@ import com.roncoo.pay.permission.dao.PmsRolePermissionDao;
 import com.roncoo.pay.permission.entity.PmsPermission;
 import com.roncoo.pay.permission.entity.PmsRolePermission;
 import com.roncoo.pay.permission.service.PmsPermissionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 权限service接口实现
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsRolePermissionServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsRolePermissionServiceImpl.java
index d9be74f104db11d09d5ac30db7b481322d389c3a..67805e294619fd5b40bca90a01d291e9998b8458 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsRolePermissionServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsRolePermissionServiceImpl.java
@@ -15,17 +15,6 @@
  */
 package com.roncoo.pay.permission.service.impl;
 
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import com.alibaba.druid.util.StringUtils;
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
@@ -35,6 +24,11 @@ import com.roncoo.pay.permission.entity.PmsPermission;
 import com.roncoo.pay.permission.entity.PmsRolePermission;
 import com.roncoo.pay.permission.service.PmsOperatorRoleService;
 import com.roncoo.pay.permission.service.PmsRolePermissionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
 
 /**
  * 角色权限service接口实现
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsRoleServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsRoleServiceImpl.java
index 530c4f359fb9c6be8970f82a762557d30c3c8bf3..08925834a16dc3b64010dba4234eb327f99ca8df 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsRoleServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/permission/service/impl/PmsRoleServiceImpl.java
@@ -15,18 +15,17 @@
  */
 package com.roncoo.pay.permission.service.impl;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.permission.dao.PmsRoleDao;
 import com.roncoo.pay.permission.entity.PmsRole;
 import com.roncoo.pay.permission.service.PmsRoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 角色service接口实现
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/dao/impl/RpAccountCheckBatchDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/dao/impl/RpAccountCheckBatchDaoImpl.java
index 50d7427a1ec25494f982db30f182fdcaa6b6e46f..b54c94b3b54a82ff4cf24017c418664de0550dcf 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/dao/impl/RpAccountCheckBatchDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/dao/impl/RpAccountCheckBatchDaoImpl.java
@@ -18,7 +18,6 @@ package com.roncoo.pay.reconciliation.dao.impl;
 import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl;
 import com.roncoo.pay.reconciliation.dao.RpAccountCheckBatchDao;
 import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch;
-
 import org.springframework.stereotype.Repository;
 
 /**
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/dao/impl/RpAccountCheckMistakeDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/dao/impl/RpAccountCheckMistakeDaoImpl.java
index 29d56b63fc790b13d51dc5a0bf9245a2adeb0d12..2a8657e7ce59658c7d40a17234d47e7d14157295 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/dao/impl/RpAccountCheckMistakeDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/dao/impl/RpAccountCheckMistakeDaoImpl.java
@@ -18,7 +18,6 @@ package com.roncoo.pay.reconciliation.dao.impl;
 import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl;
 import com.roncoo.pay.reconciliation.dao.RpAccountCheckMistakeDao;
 import com.roncoo.pay.reconciliation.entity.RpAccountCheckMistake;
-
 import org.springframework.stereotype.Repository;
 
 /**
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/dao/impl/RpAccountCheckMistakeScratchPoolDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/dao/impl/RpAccountCheckMistakeScratchPoolDaoImpl.java
index e7cc0c86b2e4cebe7b9d58555b4223890dcbdd0c..6158afd59c9fb4d049d3bc016a3cc9e2657ae38e 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/dao/impl/RpAccountCheckMistakeScratchPoolDaoImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/dao/impl/RpAccountCheckMistakeScratchPoolDaoImpl.java
@@ -18,7 +18,6 @@ package com.roncoo.pay.reconciliation.dao.impl;
 import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl;
 import com.roncoo.pay.reconciliation.dao.RpAccountCheckMistakeScratchPoolDao;
 import com.roncoo.pay.reconciliation.entity.RpAccountCheckMistakeScratchPool;
-
 import org.springframework.stereotype.Repository;
 
 /**
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/entity/RpAccountCheckBatch.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/entity/RpAccountCheckBatch.java
index ebdd73ec946ac98949d114ca2fa7cc6cb89230f4..28fa6685b6bfbc19161ecc48fc5bc17016f6a49a 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/entity/RpAccountCheckBatch.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/entity/RpAccountCheckBatch.java
@@ -15,11 +15,11 @@
  */
 package com.roncoo.pay.reconciliation.entity;
 
+import com.roncoo.pay.common.core.entity.BaseEntity;
+
 import java.math.BigDecimal;
 import java.util.Date;
 
-import com.roncoo.pay.common.core.entity.BaseEntity;
-
 /**
  * 对账批次实体 .
  * 
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/entity/RpAccountCheckMistake.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/entity/RpAccountCheckMistake.java
index 710b2b11714cc4e81bc631e5e25e06cfa776cbad..d8d5415ac35b9e8af4bf93d736b18d56c281c98b 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/entity/RpAccountCheckMistake.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/entity/RpAccountCheckMistake.java
@@ -15,11 +15,11 @@
  */
 package com.roncoo.pay.reconciliation.entity;
 
+import com.roncoo.pay.common.core.entity.BaseEntity;
+
 import java.math.BigDecimal;
 import java.util.Date;
 
-import com.roncoo.pay.common.core.entity.BaseEntity;
-
 /**
  * 对账差错表.
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/entity/RpAccountCheckMistakeScratchPool.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/entity/RpAccountCheckMistakeScratchPool.java
index c16da510dcf0af8fddce42aba75df0ca6f1293cd..2ed76c51293c6e2a9ee283373332e7f143abd71c 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/entity/RpAccountCheckMistakeScratchPool.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/entity/RpAccountCheckMistakeScratchPool.java
@@ -15,11 +15,11 @@
  */
 package com.roncoo.pay.reconciliation.entity;
 
+import com.roncoo.pay.common.core.entity.BaseEntity;
+
 import java.math.BigDecimal;
 import java.util.Date;
 
-import com.roncoo.pay.common.core.entity.BaseEntity;
-
 /**
  * 对账暂存池.
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/exception/ReconciliationBizException.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/exception/ReconciliationBizException.java
index b5f6f31de91550906574b816edf398989ec2c7af..7c3f8b0263e8d328a536aad55e92ef6647ed11f1 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/exception/ReconciliationBizException.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/exception/ReconciliationBizException.java
@@ -16,7 +16,6 @@
 package com.roncoo.pay.reconciliation.exception;
 
 import com.roncoo.pay.common.core.exception.BizException;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/fileDown/impl/AlipayFileDown.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/fileDown/impl/AlipayFileDown.java
index 284cf2703d18b0c277e2985e28e8ca94ec5e9f87..1bdd35a5baeac669c8a045c11e2b62c968121b7f 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/fileDown/impl/AlipayFileDown.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/fileDown/impl/AlipayFileDown.java
@@ -15,17 +15,6 @@
  */
 package com.roncoo.pay.reconciliation.fileDown.impl;
 
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 import com.roncoo.pay.common.core.utils.DateUtils;
 import com.roncoo.pay.reconciliation.fileDown.service.FileDown;
 import com.roncoo.pay.reconciliation.utils.alipay.AlipaySubmit;
@@ -34,6 +23,17 @@ import com.roncoo.pay.reconciliation.utils.alipay.httpClient.HttpRequest;
 import com.roncoo.pay.reconciliation.utils.alipay.httpClient.HttpResponse;
 import com.roncoo.pay.reconciliation.utils.alipay.httpClient.HttpResultType;
 import com.roncoo.pay.trade.utils.AlipayConfigUtil;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * 支付宝账单下载.
@@ -42,6 +42,7 @@ import com.roncoo.pay.trade.utils.AlipayConfigUtil;
  * 
  * @author:shenjialong
  */
+@Component("ALIPAY")
 public class AlipayFileDown implements FileDown {
 	private static final Log LOG = LogFactory.getLog(AlipayFileDown.class);
 	SimpleDateFormat timestampSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/fileDown/impl/ReconciliationFactoryImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/fileDown/impl/ReconciliationFactoryImpl.java
index 36d41416a7ac20e7ac8b9ac1a327452e5a6c617e..db1e157d149e27959db3dc3923348147a98070f5 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/fileDown/impl/ReconciliationFactoryImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/fileDown/impl/ReconciliationFactoryImpl.java
@@ -15,16 +15,16 @@
  */
 package com.roncoo.pay.reconciliation.fileDown.impl;
 
-import java.io.File;
-import java.util.Date;
-
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.beans.factory.BeanFactoryAware;
-import org.springframework.stereotype.Service;
-
 import com.roncoo.pay.reconciliation.fileDown.service.FileDown;
 import com.roncoo.pay.reconciliation.fileDown.service.ReconciliationFactory;
 import com.roncoo.pay.reconciliation.utils.ReconciliationConfigUtil;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.util.Date;
 
 /**
  * 文件下载factory
@@ -34,9 +34,9 @@ import com.roncoo.pay.reconciliation.utils.ReconciliationConfigUtil;
  * @author:shenjialong
  */
 @Service("reconciliationFactory")
-public class ReconciliationFactoryImpl implements ReconciliationFactory, BeanFactoryAware {
+public class ReconciliationFactoryImpl implements ReconciliationFactory, ApplicationContextAware {
 
-	private BeanFactory beanFactory;
+	private static ApplicationContext applicationContext;
 
 	/**
 	 * 去Spring容器中根据beanName获取对象(也可以直接根据名字创建实例,可以参考后面流程中的parser)
@@ -45,11 +45,7 @@ public class ReconciliationFactoryImpl implements ReconciliationFactory, BeanFac
 	 * @return
 	 */
 	public Object getService(String payInterface) {
-		return beanFactory.getBean(payInterface);
-	}
-
-	public void setBeanFactory(BeanFactory beanFactory) {
-		this.beanFactory = beanFactory;
+		return applicationContext.getBean(payInterface);
 	}
 
 	/**
@@ -69,4 +65,8 @@ public class ReconciliationFactoryImpl implements ReconciliationFactory, BeanFac
 		return fileDown.fileDown(billDate, dir);
 	}
 
+	@Override
+	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+		this.applicationContext = applicationContext;
+	}
 }
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/fileDown/impl/WinXinFileDown.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/fileDown/impl/WinXinFileDown.java
index 539622c68eae9b410e440319ed1df8d34a8f007a..3985cf53cd2130b280de14d75729428439a92ee8 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/fileDown/impl/WinXinFileDown.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/fileDown/impl/WinXinFileDown.java
@@ -15,17 +15,6 @@
  */
 package com.roncoo.pay.reconciliation.fileDown.impl;
 
-import java.io.File;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map.Entry;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 import com.alibaba.druid.util.StringUtils;
 import com.roncoo.pay.reconciliation.fileDown.service.FileDown;
 import com.roncoo.pay.reconciliation.utils.FileUtils;
@@ -34,6 +23,17 @@ import com.roncoo.pay.reconciliation.utils.WeiXinBaseUtils;
 import com.roncoo.pay.reconciliation.utils.https.HttpClientUtil;
 import com.roncoo.pay.reconciliation.utils.https.HttpResponse;
 import com.roncoo.pay.trade.utils.WeixinConfigUtil;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map.Entry;
 
 /**
  * 微信文件下载类
@@ -42,6 +42,7 @@ import com.roncoo.pay.trade.utils.WeixinConfigUtil;
  * 
  * @author:shenjialong
  */
+@Component("WEIXIN")
 public class WinXinFileDown implements FileDown {
 
 	private static final Log LOG = LogFactory.getLog(WinXinFileDown.class);
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckBatchService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckBatchService.java
index a816fe6f5e8eb30df2dbb8225ec3b4c15e9e43f0..cb1b67313aa1093a29daac856196ac9b0f88e770 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckBatchService.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckBatchService.java
@@ -15,13 +15,13 @@
  */
 package com.roncoo.pay.reconciliation.service;
 
-import java.util.List;
-import java.util.Map;
-
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 对账批次接口 .
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckMistakeScratchPoolService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckMistakeScratchPoolService.java
index 2c488b7db7c8682e3623fdb79e8784a64c0b25dc..ceb60d90ea087d797d3445b973a99ab273e6a27a 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckMistakeScratchPoolService.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckMistakeScratchPoolService.java
@@ -15,13 +15,13 @@
  */
 package com.roncoo.pay.reconciliation.service;
 
-import java.util.List;
-import java.util.Map;
-
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.reconciliation.entity.RpAccountCheckMistakeScratchPool;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 对账暂存池接口 .
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckMistakeService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckMistakeService.java
index c47f3471770581f647d63e084edd4667fe21274d..7bac213d7162bba0c0929f67fa95d1c038178b56 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckMistakeService.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckMistakeService.java
@@ -15,13 +15,13 @@
  */
 package com.roncoo.pay.reconciliation.service;
 
-import java.util.List;
-import java.util.Map;
-
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.reconciliation.entity.RpAccountCheckMistake;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 对账差错接口 .
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckTransactionService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckTransactionService.java
index b1113b5da5dcd5c038e42a30ca2be96b7bbb9c2a..5611badaaf13508cc692d6046991a2cadfe320bf 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckTransactionService.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/RpAccountCheckTransactionService.java
@@ -15,12 +15,12 @@
  */
 package com.roncoo.pay.reconciliation.service;
 
-import java.util.List;
-
 import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch;
 import com.roncoo.pay.reconciliation.entity.RpAccountCheckMistake;
 import com.roncoo.pay.reconciliation.entity.RpAccountCheckMistakeScratchPool;
 
+import java.util.List;
+
 /**
  * 对账数据事务一致性service.
  *
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckBatchServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckBatchServiceImpl.java
index e51f82fb458286ce063999d996a32be7bb5c0bc9..30bcfa45fd482c09ed2af854533d9c684fb7d42e 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckBatchServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckBatchServiceImpl.java
@@ -15,17 +15,16 @@
  */
 package com.roncoo.pay.reconciliation.service.impl;
 
-import java.util.List;
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.reconciliation.dao.RpAccountCheckBatchDao;
 import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch;
 import com.roncoo.pay.reconciliation.service.RpAccountCheckBatchService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * 对账批次接口实现 .
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckMistakeScratchPoolServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckMistakeScratchPoolServiceImpl.java
index df6050d7399f2c29d59e4b058523243556de6a88..1d4d25c4cddaacab4d42d53d6f8723959f738a45 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckMistakeScratchPoolServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckMistakeScratchPoolServiceImpl.java
@@ -15,18 +15,17 @@
  */
 package com.roncoo.pay.reconciliation.service.impl;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.reconciliation.dao.RpAccountCheckMistakeScratchPoolDao;
 import com.roncoo.pay.reconciliation.entity.RpAccountCheckMistakeScratchPool;
 import com.roncoo.pay.reconciliation.service.RpAccountCheckMistakeScratchPoolService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 对账暂存池接口实现 .
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckMistakeServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckMistakeServiceImpl.java
index b5a7ffc2a2c2e8054918b41ac062d5b662c497d9..03473b4ede8a50f93e73b0f27c2ebc099366bb19 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckMistakeServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckMistakeServiceImpl.java
@@ -15,17 +15,16 @@
  */
 package com.roncoo.pay.reconciliation.service.impl;
 
-import java.util.List;
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import com.roncoo.pay.common.core.page.PageBean;
 import com.roncoo.pay.common.core.page.PageParam;
 import com.roncoo.pay.reconciliation.dao.RpAccountCheckMistakeDao;
 import com.roncoo.pay.reconciliation.entity.RpAccountCheckMistake;
 import com.roncoo.pay.reconciliation.service.RpAccountCheckMistakeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * 对账批次接口实现 .
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckTransactionServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckTransactionServiceImpl.java
index 9885c34337748cc722d48a35bdcb42f4dae1a383..3edfaf60ee90c1aa029dfdf59cd3140ee7df89d0 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckTransactionServiceImpl.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/service/impl/RpAccountCheckTransactionServiceImpl.java
@@ -15,14 +15,6 @@
  */
 package com.roncoo.pay.reconciliation.service.impl;
 
-import java.util.List;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import com.roncoo.pay.reconciliation.entity.RpAccountCheckBatch;
 import com.roncoo.pay.reconciliation.entity.RpAccountCheckMistake;
 import com.roncoo.pay.reconciliation.entity.RpAccountCheckMistakeScratchPool;
@@ -33,6 +25,13 @@ import com.roncoo.pay.reconciliation.service.RpAccountCheckMistakeScratchPoolSer
 import com.roncoo.pay.reconciliation.service.RpAccountCheckMistakeService;
 import com.roncoo.pay.reconciliation.service.RpAccountCheckTransactionService;
 import com.roncoo.pay.trade.service.RpTradeReconciliationService;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
 
 /**
  * 对账数据事务一致性service.
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/FileUtils.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/FileUtils.java
index e52b9e300c0f8c338aa75bdf178b0be31591b11b..3aa9f9b3da8969cdff78a2ac6f8f178f2b737693 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/FileUtils.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/FileUtils.java
@@ -1,14 +1,10 @@
 package com.roncoo.pay.reconciliation.utils;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
+import com.roncoo.pay.reconciliation.utils.https.HttpResponse;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.io.*;
 import java.nio.ByteBuffer;
 import java.nio.channels.Channels;
 import java.nio.channels.FileChannel;
@@ -22,11 +18,6 @@ import java.util.regex.Pattern;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import com.roncoo.pay.reconciliation.utils.https.HttpResponse;
-
 /**
  * 
  * @类功能说明: 文件工具类.
diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/SignHelper.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/SignHelper.java
index fa0d3d11801b4de97189336e07be8e0bb06e6b88..57d13c3baeab0fba750aa90e1b212243bf10a172 100644
--- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/SignHelper.java
+++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/SignHelper.java
@@ -1,21 +1,15 @@
 package com.roncoo.pay.reconciliation.utils;
 
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 import java.io.UnsupportedEncodingException;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
 
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 /**
  * 签名算法
*
@@ -93,8 +87,8 @@ public class SignHelper { // sort List> paramsArray = new ArrayList>(temp.entrySet()); - Collections.sort(paramsArray, new Comparator>() { - public int compare(Map.Entry o1, Map.Entry o2) { + Collections.sort(paramsArray, new Comparator>() { + public int compare(Entry o1, Entry o2) { return (o1.getKey()).toString().compareTo(o2.getKey()); } }); diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/XmlUtils.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/XmlUtils.java index 22ef7f94b5afab917375bd4af52f3c49116b3d51..f0d6f4aba4f9beaff1d60fc6420258fc5b515a63 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/XmlUtils.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/XmlUtils.java @@ -1,32 +1,28 @@ package com.roncoo.pay.reconciliation.utils; -import java.io.File; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.xml.sax.InputSource; + import java.io.IOException; import java.io.StringReader; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.dom4j.Attribute; -import org.dom4j.DocumentException; -import org.dom4j.io.SAXReader; -import org.jdom2.Document; -import org.jdom2.Element; -import org.jdom2.JDOMException; -import org.jdom2.input.SAXBuilder; -import org.xml.sax.InputSource; - public class XmlUtils { - /** - * 将xml string 转化为map - * - * @param xmlDoc - * @return - * @throws IOException - * @throws JDOMException - */ - @SuppressWarnings("unchecked") - public static Map xmlToMap(String xmlDoc) throws JDOMException, IOException { + /** + * 将xml string 转化为map + * + * @param xmlDoc + * @return + * @throws IOException + * @throws + */ + @SuppressWarnings("unchecked") + /*public static Map xmlToMap(String xmlDoc) throws JDOMException, IOException { // 创建一个新的字符串 StringReader read = new StringReader(xmlDoc); // 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入 @@ -46,6 +42,27 @@ public class XmlUtils { xmlMap.put(et.getName(), et.getText()); } return xmlMap; - } + }*/ + + public static Map xmlToMap(String xmlDoc) throws DocumentException { + // 创建一个新的字符串 + StringReader read = new StringReader(xmlDoc); + // 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入 + InputSource source = new InputSource(read); + // 创建一个新的SAXBuilder + SAXReader saxReader = new SAXReader(); + + Map xmlMap = new HashMap(); + + Document doc = saxReader.read(source); // 通过输入源构造一个Document + Element root = doc.getRootElement(); // 取的根元素 + + List elements = root.elements(); // 得到根元素所有子元素的集合(根元素的子节点,不包括孙子节点) + for (Element et : elements) { + xmlMap.put(et.getName(), et.getText()); + } + return xmlMap; + } + } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/AlipayCore.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/AlipayCore.java index 77ccea98a78ca60dd06869a6c2bcf3c99ce4b7a9..9afd52b99ab91a53c38c860da26b92fa11219996 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/AlipayCore.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/AlipayCore.java @@ -1,19 +1,14 @@ package com.roncoo.pay.reconciliation.utils.alipay; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - +import com.roncoo.pay.trade.utils.AlipayConfigUtil; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.httpclient.methods.multipart.FilePartSource; import org.apache.commons.httpclient.methods.multipart.PartSource; -import com.roncoo.pay.trade.utils.AlipayConfigUtil; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.*; /* * diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/AlipayNotify.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/AlipayNotify.java index c169f1fc9183fa6876792b4f3ff8a90274bf0d4c..43909afdf7f39efc4047225507d722b3bae292cd 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/AlipayNotify.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/AlipayNotify.java @@ -1,13 +1,13 @@ package com.roncoo.pay.reconciliation.utils.alipay; +import com.roncoo.pay.trade.utils.AlipayConfigUtil; + import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.Map; -import com.roncoo.pay.trade.utils.AlipayConfigUtil; - /* * *类名:AlipayNotify *功能:支付宝通知处理类 diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/AlipaySubmit.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/AlipaySubmit.java index bcc6249aec91792fd90e87fb4fca9bc6c77c362d..d1396ab51739fe102dd6c7203e56519eb743dcf1 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/AlipaySubmit.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/AlipaySubmit.java @@ -1,19 +1,18 @@ package com.roncoo.pay.reconciliation.utils.alipay; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - +import com.roncoo.pay.trade.utils.AlipayConfigUtil; import org.apache.commons.httpclient.NameValuePair; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Node; import org.dom4j.io.SAXReader; -import com.roncoo.pay.trade.utils.AlipayConfigUtil; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; /* * *类名:AlipaySubmit diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/MD5.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/MD5.java index a2d630a3e0651adfa4b3fa1a1fef13aff5357570..e7069796332df808075b8a45e6f1736495baf95e 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/MD5.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/MD5.java @@ -1,10 +1,10 @@ package com.roncoo.pay.reconciliation.utils.alipay; +import org.apache.commons.codec.digest.DigestUtils; + import java.io.UnsupportedEncodingException; import java.security.SignatureException; -import org.apache.commons.codec.digest.DigestUtils; - /** * 功能:支付宝MD5签名处理核心文件,不需要修改 * 版本:3.3 diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/UtilDate.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/UtilDate.java index 9d14806c7445908878c7b3de9e6b1b68e83fce64..8e2db71697becbe35aeafacc1bb659f3564d2894 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/UtilDate.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/UtilDate.java @@ -1,10 +1,10 @@ package com.roncoo.pay.reconciliation.utils.alipay; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; -import java.text.SimpleDateFormat; -import java.text.DateFormat; /* * *类名:UtilDate diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/httpClient/HttpProtocolHandler.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/httpClient/HttpProtocolHandler.java index 6ac88eb93b4047b5df58a617f9c35433c6be0149..a90b6a6bc4c2b5447b81dddbe470932da8ca0269 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/httpClient/HttpProtocolHandler.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/httpClient/HttpProtocolHandler.java @@ -1,24 +1,15 @@ package com.roncoo.pay.reconciliation.utils.alipay.httpClient; -import org.apache.commons.httpclient.HttpException; -import java.io.IOException; -import java.net.UnknownHostException; - -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.HttpConnectionManager; -import org.apache.commons.httpclient.HttpMethod; -import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; -import org.apache.commons.httpclient.NameValuePair; +import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; -import org.apache.commons.httpclient.util.IdleConnectionTimeoutThread; -import org.apache.commons.httpclient.methods.multipart.FilePart; -import org.apache.commons.httpclient.methods.multipart.FilePartSource; -import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity; -import org.apache.commons.httpclient.methods.multipart.Part; -import org.apache.commons.httpclient.methods.multipart.StringPart; +import org.apache.commons.httpclient.methods.multipart.*; import org.apache.commons.httpclient.params.HttpMethodParams; +import org.apache.commons.httpclient.util.IdleConnectionTimeoutThread; + import java.io.File; +import java.io.IOException; +import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/httpClient/HttpResponse.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/httpClient/HttpResponse.java index f3cc3879cb1b4017dcffc08eca909381525d1d6f..044f2598b6e1c4c2013200689421ed3a732b057e 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/httpClient/HttpResponse.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/alipay/httpClient/HttpResponse.java @@ -1,10 +1,9 @@ package com.roncoo.pay.reconciliation.utils.alipay.httpClient; -import java.io.UnsupportedEncodingException; - +import com.roncoo.pay.trade.utils.AlipayConfigUtil; import org.apache.commons.httpclient.Header; -import com.roncoo.pay.trade.utils.AlipayConfigUtil; +import java.io.UnsupportedEncodingException; /* * *类名:HttpResponse diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/https/HttpClientUtil.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/https/HttpClientUtil.java index 96a56d54c07049dd9f6fde21592e9a45e041714d..f4fd92ead99d43bf8d1fc879283eb43437cb14a1 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/https/HttpClientUtil.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/https/HttpClientUtil.java @@ -1,5 +1,9 @@ package com.roncoo.pay.reconciliation.utils.https; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; import java.io.IOException; import java.io.OutputStream; import java.net.URL; @@ -7,11 +11,6 @@ import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; - public class HttpClientUtil { diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/https/HttpResponse.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/https/HttpResponse.java index 2be3d59f8853548fa1ba67beb4c31e60f2368cb7..7871d94c26997055f701105f0122a801789984ca 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/https/HttpResponse.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/https/HttpResponse.java @@ -1,11 +1,10 @@ package com.roncoo.pay.reconciliation.utils.https; +import javax.net.ssl.HttpsURLConnection; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; -import javax.net.ssl.HttpsURLConnection; - public class HttpResponse implements Closeable { private InputStream inputStream; diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/https/MyX509TrustManager.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/https/MyX509TrustManager.java index 835b946ceea10da63e90285e89edb98b07266400..2834dcbdc17b6bf673e3d650ca1c66844cbded7a 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/https/MyX509TrustManager.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/reconciliation/utils/https/MyX509TrustManager.java @@ -1,10 +1,9 @@ package com.roncoo.pay.reconciliation.utils.https; +import javax.net.ssl.X509TrustManager; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; -import javax.net.ssl.X509TrustManager; - /** * 证书信任管理器(用于https请求) * diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/bo/F2FPayRequestBo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/bo/F2FPayRequestBo.java new file mode 100644 index 0000000000000000000000000000000000000000..647b81011199396b438e4bbd4063f47e914a6bd7 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/bo/F2FPayRequestBo.java @@ -0,0 +1,159 @@ +package com.roncoo.pay.trade.bo; + +import javax.validation.constraints.Digits; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 用户被扫请求Bo + */ +public class F2FPayRequestBo implements Serializable { + + @Size(min = 16 , max = 32 , message = "商户Key[payKey]长度最小16位最大32位") + @NotNull(message = "商户Key[payKey]不能为空") + private String payKey; + + @Size(min = 16 , max = 20 , message = "支付授权码[authCode]长度最小16位最大20位") + @NotNull(message = "商支付授权码户Key[authCode]不能为空") + private String authCode; + + @Size(max = 200 , message = "商品名称[productName]长度最大200位") + @NotNull(message = "商品名称[productName]不能为空") + private String productName; + + @Size(min = 5 , max = 20 , message = "商品订单号[orderNo]长度最小5位,最大20位") + @NotNull(message = "商品订单号[orderNo]不能为空") + private String orderNo; + + @Digits(integer = 12, fraction = 2, message = "订单金额格式有误") + @NotNull(message = "订单金额[orderPrice]不能为空") + private BigDecimal orderPrice; + + @Size(min = 1 , max = 20 , message = "订单IP[orderIp]长度最小1位,最大20位") + @NotNull(message = "订单IP[orderIp]不能为空") + private String orderIp; + + @Size(min = 1 , max = 8 , message = "订单日期[orderDate]长度最小1位,最大8位") + @NotNull(message = "订单日期[orderDate]不能为空") + private String orderDate; + + @Size(min = 1 , max = 14 , message = "订单时间[orderTime]长度最小1位,最大14位") + @NotNull(message = "订单时间[orderTime]不能为空") + private String orderTime; + + @NotNull(message = "签名[sign]不能为空") + private String sign; + + private String remark;//支付备注 + + @Size(min = 1 , max = 14 , message = "交易类型[payType]长度最小1位,最大14位") + @NotNull(message = "交易类型[payType]不能为空") + private String payType;//支付类型 + + public String getPayKey() { + return payKey; + } + + public void setPayKey(String payKey) { + this.payKey = payKey; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public BigDecimal getOrderPrice() { + return orderPrice; + } + + public void setOrderPrice(BigDecimal orderPrice) { + this.orderPrice = orderPrice; + } + + public String getOrderIp() { + return orderIp; + } + + public void setOrderIp(String orderIp) { + this.orderIp = orderIp; + } + + public String getOrderDate() { + return orderDate; + } + + public void setOrderDate(String orderDate) { + this.orderDate = orderDate; + } + + public String getOrderTime() { + return orderTime; + } + + public void setOrderTime(String orderTime) { + this.orderTime = orderTime; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getPayType() { + return payType; + } + + public void setPayType(String payType) { + this.payType = payType; + } + + public String getAuthCode() { + return authCode; + } + + public void setAuthCode(String authCode) { + this.authCode = authCode; + } + + @Override + public String toString() { + return "F2FPayRequestBo{" + + "payKey='" + payKey + '\'' + + ", authCode='" + authCode + '\'' + + ", productName='" + productName + '\'' + + ", orderNo='" + orderNo + '\'' + + ", orderPrice=" + orderPrice + + ", orderIp='" + orderIp + '\'' + + ", orderDate='" + orderDate + '\'' + + ", orderTime='" + orderTime + '\'' + + ", sign='" + sign + '\'' + + ", remark='" + remark + '\'' + + ", payType='" + payType + '\'' + + '}'; + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/bo/ProgramPayRequestBo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/bo/ProgramPayRequestBo.java new file mode 100644 index 0000000000000000000000000000000000000000..e45a940f155727bf78b55b39aa43df3312afbde0 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/bo/ProgramPayRequestBo.java @@ -0,0 +1,172 @@ +package com.roncoo.pay.trade.bo; + +import javax.validation.constraints.Digits; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 小程序支付请求Bo + */ +public class ProgramPayRequestBo implements Serializable { + + @Size(min = 16 , max = 32 , message = "商户Key[payKey]长度最小16位最大32位") + @NotNull(message = "商户Key[payKey]不能为空") + private String payKey; + + @Size(min = 1 , max = 30 , message = "[openId]长度最大30位") + @NotNull(message = "[openId]不能为空") + private String openId; + + @Size(max = 200 , message = "商品名称[productName]长度最大200位") + @NotNull(message = "商品名称[productName]不能为空") + private String productName; + + @Size(min = 5 , max = 20 , message = "商品订单号[orderNo]长度最小5位,最大20位") + @NotNull(message = "商品订单号[orderNo]不能为空") + private String orderNo; + + @Digits(integer = 12, fraction = 2, message = "订单金额格式有误") + @NotNull(message = "订单金额[orderPrice]不能为空") + private BigDecimal orderPrice; + + @Size(min = 1 , max = 20 , message = "订单IP[orderIp]长度最小1位,最大20位") + @NotNull(message = "订单IP[orderIp]不能为空") + private String orderIp; + + @Size(min = 1 , max = 8 , message = "订单日期[orderDate]长度最小1位,最大8位") + @NotNull(message = "订单日期[orderDate]不能为空") + private String orderDate; + + @Size(min = 1 , max = 14 , message = "订单时间[orderTime]长度最小1位,最大14位") + @NotNull(message = "订单时间[orderTime]不能为空") + private String orderTime; + + @Size(min = 1 , max = 200 , message = "异步通知地址[notifyUrl]长度最小1位,最大200位") + @NotNull(message = "异步通知地址[notifyUrl]不能为空") + private String notifyUrl; + + @NotNull(message = "签名[sign]不能为空") + private String sign; + + private String remark;//支付备注 + + @Size(min = 1 , max = 14 , message = "交易类型[payType]长度最小1位,最大14位") + @NotNull(message = "交易类型[payType]不能为空") + private String payType;//支付类型 + + public String getPayKey() { + return payKey; + } + + public void setPayKey(String payKey) { + this.payKey = payKey; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public BigDecimal getOrderPrice() { + return orderPrice; + } + + public void setOrderPrice(BigDecimal orderPrice) { + this.orderPrice = orderPrice; + } + + public String getOrderIp() { + return orderIp; + } + + public void setOrderIp(String orderIp) { + this.orderIp = orderIp; + } + + public String getOrderDate() { + return orderDate; + } + + public void setOrderDate(String orderDate) { + this.orderDate = orderDate; + } + + public String getOrderTime() { + return orderTime; + } + + public void setOrderTime(String orderTime) { + this.orderTime = orderTime; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getPayType() { + return payType; + } + + public void setPayType(String payType) { + this.payType = payType; + } + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public String getNotifyUrl() { + return notifyUrl; + } + + public void setNotifyUrl(String notifyUrl) { + this.notifyUrl = notifyUrl; + } + + @Override + public String toString() { + return "ProgramPayRequestBo{" + + "payKey='" + payKey + '\'' + + ", openId='" + openId + '\'' + + ", productName='" + productName + '\'' + + ", orderNo='" + orderNo + '\'' + + ", orderPrice=" + orderPrice + + ", orderIp='" + orderIp + '\'' + + ", orderDate='" + orderDate + '\'' + + ", orderTime='" + orderTime + '\'' + + ", notifyUrl='" + notifyUrl + '\'' + + ", sign='" + sign + '\'' + + ", remark='" + remark + '\'' + + ", payType='" + payType + '\'' + + '}'; + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/bo/ScanPayRequestBo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/bo/ScanPayRequestBo.java new file mode 100644 index 0000000000000000000000000000000000000000..beee3acea6394c16230db989050ab3682b139e8a --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/bo/ScanPayRequestBo.java @@ -0,0 +1,200 @@ +package com.roncoo.pay.trade.bo; + + +import javax.validation.constraints.Digits; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 用户主扫请求Bo + */ +public class ScanPayRequestBo implements Serializable { + + @Size(min = 16 , max = 32 , message = "商户Key[payKey]长度最小16位最大32位") + @NotNull(message = "商户Key[payKey]不能为空") + private String payKey; + + @Size(max = 200 , message = "商品名称[productName]长度最大200位") + @NotNull(message = "商品名称[productName]不能为空") + private String productName; + + @Size(min = 5 , max = 20 , message = "商品订单号[orderNo]长度最小5位,最大20位") + @NotNull(message = "商品订单号[orderNo]不能为空") + private String orderNo; + + @Digits(integer = 12, fraction = 2, message = "订单金额格式有误") + @NotNull(message = "订单金额[orderPrice]不能为空") + private BigDecimal orderPrice; + + @Size(min = 1 , max = 20 , message = "订单IP[orderIp]长度最小1位,最大20位") + @NotNull(message = "订单IP[orderIp]不能为空") + private String orderIp; + + @Size(min = 1 , max = 8 , message = "订单日期[orderDate]长度最小1位,最大8位") + @NotNull(message = "订单日期[orderDate]不能为空") + private String orderDate; + + @Size(min = 1 , max = 14 , message = "订单时间[orderTime]长度最小1位,最大14位") + @NotNull(message = "订单时间[orderTime]不能为空") + private String orderTime; + + @NotNull(message = "订单有效期[orderPeriod]不能为空") + private Integer orderPeriod; + + @Size(min = 1 , max = 200 , message = "页面跳转地址[returnUrl]长度最小1位,最大200位") + @NotNull(message = "页面跳转地址[returnUrl]不能为空") + private String returnUrl; + + @Size(min = 1 , max = 200 , message = "异步通知地址[notifyUrl]长度最小1位,最大200位") + @NotNull(message = "异步通知地址[notifyUrl]不能为空") + private String notifyUrl; + + @NotNull(message = "签名[sign]不能为空") + private String sign; + + private String remark;//支付备注 + + /** + * 支付类型 + */ + private String payType;//支付类型 + + /** + * 分期付款笔数 + */ + private Integer numberOfStages;//分期笔数 + + public String getPayKey() { + return payKey; + } + + public void setPayKey(String payKey) { + this.payKey = payKey; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public BigDecimal getOrderPrice() { + return orderPrice; + } + + public void setOrderPrice(BigDecimal orderPrice) { + this.orderPrice = orderPrice; + } + + public String getOrderIp() { + return orderIp; + } + + public void setOrderIp(String orderIp) { + this.orderIp = orderIp; + } + + public String getOrderDate() { + return orderDate; + } + + public void setOrderDate(String orderDate) { + this.orderDate = orderDate; + } + + public String getOrderTime() { + return orderTime; + } + + public void setOrderTime(String orderTime) { + this.orderTime = orderTime; + } + + public Integer getOrderPeriod() { + return orderPeriod; + } + + public void setOrderPeriod(Integer orderPeriod) { + this.orderPeriod = orderPeriod; + } + + public String getReturnUrl() { + return returnUrl; + } + + public void setReturnUrl(String returnUrl) { + this.returnUrl = returnUrl; + } + + public String getNotifyUrl() { + return notifyUrl; + } + + public void setNotifyUrl(String notifyUrl) { + this.notifyUrl = notifyUrl; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getPayType() { + return payType; + } + + public void setPayType(String payType) { + this.payType = payType; + } + + public Integer getNumberOfStages() { + return numberOfStages; + } + + public void setNumberOfStages(Integer numberOfStages) { + this.numberOfStages = numberOfStages; + } + + @Override + public String toString() { + return "ScanPayRequestBo{" + + "payKey='" + payKey + '\'' + + ", productName='" + productName + '\'' + + ", orderNo='" + orderNo + '\'' + + ", orderPrice=" + orderPrice + + ", orderIp='" + orderIp + '\'' + + ", orderDate='" + orderDate + '\'' + + ", orderTime='" + orderTime + '\'' + + ", orderPeriod=" + orderPeriod + + ", returnUrl='" + returnUrl + '\'' + + ", notifyUrl='" + notifyUrl + '\'' + + ", sign='" + sign + '\'' + + ", remark='" + remark + '\'' + + ", payType='" + payType + '\'' + + ", numberOfStages=" + numberOfStages + + '}'; + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/RpMicroSubmitRecordDao.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/RpMicroSubmitRecordDao.java new file mode 100644 index 0000000000000000000000000000000000000000..7c1043d570f3ded7c9be43bdebf82e53a81d729d --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/RpMicroSubmitRecordDao.java @@ -0,0 +1,11 @@ +package com.roncoo.pay.trade.dao; + +import com.roncoo.pay.common.core.dao.BaseDao; +import com.roncoo.pay.trade.entity.RpMicroSubmitRecord; + +/** + * 小微商户进件DAO接口层 + */ +public interface RpMicroSubmitRecordDao extends BaseDao { + +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/RpTradePaymentOrderDao.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/RpTradePaymentOrderDao.java index 8731c630d61d9f7bf529f6c75509b79941d0e2e0..3a3b0029026c2eaa0f64b858ae632c6261f290b3 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/RpTradePaymentOrderDao.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/RpTradePaymentOrderDao.java @@ -23,7 +23,7 @@ import com.roncoo.pay.trade.entity.RpTradePaymentOrder; * @author Peter * 龙果学院(www.roncoo.com) */ -public interface RpTradePaymentOrderDao extends BaseDao{ +public interface RpTradePaymentOrderDao extends BaseDao { /** * 根据商户编号及商户订单号获取支付订单信息 diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/RpTradePaymentRecordDao.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/RpTradePaymentRecordDao.java index ee997e82e30288563d54b680ee312d8d46d2c424..2653dd771358a94f0d16d98e5ebf43a2a545c19a 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/RpTradePaymentRecordDao.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/RpTradePaymentRecordDao.java @@ -18,12 +18,15 @@ package com.roncoo.pay.trade.dao; import com.roncoo.pay.common.core.dao.BaseDao; import com.roncoo.pay.trade.entity.RpTradePaymentRecord; +import java.util.List; +import java.util.Map; + /** * 功能说明:商户支付记录,dao层接口 * @author Peter * 龙果学院(www.roncoo.com) */ -public interface RpTradePaymentRecordDao extends BaseDao{ +public interface RpTradePaymentRecordDao extends BaseDao { /** * 根据银行订单号获取支付信息 @@ -38,7 +41,7 @@ public interface RpTradePaymentRecordDao extends BaseDao{ * @param merchantOrderNo * @return */ - RpTradePaymentRecord getSuccessRecordByMerchantNoAndMerchantOrderNo(String merchantNo , String merchantOrderNo); + RpTradePaymentRecord getSuccessRecordByMerchantNoAndMerchantOrderNo(String merchantNo, String merchantOrderNo); /** * 根据支付流水号查询支付记录 @@ -48,4 +51,8 @@ public interface RpTradePaymentRecordDao extends BaseDao{ */ RpTradePaymentRecord getByTrxNo(String trxNo); + List> getPaymentReport(String merchantNo); + + List> getPayWayReport(String merchantNo); + } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/RpUserBankAuthDao.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/RpUserBankAuthDao.java new file mode 100644 index 0000000000000000000000000000000000000000..901c7db409e7bebc6e5a91f9f065d29a87bda815 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/RpUserBankAuthDao.java @@ -0,0 +1,13 @@ +package com.roncoo.pay.trade.dao; + +import com.roncoo.pay.common.core.dao.BaseDao; +import com.roncoo.pay.trade.entity.RpUserBankAuth; + +import java.util.List; + +public interface RpUserBankAuthDao extends BaseDao { + + RpUserBankAuth findByMerchantNoAndPayOrderNo(String merchantNo,String payOrderNo); + + List listByUserInfo(String userName, String phone, String idNo, String bankAccountNo); +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/impl/RpMicroSubmitRecordDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/impl/RpMicroSubmitRecordDaoImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..bf284c14f9d6ec510ecca6ec7884adf5defcabb4 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/impl/RpMicroSubmitRecordDaoImpl.java @@ -0,0 +1,11 @@ +package com.roncoo.pay.trade.dao.impl; + +import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl; +import com.roncoo.pay.trade.dao.RpMicroSubmitRecordDao; +import com.roncoo.pay.trade.entity.RpMicroSubmitRecord; +import org.springframework.stereotype.Repository; + +@Repository +public class RpMicroSubmitRecordDaoImpl extends BaseDaoImpl implements RpMicroSubmitRecordDao { + +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/impl/RpTradePaymentOrderDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/impl/RpTradePaymentOrderDaoImpl.java index d3fe66a54ac7359d0e0564cba15ae23ae1408524..b95324524be6498349b674d6f5546c3648cc2a14 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/impl/RpTradePaymentOrderDaoImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/impl/RpTradePaymentOrderDaoImpl.java @@ -18,7 +18,6 @@ package com.roncoo.pay.trade.dao.impl; import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl; import com.roncoo.pay.trade.dao.RpTradePaymentOrderDao; import com.roncoo.pay.trade.entity.RpTradePaymentOrder; - import org.springframework.stereotype.Repository; import java.util.HashMap; diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/impl/RpTradePaymentRecordDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/impl/RpTradePaymentRecordDaoImpl.java index 56e9c45a8c6fbfd5946b2828a9e2b1585a3e6345..1d3f9335187ac7bcbfdea160621a682ad8aab6f6 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/impl/RpTradePaymentRecordDaoImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/impl/RpTradePaymentRecordDaoImpl.java @@ -18,11 +18,11 @@ package com.roncoo.pay.trade.dao.impl; import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl; import com.roncoo.pay.trade.dao.RpTradePaymentRecordDao; import com.roncoo.pay.trade.entity.RpTradePaymentRecord; - import com.roncoo.pay.trade.enums.TradeStatusEnum; import org.springframework.stereotype.Repository; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -73,5 +73,19 @@ public class RpTradePaymentRecordDaoImpl extends BaseDaoImpl> getPaymentReport(String merchantNo){ + Map paramMap = new HashMap(); + paramMap.put("status", TradeStatusEnum.SUCCESS.name()); + paramMap.put("merchantNo", merchantNo); + return super.getSessionTemplate().selectList(getStatement("getPaymentReport"),paramMap); + } + + public List> getPayWayReport(String merchantNo){ + Map paramMap = new HashMap(); + paramMap.put("status", TradeStatusEnum.SUCCESS.name()); + paramMap.put("merchantNo", merchantNo); + return super.getSessionTemplate().selectList(getStatement("getPayWayReport"),paramMap); + } } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/impl/RpUserBankAuthDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/impl/RpUserBankAuthDaoImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..5b4a141a00a4128a0ceab2e114c5aaf0d6d12076 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/dao/impl/RpUserBankAuthDaoImpl.java @@ -0,0 +1,33 @@ +package com.roncoo.pay.trade.dao.impl; + +import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl; +import com.roncoo.pay.trade.dao.RpUserBankAuthDao; +import com.roncoo.pay.trade.entity.RpUserBankAuth; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Repository("rpUserBankAuthDao") +public class RpUserBankAuthDaoImpl extends BaseDaoImpl implements RpUserBankAuthDao { + + @Override + public RpUserBankAuth findByMerchantNoAndPayOrderNo(String merchantNo, String payOrderNo) { + Map paramMap = new HashMap<>(); + paramMap.put("merchantNo", merchantNo); + paramMap.put("payOrderNo", payOrderNo); + System.out.println(paramMap.toString()); + return super.getByColumn(paramMap); + } + + @Override + public List listByUserInfo(String userName, String phone, String idNo, String bankAccountNo) { + Map paramMap = new HashMap<>(); + paramMap.put("userName", userName); + paramMap.put("phone", phone); + paramMap.put("idNo", idNo); + paramMap.put("bankAccountNo", bankAccountNo); + return super.listBy(paramMap); + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/entity/RpMicroSubmitRecord.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/entity/RpMicroSubmitRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..a09a1ea13a1a7e76052c2844431fa0a4a89e99d1 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/entity/RpMicroSubmitRecord.java @@ -0,0 +1,309 @@ +package com.roncoo.pay.trade.entity; + +import com.roncoo.pay.common.core.entity.BaseEntity; + +/** + * 小微商户进件记录 + */ +public class RpMicroSubmitRecord extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 业务申请编号 + */ + private String businessCode; + /** + * 小微商户号 + */ + private String subMchId; + /** + * 身份证人像面照片,上传后的media_id + */ + private String idCardCopy; + /** + * 身份证国徽面照片,上传后的media_id + */ + private String idCardNational; + /** + * 身份证姓名(开户名称accountName、联系人姓名contact) + */ + private String idCardName; + /** + * 身份证号码 + */ + private String idCardNumber; + /** + * 身份证有效期限,格式["1970-01-01","长期"] + */ + private String idCardValidTime; + /** + * 开户银行(持卡人需同身份证名) + */ + private String accountBank; + /** + * 开户银行省市编码(至少精确到市) + */ + private String bankAddressCode; + /** + * 银行账号 + */ + private String accountNumber; + /** + * 门店名称 + */ + private String storeName; + /** + * 门店省市编码 + */ + private String storeAddressCode; + /** + * 门店街道名称 + * 店铺详细地址,具体区/县及街道门牌号或大厦楼层,最长500个中文字符(无需填写省市信息) + */ + private String storeStreet; + /** + * 门店门口照片,上传后的media_id + */ + private String storeEntrancePic; + /** + * 店内环境照片,上传后的media_id + */ + private String indoorPic; + /** + * 商户简称 2~30个字符 + * 将在支付完成页向买家展示,需与商家的实际经营场景相符 + */ + private String merchantShortname; + /** + * 客服电话 + * 将在交易记录中向买家展示,请确保电话畅通以便微信回拨确认 + */ + private String servicePhone; + /** + * 售卖商品/提供服务描述 + * 餐饮/线下零售/居民生活服务/休闲娱乐/交通出行/其他 + */ + private String productDesc; + /** + * 费率 + */ + private String rate; + /** + * 联系人手机 + */ + private String contactPhone; + + + /*------*/ + /** + * 身份证有效期 + */ + private String idCardValidTimeBegin; + private String idCardValidTimeEnd; + /*------*/ + + public String getIdCardValidTimeBegin() { + return idCardValidTimeBegin; + } + + public void setIdCardValidTimeBegin(String idCardValidTimeBegin) { + this.idCardValidTimeBegin = idCardValidTimeBegin; + } + + public String getIdCardValidTimeEnd() { + return idCardValidTimeEnd; + } + + public void setIdCardValidTimeEnd(String idCardValidTimeEnd) { + this.idCardValidTimeEnd = idCardValidTimeEnd; + } + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getSubMchId() { + return subMchId; + } + + public void setSubMchId(String subMchId) { + this.subMchId = subMchId; + } + + public String getIdCardCopy() { + return idCardCopy; + } + + public void setIdCardCopy(String idCardCopy) { + this.idCardCopy = idCardCopy; + } + + public String getIdCardNational() { + return idCardNational; + } + + public void setIdCardNational(String idCardNational) { + this.idCardNational = idCardNational; + } + + public String getIdCardName() { + return idCardName; + } + + public void setIdCardName(String idCardName) { + this.idCardName = idCardName; + } + + public String getIdCardNumber() { + return idCardNumber; + } + + public void setIdCardNumber(String idCardNumber) { + this.idCardNumber = idCardNumber; + } + + public String getIdCardValidTime() { + return idCardValidTime; + } + + public void setIdCardValidTime(String idCardValidTime) { + this.idCardValidTime = idCardValidTime; + } + + public String getAccountBank() { + return accountBank; + } + + public void setAccountBank(String accountBank) { + this.accountBank = accountBank; + } + + public String getBankAddressCode() { + return bankAddressCode; + } + + public void setBankAddressCode(String bankAddressCode) { + this.bankAddressCode = bankAddressCode; + } + + public String getAccountNumber() { + return accountNumber; + } + + public void setAccountNumber(String accountNumber) { + this.accountNumber = accountNumber; + } + + public String getStoreName() { + return storeName; + } + + public void setStoreName(String storeName) { + this.storeName = storeName; + } + + public String getStoreAddressCode() { + return storeAddressCode; + } + + public void setStoreAddressCode(String storeAddressCode) { + this.storeAddressCode = storeAddressCode; + } + + public String getStoreStreet() { + return storeStreet; + } + + public void setStoreStreet(String storeStreet) { + this.storeStreet = storeStreet; + } + + public String getStoreEntrancePic() { + return storeEntrancePic; + } + + public void setStoreEntrancePic(String storeEntrancePic) { + this.storeEntrancePic = storeEntrancePic; + } + + public String getIndoorPic() { + return indoorPic; + } + + public void setIndoorPic(String indoorPic) { + this.indoorPic = indoorPic; + } + + public String getMerchantShortname() { + return merchantShortname; + } + + public void setMerchantShortname(String merchantShortname) { + this.merchantShortname = merchantShortname; + } + + public String getServicePhone() { + return servicePhone; + } + + public void setServicePhone(String servicePhone) { + this.servicePhone = servicePhone; + } + + public String getProductDesc() { + return productDesc; + } + + public void setProductDesc(String productDesc) { + this.productDesc = productDesc; + } + + public String getRate() { + return rate; + } + + public void setRate(String rate) { + this.rate = rate; + } + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + @Override + public String toString() { + return "RpMicroSubmitRecord{" + + "businessCode='" + businessCode + '\'' + + ", subMchId='" + subMchId + '\'' + + ", idCardCopy='" + idCardCopy + '\'' + + ", idCardNational='" + idCardNational + '\'' + + ", idCardName='" + idCardName + '\'' + + ", idCardNumber='" + idCardNumber + '\'' + + ", idCardValidTime='" + idCardValidTime + '\'' + + ", accountBank='" + accountBank + '\'' + + ", bankAddressCode='" + bankAddressCode + '\'' + + ", accountNumber='" + accountNumber + '\'' + + ", storeName='" + storeName + '\'' + + ", storeAddressCode='" + storeAddressCode + '\'' + + ", storeStreet='" + storeStreet + '\'' + + ", storeEntrancePic='" + storeEntrancePic + '\'' + + ", indoorPic='" + indoorPic + '\'' + + ", merchantShortname='" + merchantShortname + '\'' + + ", servicePhone='" + servicePhone + '\'' + + ", productDesc='" + productDesc + '\'' + + ", rate='" + rate + '\'' + + ", contactPhone='" + contactPhone + '\'' + + ", idCardValidTimeBegin='" + idCardValidTimeBegin + '\'' + + ", idCardValidTimeEnd='" + idCardValidTimeEnd + '\'' + + '}'; + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/entity/RpTradePaymentRecord.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/entity/RpTradePaymentRecord.java index 5c68a5599dd4fe7feee70e91eacf6f28df2c440d..190f4bb253cadbc858c4f8662ffd9a3869fd490b 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/entity/RpTradePaymentRecord.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/entity/RpTradePaymentRecord.java @@ -16,6 +16,11 @@ package com.roncoo.pay.trade.entity; import com.roncoo.pay.common.core.entity.BaseEntity; +import com.roncoo.pay.common.core.enums.PayTypeEnum; +import com.roncoo.pay.common.core.enums.PayWayEnum; +import com.roncoo.pay.common.core.utils.DateUtils; +import com.roncoo.pay.trade.enums.TradeStatusEnum; +import com.roncoo.pay.trade.enums.TrxTypeEnum; import java.io.Serializable; import java.math.BigDecimal; @@ -526,6 +531,22 @@ public class RpTradePaymentRecord extends BaseEntity implements Serializable { public void setBankReturnMsg(String bankReturnMsg) { this.bankReturnMsg = bankReturnMsg; } + + public String getTrxTypeDesc() { + return TrxTypeEnum.getEnum(this.getTrxType()).getDesc(); + } + + public String getPayWayNameDesc() { + return PayWayEnum.getEnum(this.getPayWayCode()).getDesc()+"-"+ PayTypeEnum.getEnum(this.getPayTypeCode()).getDesc(); + } + + public String getStatusDesc() { + return TradeStatusEnum.getEnum(this.getStatus()).getDesc(); + } + + public String getCreateTimeDesc() { + return DateUtils.formatDate(this.getCreateTime(), "yyyy-MM-dd HH:mm"); + } @Override public String toString() { diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/entity/RpUserBankAuth.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/entity/RpUserBankAuth.java new file mode 100644 index 0000000000000000000000000000000000000000..7cd3e8d9458a535d1679d1e44994cb5117c4dc96 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/entity/RpUserBankAuth.java @@ -0,0 +1,88 @@ +package com.roncoo.pay.trade.entity; + +import com.roncoo.pay.common.core.entity.BaseEntity; + +import java.io.Serializable; + +public class RpUserBankAuth extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 6173089060762552675L; + + /** + * 商户号 + */ + private String merchantNo; + + /** + * 支付订单号 + */ + private String payOrderNo; + + /** + * 用户名称 + */ + private String userName; + + /** + * 手机号 + */ + private String phone; + + /** + * 身份证号 + */ + private String idNo; + + /** + * 银行卡号 + */ + private String bankAccountNo; + + public String getMerchantNo() { + return merchantNo; + } + + public void setMerchantNo(String merchantNo) { + this.merchantNo = merchantNo; + } + + public String getPayOrderNo() { + return payOrderNo; + } + + public void setPayOrderNo(String payOrderNo) { + this.payOrderNo = payOrderNo; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getIdNo() { + return idNo; + } + + public void setIdNo(String idNo) { + this.idNo = idNo; + } + + public String getBankAccountNo() { + return bankAccountNo; + } + + public void setBankAccountNo(String bankAccountNo) { + this.bankAccountNo = bankAccountNo; + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/enums/AuthStatusEnum.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/enums/AuthStatusEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..a48500433c1cd44f14fe7c13d778deae22f88972 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/enums/AuthStatusEnum.java @@ -0,0 +1,28 @@ +package com.roncoo.pay.trade.enums; + +public enum AuthStatusEnum { + /** + * 鉴权成功 + */ + SUCCESS("鉴权成功"), + + /** + * 鉴权中 + */ + WAITING_AUTH("鉴权中"), + + /** + * 鉴权失败 + */ + FAILED("鉴权失败"); + + private AuthStatusEnum(String desc) { + this.desc = desc; + } + + private String desc; + + public String getDesc() { + return desc; + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/exception/TradeBizException.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/exception/TradeBizException.java index 4dde37e6dac159511d366683b377c46958bca90e..80facbdd541be8ae0a37ff72445e91e21f3a29e8 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/exception/TradeBizException.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/exception/TradeBizException.java @@ -16,7 +16,6 @@ package com.roncoo.pay.trade.exception; import com.roncoo.pay.common.core.exception.BizException; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/RpMicroSubmitRecordService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/RpMicroSubmitRecordService.java new file mode 100644 index 0000000000000000000000000000000000000000..4b84ee346793fc2a2af02aa79066025117228b16 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/RpMicroSubmitRecordService.java @@ -0,0 +1,47 @@ +package com.roncoo.pay.trade.service; + +import com.roncoo.pay.common.core.page.PageBean; +import com.roncoo.pay.common.core.page.PageParam; +import com.roncoo.pay.trade.entity.RpMicroSubmitRecord; + +import java.util.Map; + +/** + * 小微商户进件service接口 + * + * @author Quanf + */ +public interface RpMicroSubmitRecordService { + + /** + * 获取分页信息 + * + * @param pageParam + * @param rpMicroSubmitRecord + * @return + */ + PageBean listPage(PageParam pageParam, RpMicroSubmitRecord rpMicroSubmitRecord); + + /** + * 保存 + * + * @param rpMicroSubmitRecord + */ + void saveData(RpMicroSubmitRecord rpMicroSubmitRecord); + + /** + * 进件 + * + * @param rpMicroSubmitRecord + */ + Map microSubmit(RpMicroSubmitRecord rpMicroSubmitRecord); + + /** + * 查询 + * + * @param businessCode + * @return + */ + Map microQuery(String businessCode); + +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/RpTradePaymentManagerService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/RpTradePaymentManagerService.java index e3fc9df77b4b11513299ef0eda9afc53a83f0b0f..9bbbe57329bde8f6a83ddf0e888227bf4e6ec1eb 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/RpTradePaymentManagerService.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/RpTradePaymentManagerService.java @@ -15,10 +15,11 @@ */ package com.roncoo.pay.trade.service; -import com.roncoo.pay.trade.vo.F2FPayResultVo; -import com.roncoo.pay.trade.vo.OrderPayResultVo; -import com.roncoo.pay.trade.vo.RpPayGateWayPageShowVo; -import com.roncoo.pay.trade.vo.ScanPayResultVo; +import com.roncoo.pay.trade.bo.F2FPayRequestBo; +import com.roncoo.pay.trade.bo.ProgramPayRequestBo; +import com.roncoo.pay.trade.bo.ScanPayRequestBo; +import com.roncoo.pay.trade.vo.*; +import com.roncoo.pay.user.entity.RpUserPayConfig; import java.math.BigDecimal; import java.util.Date; @@ -26,7 +27,8 @@ import java.util.Map; /** * 功能说明:交易模块管理接口 - * @author Peter + * + * @author Peter * 龙果学院(www.roncoo.com) */ public interface RpTradePaymentManagerService { @@ -38,96 +40,101 @@ public interface RpTradePaymentManagerService { * 2:创建支付记录 * 3:根据相应渠道方法 * 4:调转到相应支付渠道扫码界面 - * @param payKey 商户支付Key - * @param productName 产品名称 - * @param orderNo 商户订单号 - * @param orderDate 下单日期 - * @param orderTime 下单时间 - * @param orderPrice 订单金额(元) - * @param payWayCode 支付方式 - * @param orderIp 下单IP - * @param orderPeriod 订单有效期(分钟) - * @param returnUrl 支付结果页面通知地址 - * @param notifyUrl 支付结果后台通知地址 - * @param remark 支付备注 - * @param field1 扩展字段1 - * @param field2 扩展字段2 - * @param field3 扩展字段3 - * @param field4 扩展字段4 - * @param field5 扩展字段5 - */ - public ScanPayResultVo initDirectScanPay(String payKey, String productName, String orderNo, Date orderDate, Date orderTime, BigDecimal orderPrice, String payWayCode, String orderIp, Integer orderPeriod, String returnUrl - , String notifyUrl, String remark, String field1, String field2, String field3, String field4, String field5); + **/ + + public ScanPayResultVo initDirectScanPay(RpUserPayConfig rpUserPayConfig , ScanPayRequestBo scanPayRequestBo); /** * 条码支付,对应的是支付宝的条码支付或者微信的刷卡支付 - * @param payKey 商户支付key - * @param authCode 支付授权码 - * @param productName 产品名称 - * @param orderNo 商户订单号 - * @param orderDate 下单日期 - * @param orderTime 下单时间 - * @param orderPrice 订单金额(元) - * @param payWayCode 支付方式 - * @param orderIp 下单IP - * @param remark 支付备注 - * @param field1 扩展字段1 - * @param field2 扩展字段2 - * @param field3 扩展字段3 - * @param field4 扩展字段4 - * @param field5 扩展字段5 + * * @return */ - public F2FPayResultVo f2fPay(String payKey,String authCode , String productName, String orderNo, Date orderDate, Date orderTime, BigDecimal orderPrice, String payWayCode, String orderIp, String remark, String field1, String field2, String field3, String field4, String field5); + public F2FPayResultVo f2fPay(RpUserPayConfig rpUserPayConfig , F2FPayRequestBo f2FPayRequestBo); + /** * 完成扫码支付(支付宝即时到账支付) + * * @param payWayCode * @param notifyMap * @return */ - public String completeScanPay(String payWayCode ,Map notifyMap); + public String completeScanPay(String payWayCode, Map notifyMap); /** - * * @param payWayCode * @param resultMap * @return */ - public OrderPayResultVo completeScanPayByResult(String payWayCode , Map resultMap); + public OrderPayResultVo completeScanPayByResult(String payWayCode, Map resultMap); + /** * 初始化非直连扫码支付数据,非直连扫码支付初始化方法规则 - * 1:根据(商户编号 + 商户订单号)确定订单是否存在 - * 1.1:如果订单不存在,创建支付订单 - * 2:获取商户支付配置,跳转到支付网关,选择支付方式 - * @param payKey 商户支付KEY - * @param productName 产品名称 - * @param orderNo 商户订单号 - * @param orderDate 下单日期 - * @param orderTime 下单时间 - * @param orderPrice 订单金额(元) - * @param orderIp 下单IP - * @param orderPeriod 订单有效期(分钟) - * @param returnUrl 支付结果页面通知地址 - * @param notifyUrl 支付结果后台通知地址 - * @param remark 支付备注 - * @param field1 扩展字段1 - * @param field2 扩展字段2 - * @param field3 扩展字段3 - * @param field4 扩展字段4 - * @param field5 扩展字段5 + * 1:根据(商户编号 + 商户订单号)确定订单是否存在 + * 1.1:如果订单不存在,创建支付订单 + * 2:获取商户支付配置,跳转到支付网关,选择支付方式 + * @param rpUserPayConfig + * @param scanPayRequestBo + * @return */ - public RpPayGateWayPageShowVo initNonDirectScanPay(String payKey, String productName, String orderNo, Date orderDate, Date orderTime, BigDecimal orderPrice, String orderIp, Integer orderPeriod, String returnUrl - , String notifyUrl, String remark, String field1, String field2, String field3, String field4, String field5); - + public RpPayGateWayPageShowVo initNonDirectScanPay(RpUserPayConfig rpUserPayConfig , ScanPayRequestBo scanPayRequestBo); /** * 非直连扫码支付,选择支付方式后,去支付 + * * @param payKey * @param orderNo - * @param payWayCode + * @param payType + * @param numberOfStages + * @return + */ + public ScanPayResultVo toNonDirectScanPay(String payKey, String orderNo, String payType ,Integer numberOfStages); + + /** + * 处理交易记录 + * 如果交易记录是成功或者本地未支付,查询上游已支付,返回TRUE + * 如果上游支付结果为未支付,返回FALSE + * + * @param bankOrderNo 银行订单号 + * @return + */ + public boolean processingTradeRecord(String bankOrderNo); + + + /** 小程序支付 + * @return + */ + ProgramPayResultVo programPay(RpUserPayConfig rpUserPayConfig , ProgramPayRequestBo programPayRequestBo); + + /** + * 初始化鉴权 + * + * @param productName + * @param orderPrice + * @param orderIp + * @param paramVo + * @return + */ + AuthInitResultVo initDirectAuth(String productName, BigDecimal orderPrice, String orderIp, AuthParamVo paramVo, RpUserPayConfig userPayConfig); + + /** + * 初始化小程序鉴权 + * + * @param productName + * @param orderPrice + * @param orderIp + * @param paramVo + * @return + */ + AuthProgramInitResultVo initProgramDirectAuth(String productName, BigDecimal orderPrice, String orderIp, AuthProgramInitParamVo paramVo, RpUserPayConfig userPayConfig); + + /** + * 用户鉴权 + * + * @param merchantNo + * @param orderNo * @return */ - public ScanPayResultVo toNonDirectScanPay(String payKey , String orderNo , String payWayCode); + AuthResultVo userAuth(String merchantNo, String orderNo); } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/RpTradePaymentQueryService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/RpTradePaymentQueryService.java index ccebee1d819aa2ceebc97a6e4789ab11957efb3c..9e64e364815677d1bf798f862c031eb8f6d33f26 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/RpTradePaymentQueryService.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/RpTradePaymentQueryService.java @@ -15,9 +15,6 @@ */ package com.roncoo.pay.trade.service; -import java.util.List; -import java.util.Map; - import com.roncoo.pay.common.core.page.PageBean; import com.roncoo.pay.common.core.page.PageParam; import com.roncoo.pay.trade.entity.RpTradePaymentOrder; @@ -25,6 +22,9 @@ import com.roncoo.pay.trade.entity.RpTradePaymentRecord; import com.roncoo.pay.trade.vo.OrderPayResultVo; import com.roncoo.pay.trade.vo.PaymentOrderQueryParam; +import java.util.List; +import java.util.Map; + /** * 功能说明:交易模块查询接口 * @author Peter @@ -76,7 +76,7 @@ public interface RpTradePaymentQueryService { * @param paymentOrderQueryParam * @return */ - public PageBean listPaymentOrderPage(PageParam pageParam ,PaymentOrderQueryParam paymentOrderQueryParam); + public PageBean listPaymentOrderPage(PageParam pageParam, PaymentOrderQueryParam paymentOrderQueryParam); /** * 分页查询支付记录 @@ -84,6 +84,22 @@ public interface RpTradePaymentQueryService { * @param paymentOrderQueryParam * @return */ - public PageBean listPaymentRecordPage(PageParam pageParam ,PaymentOrderQueryParam paymentOrderQueryParam); + public PageBean listPaymentRecordPage(PageParam pageParam, PaymentOrderQueryParam paymentOrderQueryParam); + + /** + * 获取交易流水报表 + * + * @param merchantNo + * @return + */ + public List> getPaymentReport(String merchantNo); + + /** + * 获取交易方式报表 + * + * @param merchantNo + * @return + */ + public List> getPayWayReport(String merchantNo); } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/RpUserBankAuthService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/RpUserBankAuthService.java new file mode 100644 index 0000000000000000000000000000000000000000..471aea9c693dc6f320adb1d6fffd35b7c8e8f642 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/RpUserBankAuthService.java @@ -0,0 +1,11 @@ +package com.roncoo.pay.trade.service; + +import com.roncoo.pay.trade.entity.RpUserBankAuth; + +public interface RpUserBankAuthService { + + RpUserBankAuth findByMerchantNoAndPayOrderNo(String merchantNo, String payOrderNo); + + void updateByKey(RpUserBankAuth userBankAuth); + +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpMicroSubmitRecordServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpMicroSubmitRecordServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..0a8e5a0b77115a989981fce76d98f5123b962349 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpMicroSubmitRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.roncoo.pay.trade.service.impl; + +import com.roncoo.pay.banklink.utils.weixin.WeiXinMicroUtils; +import com.roncoo.pay.banklink.utils.weixin.WxCityNo; +import com.roncoo.pay.common.core.enums.PublicEnum; +import com.roncoo.pay.common.core.page.PageBean; +import com.roncoo.pay.common.core.page.PageParam; +import com.roncoo.pay.common.core.utils.StringUtil; +import com.roncoo.pay.trade.dao.RpMicroSubmitRecordDao; +import com.roncoo.pay.trade.dao.RpTradePaymentRecordDao; +import com.roncoo.pay.trade.entity.RpMicroSubmitRecord; +import com.roncoo.pay.trade.service.RpMicroSubmitRecordService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 系统配置service实现 + * + * @author Quanf + */ +@Service("rpMicroSubmitRecordService") +public class RpMicroSubmitRecordServiceImpl implements RpMicroSubmitRecordService { + + @Autowired + private RpMicroSubmitRecordDao rpMicroSubmitRecordDao; + + @Autowired + private RpTradePaymentRecordDao rpTradePaymentRecordDao; + + private static final Logger LOG = LoggerFactory.getLogger(RpMicroSubmitRecordServiceImpl.class); + + @Override + public PageBean listPage(PageParam pageParam, RpMicroSubmitRecord rpMicroSubmitRecord) { + Map paramMap = new HashMap<>(); + paramMap.put("storeName", rpMicroSubmitRecord.getStoreName()); + paramMap.put("businessCode", rpMicroSubmitRecord.getBusinessCode()); + paramMap.put("dCardName", rpMicroSubmitRecord.getIdCardName()); + return rpMicroSubmitRecordDao.listPage(pageParam, paramMap); + } + + @Override + public void saveData(RpMicroSubmitRecord rpMicroSubmitRecord) { + rpMicroSubmitRecord.setEditTime(new Date()); + if (StringUtil.isEmpty(rpMicroSubmitRecord.getStatus())) { + rpMicroSubmitRecord.setStatus(PublicEnum.YES.name()); + } + rpMicroSubmitRecordDao.insert(rpMicroSubmitRecord); + } + + @Override + public Map microSubmit(RpMicroSubmitRecord rpMicroSubmitRecord) { + rpMicroSubmitRecord.setBusinessCode(StringUtil.get32UUID()); + rpMicroSubmitRecord.setIdCardValidTime("[\"" + rpMicroSubmitRecord.getIdCardValidTimeBegin() + "\",\"" + rpMicroSubmitRecord.getIdCardValidTimeEnd() + "\"]"); + Map returnMap = WeiXinMicroUtils.microSubmit(rpMicroSubmitRecord); + rpMicroSubmitRecord.setStoreStreet(WxCityNo.getCityNameByNo(rpMicroSubmitRecord.getStoreAddressCode()) + ":" + rpMicroSubmitRecord.getStoreStreet()); + if ("SUCCESS".equals(returnMap.get("result_code"))) { + saveData(rpMicroSubmitRecord); + } + return returnMap; + } + + @Override + public Map microQuery(String businessCode) { + Map returnMap = WeiXinMicroUtils.microQuery(businessCode); + Map paramMap = new HashMap<>(); + paramMap.put("businessCode", businessCode); + RpMicroSubmitRecord rpMicroSubmitRecord = rpMicroSubmitRecordDao.getBy(paramMap); + if (StringUtil.isNotNull(returnMap.get("sub_mch_id")) && StringUtil.isEmpty(rpMicroSubmitRecord.getSubMchId())) { + rpMicroSubmitRecord.setSubMchId(String.valueOf(returnMap.get("sub_mch_id"))); + rpMicroSubmitRecordDao.update(rpMicroSubmitRecord); + } + return returnMap; + } + +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpTradePaymentManagerServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpTradePaymentManagerServiceImpl.java index 6862007f5216f64d35bd226f6af455b41da202da..ad45012cdbf4588cb3e6936cf0ccef48dae4efa6 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpTradePaymentManagerServiceImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpTradePaymentManagerServiceImpl.java @@ -15,18 +15,31 @@ */ package com.roncoo.pay.trade.service.impl; +import com.alibaba.fastjson.JSON; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.internal.util.AlipaySignature; +import com.alipay.api.request.AlipayTradePagePayRequest; import com.roncoo.pay.account.service.RpAccountTransactionService; import com.roncoo.pay.common.core.enums.PayTypeEnum; import com.roncoo.pay.common.core.enums.PayWayEnum; +import com.roncoo.pay.common.core.enums.PublicEnum; import com.roncoo.pay.common.core.utils.DateUtils; import com.roncoo.pay.common.core.utils.StringUtil; import com.roncoo.pay.notify.service.RpNotifyService; +import com.roncoo.pay.trade.bo.F2FPayRequestBo; +import com.roncoo.pay.trade.bo.ProgramPayRequestBo; +import com.roncoo.pay.trade.bo.ScanPayRequestBo; import com.roncoo.pay.trade.dao.RpTradePaymentOrderDao; import com.roncoo.pay.trade.dao.RpTradePaymentRecordDao; +import com.roncoo.pay.trade.dao.RpUserBankAuthDao; import com.roncoo.pay.trade.entity.RoncooPayGoodsDetails; import com.roncoo.pay.trade.entity.RpTradePaymentOrder; import com.roncoo.pay.trade.entity.RpTradePaymentRecord; +import com.roncoo.pay.trade.entity.RpUserBankAuth; import com.roncoo.pay.trade.entity.weixinpay.WeiXinPrePay; +import com.roncoo.pay.trade.enums.AuthStatusEnum; import com.roncoo.pay.trade.enums.OrderFromEnum; import com.roncoo.pay.trade.enums.TradeStatusEnum; import com.roncoo.pay.trade.enums.TrxTypeEnum; @@ -38,22 +51,19 @@ import com.roncoo.pay.trade.service.RpTradePaymentManagerService; import com.roncoo.pay.trade.utils.MerchantApiUtil; import com.roncoo.pay.trade.utils.WeiXinPayUtils; import com.roncoo.pay.trade.utils.WeixinConfigUtil; +import com.roncoo.pay.trade.utils.alipay.AliPayUtil; import com.roncoo.pay.trade.utils.alipay.config.AlipayConfigUtil; -import com.roncoo.pay.trade.utils.alipay.f2fpay.AliF2FPaySubmit; -import com.roncoo.pay.trade.utils.alipay.util.AlipayNotify; -import com.roncoo.pay.trade.utils.alipay.util.AlipaySubmit; -import com.roncoo.pay.trade.vo.F2FPayResultVo; -import com.roncoo.pay.trade.vo.OrderPayResultVo; -import com.roncoo.pay.trade.vo.RpPayGateWayPageShowVo; -import com.roncoo.pay.trade.vo.ScanPayResultVo; +import com.roncoo.pay.trade.utils.auth.AuthUtil; +import com.roncoo.pay.trade.utils.weixin.WeiXinPayUtil; +import com.roncoo.pay.trade.vo.*; import com.roncoo.pay.user.entity.RpPayWay; import com.roncoo.pay.user.entity.RpUserInfo; import com.roncoo.pay.user.entity.RpUserPayConfig; import com.roncoo.pay.user.entity.RpUserPayInfo; import com.roncoo.pay.user.enums.FundInfoTypeEnum; +import com.roncoo.pay.user.exception.PayBizException; import com.roncoo.pay.user.exception.UserBizException; import com.roncoo.pay.user.service.*; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -61,15 +71,12 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 功能说明:交易模块管理实现类实现 - * @author Peter - * 龙果学院(www.roncoo.com) + * + * @author Peter 龙果学院(www.roncoo.com) */ @Service("rpTradePaymentManagerService") public class RpTradePaymentManagerServiceImpl implements RpTradePaymentManagerService { @@ -78,268 +85,222 @@ public class RpTradePaymentManagerServiceImpl implements RpTradePaymentManagerSe @Autowired private RpTradePaymentOrderDao rpTradePaymentOrderDao; - @Autowired private RpTradePaymentRecordDao rpTradePaymentRecordDao; - @Autowired private RpUserInfoService rpUserInfoService; - @Autowired private RpUserPayInfoService rpUserPayInfoService; - @Autowired private RpUserPayConfigService rpUserPayConfigService; - @Autowired private RpPayWayService rpPayWayService; - @Autowired private BuildNoService buildNoService; - @Autowired private RpNotifyService rpNotifyService; - @Autowired private RpAccountTransactionService rpAccountTransactionService; - @Autowired - private AliF2FPaySubmit aliF2FPaySubmit; + private RpUserBankAuthDao userBankAuthDao; /** * 初始化直连扫码支付数据,直连扫码支付初始化方法规则 * 1:根据(商户编号 + 商户订单号)确定订单是否存在 - * 1.1:如果订单存在,抛异常,提示订单已存在 - * 1.2:如果订单不存在,创建支付订单 + * 1.1:如果订单不存在,创建支付订单 * 2:创建支付记录 * 3:根据相应渠道方法 * 4:调转到相应支付渠道扫码界面 - * - * @param payKey 商户支付KEY - * @param productName 产品名称 - * @param orderNo 商户订单号 - * @param orderDate 下单日期 - * @param orderTime 下单时间 - * @param orderPrice 订单金额(元) - * @param payWayCode 支付方式编码 - * @param orderIp 下单IP - * @param orderPeriod 订单有效期(分钟) - * @param returnUrl 支付结果页面通知地址 - * @param notifyUrl 支付结果后台通知地址 - * @param remark 支付备注 - * @param field1 扩展字段1 - * @param field2 扩展字段2 - * @param field3 扩展字段3 - * @param field4 扩展字段4 - * @param field5 扩展字段5 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public ScanPayResultVo initDirectScanPay(String payKey, String productName, String orderNo, Date orderDate, Date orderTime, BigDecimal orderPrice, String payWayCode, String orderIp, Integer orderPeriod, String returnUrl, String notifyUrl, String remark, String field1, String field2, String field3, String field4, String field5) { + **/ - RpUserPayConfig rpUserPayConfig = rpUserPayConfigService.getByPayKey(payKey); - if (rpUserPayConfig == null){ - throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR,"用户支付配置有误"); - } - - //根据支付产品及支付方式获取费率 + @Override + public ScanPayResultVo initDirectScanPay(RpUserPayConfig rpUserPayConfig, ScanPayRequestBo scanPayRequestBo) { + // 根据支付产品及支付方式获取费率 RpPayWay payWay = null; - PayTypeEnum payType = null; - if (PayWayEnum.WEIXIN.name().equals(payWayCode)){ - payWay = rpPayWayService.getByPayWayTypeCode(rpUserPayConfig.getProductCode(), payWayCode, PayTypeEnum.SCANPAY.name()); - payType = PayTypeEnum.SCANPAY; - }else if (PayWayEnum.ALIPAY.name().equals(payWayCode)){ - payWay = rpPayWayService.getByPayWayTypeCode(rpUserPayConfig.getProductCode(), payWayCode, PayTypeEnum.DIRECT_PAY.name()); - payType = PayTypeEnum.DIRECT_PAY; + PayTypeEnum payType = PayTypeEnum.getEnum(scanPayRequestBo.getPayType()); + if (payType == null){ + LOG.info("支付类型有误"); + throw new PayBizException(PayBizException.REQUEST_PARAM_ERR ,"支付类型有误"); } - if(payWay == null){ - throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR,"用户支付配置有误"); + if (!PayTypeEnum.SCANPAY.name().equals(scanPayRequestBo.getPayType()) && !PayTypeEnum.DIRECT_PAY.name().equals(scanPayRequestBo.getPayType()) && !PayTypeEnum.HUA_BEI_FEN_QI_PAY.name().equals(scanPayRequestBo.getPayType())){ + LOG.info("支付类型非用户主扫交易"); + throw new PayBizException(PayBizException.REQUEST_PARAM_ERR ,"不支持改支付类型"); } - String merchantNo = rpUserPayConfig.getUserNo();//商户编号 + String payWayCode = payType.getWay(); + payWay = rpPayWayService.getByPayWayTypeCode(rpUserPayConfig.getProductCode(), payWayCode, payType.name()); + + if (payWay == null) { + LOG.info("支付配置有误,未配置支付方式{}" , payType.name()); + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "用户支付配置有误"); + } + String merchantNo = rpUserPayConfig.getUserNo();// 商户编号 RpUserInfo rpUserInfo = rpUserInfoService.getDataByMerchentNo(merchantNo); - if (rpUserInfo == null){ - throw new UserBizException(UserBizException.USER_IS_NULL,"用户不存在"); + if (rpUserInfo == null) { + throw new UserBizException(UserBizException.USER_IS_NULL, "用户不存在"); } - RpTradePaymentOrder rpTradePaymentOrder = rpTradePaymentOrderDao.selectByMerchantNoAndMerchantOrderNo(merchantNo, orderNo); - if (rpTradePaymentOrder == null){ - rpTradePaymentOrder = sealRpTradePaymentOrder( merchantNo, rpUserInfo.getUserName() , productName, orderNo, orderDate, orderTime, orderPrice, payWayCode, PayWayEnum.getEnum(payWayCode).getDesc() , payType, rpUserPayConfig.getFundIntoType() , orderIp, orderPeriod, returnUrl, notifyUrl, remark, field1, field2, field3, field4, field5); + RpTradePaymentOrder rpTradePaymentOrder = rpTradePaymentOrderDao.selectByMerchantNoAndMerchantOrderNo(merchantNo, scanPayRequestBo.getOrderNo()); + if (rpTradePaymentOrder == null) { + rpTradePaymentOrder = sealScanPayRpTradePaymentOrder( rpUserPayConfig , scanPayRequestBo , rpUserInfo); rpTradePaymentOrderDao.insert(rpTradePaymentOrder); - }else{ - - if (TradeStatusEnum.SUCCESS.name().equals(rpTradePaymentOrder.getStatus())){ - throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR,"订单已支付成功,无需重复支付"); + } else { + if (TradeStatusEnum.SUCCESS.name().equals(rpTradePaymentOrder.getStatus())) { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "订单已支付成功,无需重复支付"); } - - if (rpTradePaymentOrder.getOrderAmount().compareTo(orderPrice) != 0 ){ - rpTradePaymentOrder.setOrderAmount(orderPrice);//如果金额不一致,修改金额为最新的金额 + if (rpTradePaymentOrder.getOrderAmount().compareTo(scanPayRequestBo.getOrderPrice()) != 0) { + rpTradePaymentOrder.setOrderAmount(scanPayRequestBo.getOrderPrice());// 如果金额不一致,修改金额为最新的金额 } } - return getScanPayResultVo(rpTradePaymentOrder , payWay); - + return getScanPayResultVo(rpTradePaymentOrder, payWay , scanPayRequestBo.getNumberOfStages()); } /** * 条码支付,对应的是支付宝的条码支付或者微信的刷卡支付 - * - * @param payKey 商户支付key - * @param authCode 支付授权码 - * @param productName 产品名称 - * @param orderNo 商户订单号 - * @param orderDate 下单日期 - * @param orderTime 下单时间 - * @param orderPrice 订单金额(元) - * @param payWayCode 支付方式 - * @param orderIp 下单IP - * @param remark 支付备注 - * @param field1 扩展字段1 - * @param field2 扩展字段2 - * @param field3 扩展字段3 - * @param field4 扩展字段4 - * @param field5 扩展字段5 - * @return */ @Override - public F2FPayResultVo f2fPay(String payKey, String authCode, String productName, String orderNo, Date orderDate, Date orderTime, BigDecimal orderPrice, String payWayCode, String orderIp, String remark, String field1, String field2, String field3, String field4, String field5) { + public F2FPayResultVo f2fPay(RpUserPayConfig rpUserPayConfig, F2FPayRequestBo f2FPayRequestBo) { - RpUserPayConfig rpUserPayConfig = rpUserPayConfigService.getByPayKey(payKey); - if (rpUserPayConfig == null){ - throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR,"用户支付配置有误"); - } + // 根据支付产品及支付方式获取费率 + PayTypeEnum payType = PayTypeEnum.getEnum(f2FPayRequestBo.getPayType()); - if (StringUtil.isEmpty(authCode)){ - throw new TradeBizException(TradeBizException.TRADE_PARAM_ERROR,"支付授权码不能为空"); + if (payType == null){ + LOG.info("交易类型错误"); + throw new PayBizException(PayBizException.REQUEST_PARAM_ERR,"请求参数异常"); } - //根据支付产品及支付方式获取费率 - RpPayWay payWay = null; - PayTypeEnum payType = null; - if (PayWayEnum.WEIXIN.name().equals(payWayCode)){ -// payWay = rpPayWayService.getByPayWayTypeCode(rpUserPayConfig.getProductCode(), payWayCode, PayTypeEnum.SCANPAY.name()); - payType = PayTypeEnum.SCANPAY;//TODO 具体需要根据接口修改 - }else if (PayWayEnum.ALIPAY.name().equals(payWayCode)){ - payWay = rpPayWayService.getByPayWayTypeCode(rpUserPayConfig.getProductCode(), payWayCode, PayTypeEnum.F2F_PAY.name()); - payType = PayTypeEnum.F2F_PAY; + + if (!PayTypeEnum.F2F_PAY.name().equals(payType.name()) && !PayTypeEnum.MICRO_PAY.name().equals(payType.name())){ + LOG.info("交易类型错误"); + throw new PayBizException(PayBizException.REQUEST_PARAM_ERR,"交易类型有误,不支持该交易"); } - if(payWay == null){ - throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR,"用户支付配置有误"); + PayWayEnum payWayEnum = PayWayEnum.getEnum(payType.getWay()); + String payWayCode = payWayEnum.name(); + + RpPayWay payWay = rpPayWayService.getByPayWayTypeCode(rpUserPayConfig.getProductCode(), payWayCode, payType.name()); + + if (payWay == null) { + LOG.info("用户支付配置有误"); + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "用户支付配置有误"); } - String merchantNo = rpUserPayConfig.getUserNo();//商户编号 + String merchantNo = rpUserPayConfig.getUserNo();// 商户编号 RpUserInfo rpUserInfo = rpUserInfoService.getDataByMerchentNo(merchantNo); - if (rpUserInfo == null){ - throw new UserBizException(UserBizException.USER_IS_NULL,"用户不存在"); + if (rpUserInfo == null) { + throw new UserBizException(UserBizException.USER_IS_NULL, "用户不存在"); } - RpTradePaymentOrder rpTradePaymentOrder = rpTradePaymentOrderDao.selectByMerchantNoAndMerchantOrderNo(merchantNo, orderNo); - if (rpTradePaymentOrder == null){ - rpTradePaymentOrder = sealRpTradePaymentOrder( merchantNo, rpUserInfo.getUserName() , productName, orderNo, orderDate, orderTime, orderPrice, payWayCode, PayWayEnum.getEnum(payWayCode).getDesc() , payType, rpUserPayConfig.getFundIntoType() , orderIp, 5, "f2fPay", "f2fPay", remark, field1, field2, field3, field4, field5); + //根据商户号和订单号去查询订单是否存在 + RpTradePaymentOrder rpTradePaymentOrder = rpTradePaymentOrderDao.selectByMerchantNoAndMerchantOrderNo(merchantNo, f2FPayRequestBo.getOrderNo()); + if (rpTradePaymentOrder == null) { + //订单不存在,创建订单 + rpTradePaymentOrder = sealF2FRpTradePaymentOrder( rpUserPayConfig , f2FPayRequestBo , rpUserInfo , payWay); rpTradePaymentOrderDao.insert(rpTradePaymentOrder); - }else{ - if (rpTradePaymentOrder.getOrderAmount().compareTo(orderPrice) != 0 ){ - throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR,"错误的订单"); + } else { + //订单已存在,订单金额与传入金额不相等 + if (rpTradePaymentOrder.getOrderAmount().compareTo(f2FPayRequestBo.getOrderPrice()) != 0) { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "错误的订单"); } - - if (TradeStatusEnum.SUCCESS.name().equals(rpTradePaymentOrder.getStatus())){ - throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR,"订单已支付成功,无需重复支付"); + //订单已存在,且订单状态为支付成功 + if (TradeStatusEnum.SUCCESS.name().equals(rpTradePaymentOrder.getStatus())) { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "订单已支付成功,无需重复支付"); } } - return getF2FPayResultVo( rpTradePaymentOrder , payWay , payKey , rpUserPayConfig.getPaySecret() , authCode ,null); + return getF2FPayResultVo(rpTradePaymentOrder, payWay, f2FPayRequestBo.getPayKey(), rpUserPayConfig.getPaySecret(), f2FPayRequestBo.getAuthCode(), null); } /** * 通过支付订单及商户费率生成支付记录 - * @param rpTradePaymentOrder 支付订单 - * @param payWay 商户支付配置 + * + * @param rpTradePaymentOrder 支付订单 + * @param payWay 商户支付配置 * @return */ - private F2FPayResultVo getF2FPayResultVo(RpTradePaymentOrder rpTradePaymentOrder ,RpPayWay payWay , String payKey , String merchantPaySecret , String authCode ,List< RoncooPayGoodsDetails > roncooPayGoodsDetailses){ + private F2FPayResultVo getF2FPayResultVo(RpTradePaymentOrder rpTradePaymentOrder, RpPayWay payWay, String payKey, String merchantPaySecret, String authCode, List roncooPayGoodsDetailses) { F2FPayResultVo f2FPayResultVo = new F2FPayResultVo(); - String payWayCode = payWay.getPayWayCode();//支付方式 + String payWayCode = payWay.getPayWayCode();// 支付方式 PayTypeEnum payType = null; - if (PayWayEnum.WEIXIN.name().equals(payWay.getPayWayCode())){ - payType = PayTypeEnum.SCANPAY;//TODO 微信条码支付需要修改成对应的枚举 支付类型 - }else if(PayWayEnum.ALIPAY.name().equals(payWay.getPayWayCode())){ + if (PayWayEnum.WEIXIN.name().equals(payWay.getPayWayCode())) { + payType = PayTypeEnum.MICRO_PAY; + } else if (PayWayEnum.ALIPAY.name().equals(payWay.getPayWayCode())) { payType = PayTypeEnum.F2F_PAY; } - rpTradePaymentOrder.setPayTypeCode(payType.name());//支付类型 - rpTradePaymentOrder.setPayTypeName(payType.getDesc());//支付方式 + rpTradePaymentOrder.setPayTypeCode(payType.name());// 支付类型 + rpTradePaymentOrder.setPayTypeName(payType.getDesc());// 支付方式 + rpTradePaymentOrder.setPayWayCode(payWay.getPayWayCode());//支付通道编号 + rpTradePaymentOrder.setPayWayName(payWay.getPayWayName());//支付通道名称 - rpTradePaymentOrder.setPayWayCode(payWay.getPayWayCode()); - rpTradePaymentOrder.setPayWayName(payWay.getPayWayName()); - - RpTradePaymentRecord rpTradePaymentRecord = sealRpTradePaymentRecord(rpTradePaymentOrder.getMerchantNo(), rpTradePaymentOrder.getMerchantName() , rpTradePaymentOrder.getProductName(), rpTradePaymentOrder.getMerchantOrderNo(), rpTradePaymentOrder.getOrderAmount(), payWay.getPayWayCode(), payWay.getPayWayName() , payType, rpTradePaymentOrder.getFundIntoType() , BigDecimal.valueOf(payWay.getPayRate()) , rpTradePaymentOrder.getOrderIp(), rpTradePaymentOrder.getReturnUrl(), rpTradePaymentOrder.getNotifyUrl(), rpTradePaymentOrder.getRemark(), rpTradePaymentOrder.getField1(), rpTradePaymentOrder.getField2(), rpTradePaymentOrder.getField3(), rpTradePaymentOrder.getField4(), rpTradePaymentOrder.getField5()); + //生成支付流水 + RpTradePaymentRecord rpTradePaymentRecord = sealRpTradePaymentRecord(rpTradePaymentOrder.getMerchantNo(), rpTradePaymentOrder.getMerchantName(), rpTradePaymentOrder.getProductName(), rpTradePaymentOrder.getMerchantOrderNo(), rpTradePaymentOrder.getOrderAmount(), payWay.getPayWayCode(), payWay.getPayWayName(), payType, rpTradePaymentOrder.getFundIntoType(), BigDecimal.valueOf(payWay.getPayRate()), rpTradePaymentOrder.getOrderIp(), rpTradePaymentOrder.getReturnUrl(), rpTradePaymentOrder.getNotifyUrl(), rpTradePaymentOrder.getRemark(), rpTradePaymentOrder.getField1(), rpTradePaymentOrder.getField2(), rpTradePaymentOrder.getField3(), rpTradePaymentOrder.getField4(), rpTradePaymentOrder.getField5()); rpTradePaymentRecordDao.insert(rpTradePaymentRecord); - if (PayWayEnum.WEIXIN.name().equals(payWayCode)){//微信支付 - throw new TradeBizException(TradeBizException.TRADE_PAY_WAY_ERROR,"暂未开通微信刷卡支付"); - }else { - if (PayWayEnum.ALIPAY.name().equals(payWayCode)) {//支付宝支付 - - RpUserPayInfo rpUserPayInfo = rpUserPayInfoService.getByUserNo(rpTradePaymentOrder.getMerchantNo(),payWayCode); - if (rpUserPayInfo == null){ - throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR,"商户支付配置有误"); - } - - aliF2FPaySubmit.initConfigs(rpTradePaymentOrder.getFundIntoType(), rpUserPayInfo.getOfflineAppId(), rpUserPayInfo.getAppId(), rpUserPayInfo.getRsaPrivateKey(), rpUserPayInfo.getRsaPublicKey()); - Map aliPayReturnMsg = aliF2FPaySubmit.f2fPay(rpTradePaymentRecord.getBankOrderNo(), rpTradePaymentOrder.getProductName(), "", authCode, rpTradePaymentRecord.getOrderAmount(), roncooPayGoodsDetailses); - - if(TradeStatusEnum.SUCCESS.name().equals(aliPayReturnMsg.get("status"))){//支付成功 - completeSuccessOrder( rpTradePaymentRecord , aliPayReturnMsg.get("bankTrxNo") ,new Date() , aliPayReturnMsg.get("bankReturnMsg")); - }else if(TradeStatusEnum.FAILED.name().equals(aliPayReturnMsg.get("status"))){//支付失败 - completeFailOrder(rpTradePaymentRecord , aliPayReturnMsg.get("bankReturnMsg")); - }else{ - //TODO 未知支付结果,需要在后续添加订单结果轮询功能后处理 + if (PayWayEnum.WEIXIN.name().equals(payWayCode)) {// 微信支付 + RpUserPayInfo rpUserPayInfo = rpUserPayInfoService.getByUserNo(rpTradePaymentOrder.getMerchantNo(), payWayCode); + if (rpUserPayInfo == null) { + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "商户支付配置有误"); + } + Map wxResultMap = WeiXinPayUtil.micropay(rpTradePaymentRecord.getBankOrderNo(), rpTradePaymentOrder.getProductName(), rpTradePaymentRecord.getOrderAmount(), rpTradePaymentRecord.getOrderIp(), authCode); + if (wxResultMap == null || wxResultMap.isEmpty()) { + //返回结果为空,支付结果未知需要轮询 + rpNotifyService.orderSend(rpTradePaymentRecord.getBankOrderNo()); + } else { + if ("YES".equals(wxResultMap.get("verify"))) { + //验签成功 + if ("SUCCESS".equals(wxResultMap.get("return_code")) && "SUCCESS".equals(wxResultMap.get("result_code"))) { + //通讯成功且业务结果为成功 + completeSuccessOrder(rpTradePaymentRecord, String.valueOf(wxResultMap.get("transaction_id")), new Date(), "支付成功"); + } else if ("SUCCESS".equals(wxResultMap.get("return_code")) && !StringUtil.isEmpty(wxResultMap.get("err_code")) && !"BANKERROR".equals(wxResultMap.get("err_code")) && !"USERPAYING".equals(wxResultMap.get("err_code")) && !"SYSTEMERROR".equals(wxResultMap.get("err_code"))) { + //支付失败 + completeFailOrder(rpTradePaymentRecord, String.valueOf(wxResultMap.get("err_code_des"))); + } else { + //返回结果未知,需要轮询 + rpNotifyService.orderSend(rpTradePaymentRecord.getBankOrderNo()); + } + } else { + completeFailOrder(rpTradePaymentRecord, "签名校验失败!"); + //验签失败 } + } - } else { - throw new TradeBizException(TradeBizException.TRADE_PAY_WAY_ERROR, "错误的支付方式"); + } else if (PayWayEnum.ALIPAY.name().equals(payWayCode)) {// 支付宝支付 + RpUserPayInfo rpUserPayInfo = rpUserPayInfoService.getByUserNo(rpTradePaymentOrder.getMerchantNo(), payWayCode); + if (rpUserPayInfo == null) { + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "商户支付配置有误"); } + Map resultMap = AliPayUtil.tradePay(rpTradePaymentRecord.getBankOrderNo(), authCode, rpTradePaymentOrder.getProductName(), rpTradePaymentRecord.getOrderAmount(), "", roncooPayGoodsDetailses); + //支付条码支付--统一根据订单轮询去确认支付结果 + rpNotifyService.orderSend(rpTradePaymentRecord.getBankOrderNo()); + } else { + throw new TradeBizException(TradeBizException.TRADE_PAY_WAY_ERROR, "错误的支付方式"); } - Map paramMap = new HashMap(); - f2FPayResultVo.setStatus(rpTradePaymentRecord.getStatus());//支付结果 - paramMap.put("status",rpTradePaymentRecord.getStatus()); - - f2FPayResultVo.setField1(rpTradePaymentRecord.getField1());//扩展字段1 - paramMap.put("field1",rpTradePaymentRecord.getField1()); - - f2FPayResultVo.setField2(rpTradePaymentRecord.getField2());//扩展字段2 - paramMap.put("field2",rpTradePaymentRecord.getField2()); + Map paramMap = new HashMap(); + f2FPayResultVo.setStatus(rpTradePaymentRecord.getStatus());// 支付结果 + paramMap.put("status", rpTradePaymentRecord.getStatus()); - f2FPayResultVo.setField3(rpTradePaymentRecord.getField3());//扩展字段3 - paramMap.put("field3",rpTradePaymentRecord.getField3()); + f2FPayResultVo.setOrderIp(rpTradePaymentRecord.getOrderIp());// 下单ip + paramMap.put("orderIp", rpTradePaymentRecord.getOrderIp()); - f2FPayResultVo.setField4(rpTradePaymentRecord.getField4());//扩展字段4 - paramMap.put("field4",rpTradePaymentRecord.getField4()); + f2FPayResultVo.setOrderNo(rpTradePaymentRecord.getMerchantOrderNo());// 商户订单号 + paramMap.put("merchantOrderNo", rpTradePaymentRecord.getMerchantOrderNo()); - f2FPayResultVo.setField5(rpTradePaymentRecord.getField5());//扩展字段5 - paramMap.put("field5",rpTradePaymentRecord.getField5()); + f2FPayResultVo.setPayKey(payKey);// 支付号 + paramMap.put("payKey", payKey); - f2FPayResultVo.setOrderIp(rpTradePaymentRecord.getOrderIp());//下单ip - paramMap.put("orderIp",rpTradePaymentRecord.getOrderIp()); + f2FPayResultVo.setProductName(rpTradePaymentRecord.getProductName());// 产品名称 + paramMap.put("productName", rpTradePaymentRecord.getProductName()); - f2FPayResultVo.setOrderNo(rpTradePaymentRecord.getMerchantOrderNo());//商户订单号 - paramMap.put("merchantOrderNo",rpTradePaymentRecord.getMerchantOrderNo()); + f2FPayResultVo.setRemark(rpTradePaymentRecord.getRemark());// 支付备注 + paramMap.put("remark", rpTradePaymentRecord.getRemark()); - f2FPayResultVo.setPayKey(payKey);//支付号 - paramMap.put("payKey",payKey); - - f2FPayResultVo.setProductName(rpTradePaymentRecord.getProductName());//产品名称 - paramMap.put("productName",rpTradePaymentRecord.getProductName()); - - f2FPayResultVo.setRemark(rpTradePaymentRecord.getRemark());//支付备注 - paramMap.put("remark",rpTradePaymentRecord.getRemark()); - - f2FPayResultVo.setTrxNo(rpTradePaymentRecord.getTrxNo());//交易流水号 + f2FPayResultVo.setTrxNo(rpTradePaymentRecord.getTrxNo());// 交易流水号 paramMap.put("trxNo", rpTradePaymentRecord.getTrxNo()); String sign = MerchantApiUtil.getSign(paramMap, merchantPaySecret); @@ -348,77 +309,71 @@ public class RpTradePaymentManagerServiceImpl implements RpTradePaymentManagerSe return f2FPayResultVo; } - - /** * 支付成功方法 + * * @param rpTradePaymentRecord */ - private void completeSuccessOrder(RpTradePaymentRecord rpTradePaymentRecord , String bankTrxNo ,Date timeEnd , String bankReturnMsg){ - - rpTradePaymentRecord.setPaySuccessTime(timeEnd); - rpTradePaymentRecord.setBankTrxNo(bankTrxNo);//设置银行流水号 - rpTradePaymentRecord.setBankReturnMsg(bankReturnMsg); - rpTradePaymentRecord.setStatus(TradeStatusEnum.SUCCESS.name()); - rpTradePaymentRecordDao.update(rpTradePaymentRecord); + @Transactional(rollbackFor = Exception.class) + void completeSuccessOrder(RpTradePaymentRecord rpTradePaymentRecord, String bankTrxNo, Date timeEnd, String bankReturnMsg) { + LOG.info("订单支付成功!"); + rpTradePaymentRecord.setPaySuccessTime(timeEnd); + rpTradePaymentRecord.setBankTrxNo(bankTrxNo);// 设置银行流水号 + rpTradePaymentRecord.setBankReturnMsg(bankReturnMsg); + rpTradePaymentRecord.setStatus(TradeStatusEnum.SUCCESS.name()); + rpTradePaymentRecordDao.update(rpTradePaymentRecord); - RpTradePaymentOrder rpTradePaymentOrder = rpTradePaymentOrderDao.selectByMerchantNoAndMerchantOrderNo(rpTradePaymentRecord.getMerchantNo(), rpTradePaymentRecord.getMerchantOrderNo()); - rpTradePaymentOrder.setStatus(TradeStatusEnum.SUCCESS.name()); - rpTradePaymentOrder.setTrxNo(rpTradePaymentRecord.getTrxNo());//设置支付平台支付流水号 - rpTradePaymentOrderDao.update(rpTradePaymentOrder); + RpTradePaymentOrder rpTradePaymentOrder = rpTradePaymentOrderDao.selectByMerchantNoAndMerchantOrderNo(rpTradePaymentRecord.getMerchantNo(), rpTradePaymentRecord.getMerchantOrderNo()); + rpTradePaymentOrder.setStatus(TradeStatusEnum.SUCCESS.name()); + rpTradePaymentOrder.setTrxNo(rpTradePaymentRecord.getTrxNo());// 设置支付平台支付流水号 + rpTradePaymentOrderDao.update(rpTradePaymentOrder); - if (FundInfoTypeEnum.PLAT_RECEIVES.name().equals(rpTradePaymentRecord.getFundIntoType())){ - rpAccountTransactionService.creditToAccount( rpTradePaymentRecord.getMerchantNo(), rpTradePaymentRecord.getOrderAmount().subtract(rpTradePaymentRecord.getPlatIncome()), rpTradePaymentRecord.getBankOrderNo(),rpTradePaymentRecord.getBankTrxNo(), rpTradePaymentRecord.getTrxType(), rpTradePaymentRecord.getRemark()); - } + if (FundInfoTypeEnum.PLAT_RECEIVES.name().equals(rpTradePaymentRecord.getFundIntoType())) { + rpAccountTransactionService.creditToAccount(rpTradePaymentRecord.getMerchantNo(), rpTradePaymentRecord.getOrderAmount().subtract(rpTradePaymentRecord.getPlatIncome()), rpTradePaymentRecord.getBankOrderNo(), rpTradePaymentRecord.getBankTrxNo(), rpTradePaymentRecord.getTrxType(), rpTradePaymentRecord.getRemark()); + } - if (PayTypeEnum.F2F_PAY.name().equals(rpTradePaymentOrder.getPayTypeCode())){//支付宝 条码支付实时返回支付结果,不需要商户通知 - return; - }else{ - String notifyUrl = getMerchantNotifyUrl(rpTradePaymentRecord , rpTradePaymentOrder , rpTradePaymentRecord.getNotifyUrl() ,TradeStatusEnum.SUCCESS ); - rpNotifyService.notifySend(notifyUrl, rpTradePaymentRecord.getMerchantOrderNo(), rpTradePaymentRecord.getMerchantNo()); - } + if (PayTypeEnum.F2F_PAY.name().equals(rpTradePaymentOrder.getPayTypeCode())) {// 支付宝 + // 条码支付实时返回支付结果,不需要商户通知(修改后,条码支付结果通过订单轮询去确认订单状态,成功后通知商户) + String notifyUrl = getMerchantNotifyUrl(rpTradePaymentRecord, rpTradePaymentOrder, rpTradePaymentRecord.getNotifyUrl(), TradeStatusEnum.SUCCESS); + rpNotifyService.notifySend(notifyUrl, rpTradePaymentRecord.getMerchantOrderNo(), rpTradePaymentRecord.getMerchantNo()); + //return; + } else { + String notifyUrl = getMerchantNotifyUrl(rpTradePaymentRecord, rpTradePaymentOrder, rpTradePaymentRecord.getNotifyUrl(), TradeStatusEnum.SUCCESS); + rpNotifyService.notifySend(notifyUrl, rpTradePaymentRecord.getMerchantOrderNo(), rpTradePaymentRecord.getMerchantNo()); + } } - - private String getMerchantNotifyUrl(RpTradePaymentRecord rpTradePaymentRecord ,RpTradePaymentOrder rpTradePaymentOrder ,String sourceUrl , TradeStatusEnum tradeStatusEnum){ + private String getMerchantNotifyUrl(RpTradePaymentRecord rpTradePaymentRecord, RpTradePaymentOrder rpTradePaymentOrder, String sourceUrl, TradeStatusEnum tradeStatusEnum) { RpUserPayConfig rpUserPayConfig = rpUserPayConfigService.getByUserNo(rpTradePaymentRecord.getMerchantNo()); - if (rpUserPayConfig == null){ - throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR,"用户支付配置有误"); + if (rpUserPayConfig == null) { + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "用户支付配置有误"); } - Map paramMap = new HashMap<>(); + Map paramMap = new HashMap<>(); String payKey = rpUserPayConfig.getPayKey();// 企业支付KEY - paramMap.put("payKey",payKey); + paramMap.put("payKey", payKey); String productName = rpTradePaymentRecord.getProductName(); // 商品名称 - paramMap.put("productName",productName); + paramMap.put("productName", productName); String orderNo = rpTradePaymentRecord.getMerchantOrderNo(); // 订单编号 - paramMap.put("orderNo",orderNo); - BigDecimal orderPrice = rpTradePaymentRecord.getOrderAmount(); // 订单金额 , 单位:元 - paramMap.put("orderPrice",orderPrice); - String payWayCode = rpTradePaymentRecord.getPayWayCode(); // 支付方式编码 支付宝: ALIPAY 微信:WEIXIN - paramMap.put("payWayCode",payWayCode); - paramMap.put("tradeStatus",tradeStatusEnum);//交易状态 - String orderDateStr = DateUtils.formatDate(rpTradePaymentOrder.getOrderDate(),"yyyyMMdd"); // 订单日期 - paramMap.put("orderDate",orderDateStr); + paramMap.put("orderNo", orderNo); + BigDecimal orderPrice = rpTradePaymentRecord.getOrderAmount(); // 订单金额 , + // 单位:元 + paramMap.put("orderPrice", orderPrice); + String payWayCode = rpTradePaymentRecord.getPayWayCode(); // 支付方式编码 支付宝: + // ALIPAY + // 微信:WEIXIN + paramMap.put("payWayCode", payWayCode); + paramMap.put("tradeStatus", tradeStatusEnum);// 交易状态 + String orderDateStr = DateUtils.formatDate(rpTradePaymentOrder.getOrderDate(), "yyyyMMdd"); // 订单日期 + paramMap.put("orderDate", orderDateStr); String orderTimeStr = DateUtils.formatDate(rpTradePaymentOrder.getOrderTime(), "yyyyMMddHHmmss"); // 订单时间 - paramMap.put("orderTime",orderTimeStr); + paramMap.put("orderTime", orderTimeStr); String remark = rpTradePaymentRecord.getRemark(); // 支付备注 - paramMap.put("remark",remark); - String trxNo = rpTradePaymentRecord.getTrxNo();//支付流水号 - paramMap.put("trxNo",trxNo); - - String field1 = rpTradePaymentOrder.getField1(); // 扩展字段1 - paramMap.put("field1",field1); - String field2 = rpTradePaymentOrder.getField2(); // 扩展字段2 - paramMap.put("field2",field2); - String field3 = rpTradePaymentOrder.getField3(); // 扩展字段3 - paramMap.put("field3",field3); - String field4 = rpTradePaymentOrder.getField4(); // 扩展字段4 - paramMap.put("field4",field4); - String field5 = rpTradePaymentOrder.getField5(); // 扩展字段5 - paramMap.put("field5",field5); + paramMap.put("remark", remark); + String trxNo = rpTradePaymentRecord.getTrxNo();// 支付流水号 + paramMap.put("trxNo", trxNo); String paramStr = MerchantApiUtil.getParamStr(paramMap); String sign = MerchantApiUtil.getSign(paramMap, rpUserPayConfig.getPaySecret()); @@ -427,12 +382,12 @@ public class RpTradePaymentManagerServiceImpl implements RpTradePaymentManagerSe return notifyUrl; } - /** * 支付失败方法 + * * @param rpTradePaymentRecord */ - private void completeFailOrder(RpTradePaymentRecord rpTradePaymentRecord , String bankReturnMsg){ + private void completeFailOrder(RpTradePaymentRecord rpTradePaymentRecord, String bankReturnMsg) { rpTradePaymentRecord.setBankReturnMsg(bankReturnMsg); rpTradePaymentRecord.setStatus(TradeStatusEnum.FAILED.name()); rpTradePaymentRecordDao.update(rpTradePaymentRecord); @@ -441,344 +396,373 @@ public class RpTradePaymentManagerServiceImpl implements RpTradePaymentManagerSe rpTradePaymentOrder.setStatus(TradeStatusEnum.FAILED.name()); rpTradePaymentOrderDao.update(rpTradePaymentOrder); - String notifyUrl = getMerchantNotifyUrl(rpTradePaymentRecord , rpTradePaymentOrder , rpTradePaymentRecord.getNotifyUrl() ,TradeStatusEnum.FAILED ); + String notifyUrl = getMerchantNotifyUrl(rpTradePaymentRecord, rpTradePaymentOrder, rpTradePaymentRecord.getNotifyUrl(), TradeStatusEnum.FAILED); rpNotifyService.notifySend(notifyUrl, rpTradePaymentRecord.getMerchantOrderNo(), rpTradePaymentRecord.getMerchantNo()); } + /** * 初始化非直连扫码支付数据,非直连扫码支付初始化方法规则 - * 1:根据(商户编号 + 商户订单号)确定订单是否存在 - * 1.1:如果订单存在且为未支付,抛异常提示订单已存在 - * 1.2:如果订单不存在,创建支付订单 - * 2:获取商户支付配置,跳转到支付网关,选择支付方式 - * - * @param payKey 商户支付KEY - * @param productName 产品名称 - * @param orderNo 商户订单号 - * @param orderDate 下单日期 - * @param orderTime 下单时间 - * @param orderPrice 订单金额(元) - * @param orderIp 下单IP - * @param orderPeriod 订单有效期(分钟) - * @param returnUrl 支付结果页面通知地址 - * @param notifyUrl 支付结果后台通知地址 - * @param remark 支付备注 - * @param field1 扩展字段1 - * @param field2 扩展字段2 - * @param field3 扩展字段3 - * @param field4 扩展字段4 - * @param field5 扩展字段5 + * 1:根据(商户编号 + 商户订单号)确定订单是否存在 + * 1.1:如果订单不存在,创建支付订单 + * 2:获取商户支付配置,跳转到支付网关,选择支付方式 + * @param rpUserPayConfig + * @param scanPayRequestBo + * @return */ @Override - @Transactional(rollbackFor = Exception.class) - public RpPayGateWayPageShowVo initNonDirectScanPay(String payKey, String productName, String orderNo, Date orderDate, Date orderTime, BigDecimal orderPrice, String orderIp, Integer orderPeriod, String returnUrl, String notifyUrl, String remark, String field1, String field2, String field3, String field4, String field5) { - - RpUserPayConfig rpUserPayConfig = rpUserPayConfigService.getByPayKey(payKey); - if (rpUserPayConfig == null){ - throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR,"用户支付配置有误"); - } + public RpPayGateWayPageShowVo initNonDirectScanPay(RpUserPayConfig rpUserPayConfig , ScanPayRequestBo scanPayRequestBo) { - String merchantNo = rpUserPayConfig.getUserNo();//商户编号 + String merchantNo = rpUserPayConfig.getUserNo();// 商户编号 RpUserInfo rpUserInfo = rpUserInfoService.getDataByMerchentNo(merchantNo); - if (rpUserInfo == null){ - throw new UserBizException(UserBizException.USER_IS_NULL,"用户不存在"); + if (rpUserInfo == null) { + throw new UserBizException(UserBizException.USER_IS_NULL, "用户不存在"); } List payWayList = rpPayWayService.listByProductCode(rpUserPayConfig.getProductCode()); - if (payWayList == null || payWayList.size() <= 0){ - throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR,"支付产品配置有误"); + if (payWayList == null || payWayList.size() <= 0) { + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "支付产品配置有误"); } - RpTradePaymentOrder rpTradePaymentOrder = rpTradePaymentOrderDao.selectByMerchantNoAndMerchantOrderNo(merchantNo, orderNo); - if (rpTradePaymentOrder == null){ - rpTradePaymentOrder = sealRpTradePaymentOrder( merchantNo, rpUserInfo.getUserName() , productName, orderNo, orderDate, orderTime, orderPrice, null, null ,null , rpUserPayConfig.getFundIntoType() , orderIp, orderPeriod, returnUrl, notifyUrl, remark, field1, field2, field3, field4, field5); + RpTradePaymentOrder rpTradePaymentOrder = rpTradePaymentOrderDao.selectByMerchantNoAndMerchantOrderNo(merchantNo, scanPayRequestBo.getOrderNo()); + if (rpTradePaymentOrder == null) { + rpTradePaymentOrder = sealScanPayRpTradePaymentOrder( rpUserPayConfig , scanPayRequestBo , rpUserInfo); rpTradePaymentOrderDao.insert(rpTradePaymentOrder); - }else{ + } else { - if (TradeStatusEnum.SUCCESS.name().equals(rpTradePaymentOrder.getStatus())){ - throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR,"订单已支付成功,无需重复支付"); + if (TradeStatusEnum.SUCCESS.name().equals(rpTradePaymentOrder.getStatus())) { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "订单已支付成功,无需重复支付"); } - if (rpTradePaymentOrder.getOrderAmount().compareTo(orderPrice) != 0 ){ - rpTradePaymentOrder.setOrderAmount(orderPrice);//如果金额不一致,修改金额为最新的金额 + if (rpTradePaymentOrder.getOrderAmount().compareTo(scanPayRequestBo.getOrderPrice()) != 0) { + rpTradePaymentOrder.setOrderAmount(scanPayRequestBo.getOrderPrice());// 如果金额不一致,修改金额为最新的金额 rpTradePaymentOrderDao.update(rpTradePaymentOrder); } } RpPayGateWayPageShowVo payGateWayPageShowVo = new RpPayGateWayPageShowVo(); - payGateWayPageShowVo.setProductName(rpTradePaymentOrder.getProductName());//产品名称 - payGateWayPageShowVo.setMerchantName(rpTradePaymentOrder.getMerchantName());//商户名称 - payGateWayPageShowVo.setOrderAmount(rpTradePaymentOrder.getOrderAmount());//订单金额 - payGateWayPageShowVo.setMerchantOrderNo(rpTradePaymentOrder.getMerchantOrderNo());//商户订单号 - payGateWayPageShowVo.setPayKey(payKey);//商户支付key - - Map payWayEnumMap = new HashMap(); - for (RpPayWay payWay :payWayList){ - payWayEnumMap.put(payWay.getPayWayCode(), PayWayEnum.getEnum(payWay.getPayWayCode())); + payGateWayPageShowVo.setProductName(rpTradePaymentOrder.getProductName());// 产品名称 + payGateWayPageShowVo.setMerchantName(rpTradePaymentOrder.getMerchantName());// 商户名称 + payGateWayPageShowVo.setOrderAmount(rpTradePaymentOrder.getOrderAmount());// 订单金额 + payGateWayPageShowVo.setMerchantOrderNo(rpTradePaymentOrder.getMerchantOrderNo());// 商户订单号 + payGateWayPageShowVo.setPayKey(scanPayRequestBo.getPayKey());// 商户支付key + + Map payTypeEnumMap = new HashMap(); + for (RpPayWay payWay : payWayList) { + PayTypeEnum payTypeEnum = PayTypeEnum.getEnum(payWay.getPayTypeCode()); + if (PayTypeEnum.SCANPAY.name().equals(payTypeEnum.name()) || PayTypeEnum.DIRECT_PAY.name().equals(payTypeEnum.name()) || PayTypeEnum.HUA_BEI_FEN_QI_PAY.name().equals(payTypeEnum.name())){ + payTypeEnumMap.put(payWay.getPayWayCode(), payTypeEnum); + } } - payGateWayPageShowVo.setPayWayEnumMap(payWayEnumMap); + payGateWayPageShowVo.setPayTypeEnumMap(payTypeEnumMap); return payGateWayPageShowVo; - } /** * 非直连扫码支付,选择支付方式后,去支付 + * * @param payKey * @param orderNo - * @param payWayCode + * @param payType + * @param numberOfStages * @return */ @Override - public ScanPayResultVo toNonDirectScanPay(String payKey , String orderNo, String payWayCode) { + public ScanPayResultVo toNonDirectScanPay(String payKey, String orderNo, String payType , Integer numberOfStages) { RpUserPayConfig rpUserPayConfig = rpUserPayConfigService.getByPayKey(payKey); - if (rpUserPayConfig == null){ - throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR,"用户支付配置有误"); + if (rpUserPayConfig == null) { + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "用户支付配置有误"); } - //根据支付产品及支付方式获取费率 - RpPayWay payWay = null; - if (PayWayEnum.WEIXIN.name().equals(payWayCode)){ - payWay = rpPayWayService.getByPayWayTypeCode(rpUserPayConfig.getProductCode(), payWayCode, PayTypeEnum.SCANPAY.name()); - }else if (PayWayEnum.ALIPAY.name().equals(payWayCode)){ - payWay = rpPayWayService.getByPayWayTypeCode(rpUserPayConfig.getProductCode(), payWayCode, PayTypeEnum.DIRECT_PAY.name()); + + PayTypeEnum payTypeEnum = PayTypeEnum.getEnum(payType); + if (payTypeEnum == null ){ + throw new PayBizException(PayBizException.REQUEST_PARAM_ERR , "请求参数异常"); } + // 根据支付产品及支付方式获取费率 + RpPayWay payWay = rpPayWayService.getByPayWayTypeCode(rpUserPayConfig.getProductCode(), payTypeEnum.getWay(), payTypeEnum.name()); - if(payWay == null){ - throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR,"用户支付配置有误"); + if (payWay == null) { + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "用户支付配置有误"); } - String merchantNo = rpUserPayConfig.getUserNo();//商户编号 + String merchantNo = rpUserPayConfig.getUserNo();// 商户编号 RpUserInfo rpUserInfo = rpUserInfoService.getDataByMerchentNo(merchantNo); - if (rpUserInfo == null){ - throw new UserBizException(UserBizException.USER_IS_NULL,"用户不存在"); + if (rpUserInfo == null) { + throw new UserBizException(UserBizException.USER_IS_NULL, "用户不存在"); } - //根据商户订单号获取订单信息 + // 根据商户订单号获取订单信息 RpTradePaymentOrder rpTradePaymentOrder = rpTradePaymentOrderDao.selectByMerchantNoAndMerchantOrderNo(merchantNo, orderNo); - if (rpTradePaymentOrder == null){ - throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR,"订单不存在"); + if (rpTradePaymentOrder == null) { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "订单不存在"); } - if (TradeStatusEnum.SUCCESS.name().equals(rpTradePaymentOrder.getStatus())){ - throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR,"订单已支付成功,无需重复支付"); + if (TradeStatusEnum.SUCCESS.name().equals(rpTradePaymentOrder.getStatus())) { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "订单已支付成功,无需重复支付"); } - return getScanPayResultVo(rpTradePaymentOrder , payWay); + return getScanPayResultVo(rpTradePaymentOrder, payWay ,numberOfStages); } - /** * 通过支付订单及商户费率生成支付记录 - * @param rpTradePaymentOrder 支付订单 - * @param payWay 商户支付配置 + * + * @param rpTradePaymentOrder 支付订单 + * @param payWay 商户支付配置 * @return */ - private ScanPayResultVo getScanPayResultVo(RpTradePaymentOrder rpTradePaymentOrder ,RpPayWay payWay){ + private ScanPayResultVo getScanPayResultVo(RpTradePaymentOrder rpTradePaymentOrder, RpPayWay payWay ,Integer numberOfStages) { ScanPayResultVo scanPayResultVo = new ScanPayResultVo(); + String payWayCode = payWay.getPayWayCode();// 支付方式 - String payWayCode = payWay.getPayWayCode();//支付方式 - - PayTypeEnum payType = null; - if (PayWayEnum.WEIXIN.name().equals(payWay.getPayWayCode())){ - payType = PayTypeEnum.SCANPAY; - }else if(PayWayEnum.ALIPAY.name().equals(payWay.getPayWayCode())){ - payType = PayTypeEnum.DIRECT_PAY; - } + PayTypeEnum payType = PayTypeEnum.getEnum(payWay.getPayTypeCode()); rpTradePaymentOrder.setPayTypeCode(payType.name()); rpTradePaymentOrder.setPayTypeName(payType.getDesc()); - rpTradePaymentOrder.setPayWayCode(payWay.getPayWayCode()); rpTradePaymentOrder.setPayWayName(payWay.getPayWayName()); rpTradePaymentOrderDao.update(rpTradePaymentOrder); - RpTradePaymentRecord rpTradePaymentRecord = sealRpTradePaymentRecord( rpTradePaymentOrder.getMerchantNo(), rpTradePaymentOrder.getMerchantName() , rpTradePaymentOrder.getProductName(), rpTradePaymentOrder.getMerchantOrderNo(), rpTradePaymentOrder.getOrderAmount(), payWay.getPayWayCode(), payWay.getPayWayName() , payType, rpTradePaymentOrder.getFundIntoType() , BigDecimal.valueOf(payWay.getPayRate()) , rpTradePaymentOrder.getOrderIp(), rpTradePaymentOrder.getReturnUrl(), rpTradePaymentOrder.getNotifyUrl(), rpTradePaymentOrder.getRemark(), rpTradePaymentOrder.getField1(), rpTradePaymentOrder.getField2(), rpTradePaymentOrder.getField3(), rpTradePaymentOrder.getField4(), rpTradePaymentOrder.getField5()); + RpTradePaymentRecord rpTradePaymentRecord = sealRpTradePaymentRecord(rpTradePaymentOrder.getMerchantNo(), rpTradePaymentOrder.getMerchantName(), rpTradePaymentOrder.getProductName(), rpTradePaymentOrder.getMerchantOrderNo(), rpTradePaymentOrder.getOrderAmount(), payWay.getPayWayCode(), payWay.getPayWayName(), payType, rpTradePaymentOrder.getFundIntoType(), BigDecimal.valueOf(payWay.getPayRate()), rpTradePaymentOrder.getOrderIp(), rpTradePaymentOrder.getReturnUrl(), rpTradePaymentOrder.getNotifyUrl(), rpTradePaymentOrder.getRemark(), rpTradePaymentOrder.getField1(), rpTradePaymentOrder.getField2(), rpTradePaymentOrder.getField3(), rpTradePaymentOrder.getField4(), rpTradePaymentOrder.getField5()); rpTradePaymentRecordDao.insert(rpTradePaymentRecord); - if (PayWayEnum.WEIXIN.name().equals(payWayCode)){//微信支付 + if (PayWayEnum.WEIXIN.name().equals(payWayCode)) {// 微信支付 String appid = ""; String mch_id = ""; String partnerKey = ""; - if (FundInfoTypeEnum.MERCHANT_RECEIVES.name().equals(rpTradePaymentOrder.getFundIntoType())){//商户收款 - //根据资金流向获取配置信息 - RpUserPayInfo rpUserPayInfo = rpUserPayInfoService.getByUserNo(rpTradePaymentOrder.getMerchantNo(),payWayCode); + if (FundInfoTypeEnum.MERCHANT_RECEIVES.name().equals(rpTradePaymentOrder.getFundIntoType())) {// 商户收款 + // 根据资金流向获取配置信息 + RpUserPayInfo rpUserPayInfo = rpUserPayInfoService.getByUserNo(rpTradePaymentOrder.getMerchantNo(), payWayCode); appid = rpUserPayInfo.getAppId(); mch_id = rpUserPayInfo.getMerchantId(); partnerKey = rpUserPayInfo.getPartnerKey(); - }else if (FundInfoTypeEnum.PLAT_RECEIVES.name().equals(rpTradePaymentOrder.getFundIntoType())){//平台收款 + } else if (FundInfoTypeEnum.PLAT_RECEIVES.name().equals(rpTradePaymentOrder.getFundIntoType())) {// 平台收款 appid = WeixinConfigUtil.readConfig("appId"); mch_id = WeixinConfigUtil.readConfig("mch_id"); partnerKey = WeixinConfigUtil.readConfig("partnerKey"); } - WeiXinPrePay weiXinPrePay = sealWeixinPerPay(appid , mch_id , rpTradePaymentOrder.getProductName() ,rpTradePaymentOrder.getRemark() , rpTradePaymentRecord.getBankOrderNo() , rpTradePaymentOrder.getOrderAmount() , rpTradePaymentOrder.getOrderTime() , rpTradePaymentOrder.getOrderPeriod() , WeiXinTradeTypeEnum.NATIVE , - rpTradePaymentRecord.getBankOrderNo() ,"" ,rpTradePaymentOrder.getOrderIp()); + WeiXinPrePay weiXinPrePay = sealWeixinPerPay(appid, mch_id, rpTradePaymentOrder.getProductName(), rpTradePaymentOrder.getRemark(), rpTradePaymentRecord.getBankOrderNo(), rpTradePaymentOrder.getOrderAmount(), rpTradePaymentOrder.getOrderTime(), rpTradePaymentOrder.getOrderPeriod(), WeiXinTradeTypeEnum.NATIVE, rpTradePaymentRecord.getBankOrderNo(), "", rpTradePaymentOrder.getOrderIp()); String prePayXml = WeiXinPayUtils.getPrePayXml(weiXinPrePay, partnerKey); - //调用微信支付的功能,获取微信支付code_url + LOG.info("扫码支付,微信请求报文:{}", prePayXml); + // 调用微信支付的功能,获取微信支付code_url Map prePayRequest = WeiXinPayUtils.httpXmlRequest(WeixinConfigUtil.readConfig("prepay_url"), "POST", prePayXml); + LOG.info("扫码支付,微信返回报文:{}", prePayRequest.toString()); if (WeixinTradeStateEnum.SUCCESS.name().equals(prePayRequest.get("return_code")) && WeixinTradeStateEnum.SUCCESS.name().equals(prePayRequest.get("result_code"))) { String weiXinPrePaySign = WeiXinPayUtils.geWeiXintPrePaySign(appid, mch_id, weiXinPrePay.getDeviceInfo(), WeiXinTradeTypeEnum.NATIVE.name(), prePayRequest, partnerKey); String codeUrl = String.valueOf(prePayRequest.get("code_url")); - LOG.info("预支付生成成功,{}",codeUrl); + LOG.info("预支付生成成功,{}", codeUrl); if (prePayRequest.get("sign").equals(weiXinPrePaySign)) { rpTradePaymentRecord.setBankReturnMsg(prePayRequest.toString()); rpTradePaymentRecordDao.update(rpTradePaymentRecord); - scanPayResultVo.setCodeUrl(codeUrl);//设置微信跳转地址 + scanPayResultVo.setCodeUrl(codeUrl);// 设置微信跳转地址 scanPayResultVo.setPayWayCode(PayWayEnum.WEIXIN.name()); scanPayResultVo.setProductName(rpTradePaymentOrder.getProductName()); scanPayResultVo.setOrderAmount(rpTradePaymentOrder.getOrderAmount()); - }else{ - throw new TradeBizException(TradeBizException.TRADE_WEIXIN_ERROR,"微信返回结果签名异常"); + } else { + throw new TradeBizException(TradeBizException.TRADE_WEIXIN_ERROR, "微信返回结果签名异常"); } - }else{ - throw new TradeBizException(TradeBizException.TRADE_WEIXIN_ERROR,"请求微信异常"); + } else { + throw new TradeBizException(TradeBizException.TRADE_WEIXIN_ERROR, "请求微信异常"); + } + } else if (PayWayEnum.ALIPAY.name().equals(payWayCode)) {// 支付宝支付 + + String appId = ""; + String mchPrivateKey = ""; + + if (FundInfoTypeEnum.MERCHANT_RECEIVES.name().equals(rpTradePaymentOrder.getFundIntoType())) {// 商户收款 + RpUserPayInfo rpUserPayInfo = rpUserPayInfoService.getByUserNo(rpTradePaymentOrder.getMerchantNo(), payWayCode); + appId = rpUserPayInfo.getOfflineAppId(); + mchPrivateKey = rpUserPayInfo.getRsaPrivateKey(); + }else if (FundInfoTypeEnum.PLAT_RECEIVES.name().equals(rpTradePaymentOrder.getFundIntoType())) {// 平台收款 + appId = AlipayConfigUtil.app_id; + mchPrivateKey = AlipayConfigUtil.mch_private_key; + } + + AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfigUtil.trade_pay_url, appId, mchPrivateKey, "json", "utf-8", AlipayConfigUtil.ali_public_key, "RSA2"); + + AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); + alipayRequest.setNotifyUrl(AlipayConfigUtil.notify_url); + alipayRequest.setReturnUrl(AlipayConfigUtil.return_url); + + if (PayTypeEnum.DIRECT_PAY.name().equals(payType.name())){ + + alipayRequest.setBizContent("{\"out_trade_no\":\""+ rpTradePaymentRecord.getBankOrderNo() +"\"," + + "\"total_amount\":\""+ rpTradePaymentOrder.getOrderAmount() +"\"," + + "\"subject\":\""+ rpTradePaymentOrder.getProductName() +"\"," + + "\"body\":\""+ rpTradePaymentOrder.getProductName() +"\"," + + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); + + }else if (PayTypeEnum.HUA_BEI_FEN_QI_PAY.name().equals(payType.name())){ + + alipayRequest.setBizContent("{\"out_trade_no\":\""+ rpTradePaymentRecord.getBankOrderNo() +"\"," + + "\"total_amount\":\""+ rpTradePaymentOrder.getOrderAmount() +"\"," + + "\"subject\":\""+ rpTradePaymentOrder.getProductName() +"\"," + + "\"body\":\""+ rpTradePaymentOrder.getProductName() +"\"," + + "\"extend_params\":{\"hb_fq_num\":\""+numberOfStages+"\",\"hb_fq_seller_percent\":\""+0+"\"}," + + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); } - }else if (PayWayEnum.ALIPAY.name().equals(payWayCode)){//支付宝支付 - - //把请求参数打包成数组 - Map sParaTemp = new HashMap(); - sParaTemp.put("service", AlipayConfigUtil.service); - sParaTemp.put("partner", AlipayConfigUtil.partner); - sParaTemp.put("seller_id", AlipayConfigUtil.seller_id); - sParaTemp.put("_input_charset", AlipayConfigUtil.input_charset); - sParaTemp.put("payment_type", AlipayConfigUtil.payment_type); - sParaTemp.put("notify_url", AlipayConfigUtil.notify_url); - sParaTemp.put("return_url", AlipayConfigUtil.return_url); - sParaTemp.put("anti_phishing_key", AlipayConfigUtil.anti_phishing_key); - sParaTemp.put("exter_invoke_ip", AlipayConfigUtil.exter_invoke_ip); - sParaTemp.put("out_trade_no", rpTradePaymentRecord.getBankOrderNo()); - sParaTemp.put("subject", rpTradePaymentOrder.getProductName()); - sParaTemp.put("total_fee", String.valueOf(rpTradePaymentOrder.getOrderAmount().setScale(2,BigDecimal.ROUND_HALF_UP)));//小数点后两位 - sParaTemp.put("body", ""); - //获取请求页面数据 - String sHtmlText = AlipaySubmit.buildRequest(sParaTemp, "get", "确认"); - - rpTradePaymentRecord.setBankReturnMsg(sHtmlText); - rpTradePaymentRecordDao.update(rpTradePaymentRecord); - scanPayResultVo.setCodeUrl(sHtmlText);//设置微信跳转地址 - scanPayResultVo.setPayWayCode(PayWayEnum.ALIPAY.name()); - scanPayResultVo.setProductName(rpTradePaymentOrder.getProductName()); - scanPayResultVo.setOrderAmount(rpTradePaymentOrder.getOrderAmount()); - - }else{ - throw new TradeBizException(TradeBizException.TRADE_PAY_WAY_ERROR,"错误的支付方式"); - } + try { + String alipayTradePagePayResponse = alipayClient.pageExecute(alipayRequest).getBody(); + rpTradePaymentRecord.setBankReturnMsg(alipayTradePagePayResponse); + rpTradePaymentRecordDao.update(rpTradePaymentRecord); + scanPayResultVo.setCodeUrl(alipayTradePagePayResponse);// 设置支付宝跳转地址 + scanPayResultVo.setPayWayCode(PayWayEnum.ALIPAY.name()); + scanPayResultVo.setProductName(rpTradePaymentOrder.getProductName()); + scanPayResultVo.setOrderAmount(rpTradePaymentOrder.getOrderAmount()); + + } catch (AlipayApiException e) { + LOG.error("支付宝API异常:" , e); + throw new PayBizException(PayBizException.REQUEST_BANK_ERR , "请求支付宝异常"); + } + + } else { + throw new TradeBizException(TradeBizException.TRADE_PAY_WAY_ERROR, "错误的支付方式"); + } + rpNotifyService.orderSend(rpTradePaymentRecord.getBankOrderNo()); return scanPayResultVo; } /** * 完成扫码支付(支付宝即时到账支付) + * * @param payWayCode * @param notifyMap * @return */ @Override @Transactional(rollbackFor = Exception.class) - public String completeScanPay(String payWayCode ,Map notifyMap) { - LOG.info("接收到{}支付结果{}",payWayCode,notifyMap); + public String completeScanPay(String payWayCode, Map notifyMap) { + LOG.info("接收到{}支付结果{}", payWayCode, notifyMap); String returnStr = null; String bankOrderNo = notifyMap.get("out_trade_no"); - //根据银行订单号获取支付信息 + // 根据银行订单号获取支付信息 RpTradePaymentRecord rpTradePaymentRecord = rpTradePaymentRecordDao.getByBankOrderNo(bankOrderNo); - if (rpTradePaymentRecord == null){ - throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR,",非法订单,订单不存在"); + if (rpTradePaymentRecord == null) { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, ",非法订单,订单不存在"); } - if (TradeStatusEnum.SUCCESS.name().equals(rpTradePaymentRecord.getStatus())){ - throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR,"订单为成功状态"); + if (TradeStatusEnum.SUCCESS.name().equals(rpTradePaymentRecord.getStatus())) { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "订单为成功状态"); } - String merchantNo = rpTradePaymentRecord.getMerchantNo();//商户编号 + String merchantNo = rpTradePaymentRecord.getMerchantNo();// 商户编号 - //根据支付订单获取配置信息 - String fundIntoType = rpTradePaymentRecord.getFundIntoType();//获取资金流入类型 + // 根据支付订单获取配置信息 + String fundIntoType = rpTradePaymentRecord.getFundIntoType();// 获取资金流入类型 String partnerKey = ""; - if (FundInfoTypeEnum.MERCHANT_RECEIVES.name().equals(fundIntoType)){//商户收款 - //根据资金流向获取配置信息 - RpUserPayInfo rpUserPayInfo = rpUserPayInfoService.getByUserNo(merchantNo,PayWayEnum.WEIXIN.name()); + if (FundInfoTypeEnum.MERCHANT_RECEIVES.name().equals(fundIntoType)) {// 商户收款 + // 根据资金流向获取配置信息 + RpUserPayInfo rpUserPayInfo = rpUserPayInfoService.getByUserNo(merchantNo, PayWayEnum.WEIXIN.name()); partnerKey = rpUserPayInfo.getPartnerKey(); - }else if (FundInfoTypeEnum.PLAT_RECEIVES.name().equals(fundIntoType)){//平台收款 + } else if (FundInfoTypeEnum.PLAT_RECEIVES.name().equals(fundIntoType)) {// 平台收款 partnerKey = WeixinConfigUtil.readConfig("partnerKey"); RpUserPayConfig rpUserPayConfig = rpUserPayConfigService.getByUserNo(merchantNo); - if (rpUserPayConfig == null){ - throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR,"用户支付配置有误"); + if (rpUserPayConfig == null) { + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "用户支付配置有误"); } - //根据支付产品及支付方式获取费率 + // 根据支付产品及支付方式获取费率 RpPayWay payWay = rpPayWayService.getByPayWayTypeCode(rpUserPayConfig.getProductCode(), rpTradePaymentRecord.getPayWayCode(), rpTradePaymentRecord.getPayTypeCode()); - if(payWay == null){ - throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR,"用户支付配置有误"); + if (payWay == null) { + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "用户支付配置有误"); } } - - if(PayWayEnum.WEIXIN.name().equals(payWayCode)){ + if (PayWayEnum.WEIXIN.name().equals(payWayCode)) { String sign = notifyMap.remove("sign"); - if (WeiXinPayUtils.notifySign(notifyMap, sign, partnerKey)){//根据配置信息验证签名 - if (WeixinTradeStateEnum.SUCCESS.name().equals(notifyMap.get("result_code"))){//业务结果 成功 + if (WeiXinPayUtils.notifySign(notifyMap, sign, partnerKey)) {// 根据配置信息验证签名 + if (WeixinTradeStateEnum.SUCCESS.name().equals(notifyMap.get("result_code"))) {// 业务结果 + // 成功 String timeEndStr = notifyMap.get("time_end"); Date timeEnd = null; - if (!StringUtil.isEmpty(timeEndStr)){ - timeEnd = DateUtils.getDateFromString(timeEndStr,"yyyyMMddHHmmss");//订单支付完成时间 + if (!StringUtil.isEmpty(timeEndStr)) { + timeEnd = DateUtils.getDateFromString(timeEndStr, "yyyyMMddHHmmss");// 订单支付完成时间 } - completeSuccessOrder(rpTradePaymentRecord, notifyMap.get("transaction_id"),timeEnd, notifyMap.toString()); - returnStr = "\n" + - " \n" + - " \n" + - ""; - }else{ - completeFailOrder(rpTradePaymentRecord,notifyMap.toString()); + completeSuccessOrder(rpTradePaymentRecord, notifyMap.get("transaction_id"), timeEnd, notifyMap.toString()); + returnStr = "\n" + " \n" + " \n" + ""; + } else { + completeFailOrder(rpTradePaymentRecord, notifyMap.toString()); } - }else{ - throw new TradeBizException(TradeBizException.TRADE_WEIXIN_ERROR,"微信签名失败"); + } else { + throw new TradeBizException(TradeBizException.TRADE_WEIXIN_ERROR, "微信签名失败"); } - }else if (PayWayEnum.ALIPAY.name().equals(payWayCode)){ - if(AlipayNotify.verify(notifyMap)){//验证成功 - String tradeStatus = notifyMap.get("trade_status"); - if(AliPayTradeStateEnum.TRADE_FINISHED.name().equals(tradeStatus)){ - //判断该笔订单是否在商户网站中已经做过处理 - //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 - //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的 - //如果有做过处理,不执行商户的业务程序 - - //注意: - //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 - } else if (AliPayTradeStateEnum.TRADE_SUCCESS.name().equals(tradeStatus)){ + } else if ("WEIXIN_PROGRAM".equals(payWayCode)) { - String gmtPaymentStr = notifyMap.get("gmt_payment");//付款时间 + String sign = notifyMap.remove("sign"); + if (WeiXinPayUtils.notifySign(notifyMap, sign, WeixinConfigUtil.xPayKey)) {// 根据配置信息验证签名 + if (WeixinTradeStateEnum.SUCCESS.name().equals(notifyMap.get("result_code"))) {// 业务结果 + // 成功 + String timeEndStr = notifyMap.get("time_end"); Date timeEnd = null; - if(!StringUtil.isEmpty(gmtPaymentStr)){ - timeEnd = DateUtils.getDateFromString(gmtPaymentStr,"yyyy-MM-dd HH:mm:ss"); + if (!StringUtil.isEmpty(timeEndStr)) { + timeEnd = DateUtils.getDateFromString(timeEndStr, "yyyyMMddHHmmss");// 订单支付完成时间 } - completeSuccessOrder(rpTradePaymentRecord, notifyMap.get("trade_no"), timeEnd ,notifyMap.toString()); - returnStr = "success"; - }else{ - completeFailOrder(rpTradePaymentRecord,notifyMap.toString()); - returnStr = "fail"; + completeSuccessOrder(rpTradePaymentRecord, notifyMap.get("transaction_id"), timeEnd, notifyMap.toString()); + returnStr = "\n" + " \n" + " \n" + ""; + } else { + completeFailOrder(rpTradePaymentRecord, notifyMap.toString()); } - }else{//验证失败 - throw new TradeBizException(TradeBizException.TRADE_ALIPAY_ERROR,"支付宝签名异常"); + } else { + throw new TradeBizException(TradeBizException.TRADE_WEIXIN_ERROR, "微信签名失败"); + } + + + } else if (PayWayEnum.ALIPAY.name().equals(payWayCode)) { +// if (AlipayNotify.verify(notifyMap)) {// 验证成功 + try { + if (AlipaySignature.rsaCheckV1(notifyMap, AlipayConfigUtil.ali_public_key, "UTF-8", "RSA2")){ + String tradeStatus = notifyMap.get("trade_status"); + + if (AliPayTradeStateEnum.TRADE_FINISHED.name().equals(tradeStatus)) { + // 判断该笔订单是否在商户网站中已经做过处理 + // 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 + // 请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的 + // 如果有做过处理,不执行商户的业务程序 + + // 注意: + // 退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 + } else if (AliPayTradeStateEnum.TRADE_SUCCESS.name().equals(tradeStatus)) { + + String gmtPaymentStr = notifyMap.get("gmt_payment");// 付款时间 + Date timeEnd = null; + if (!StringUtil.isEmpty(gmtPaymentStr)) { + timeEnd = DateUtils.getDateFromString(gmtPaymentStr, "yyyy-MM-dd HH:mm:ss"); + } + completeSuccessOrder(rpTradePaymentRecord, notifyMap.get("trade_no"), timeEnd, notifyMap.toString()); + returnStr = "success"; + } else { + completeFailOrder(rpTradePaymentRecord, notifyMap.toString()); + returnStr = "fail"; + } + } else {// 验证失败 + throw new TradeBizException(TradeBizException.TRADE_ALIPAY_ERROR, "支付宝签名异常"); + } + } catch (AlipayApiException e) { + LOG.error("验签失败:" , e); + throw new TradeBizException(TradeBizException.TRADE_ALIPAY_ERROR, "支付宝签名异常"); } - }else{ - throw new TradeBizException(TradeBizException.TRADE_PAY_WAY_ERROR,"错误的支付方式"); + } else { + throw new TradeBizException(TradeBizException.TRADE_PAY_WAY_ERROR, "错误的支付方式"); } - LOG.info("返回支付通道{}信息{}",payWayCode,returnStr); + LOG.info("返回支付通道{}信息{}", payWayCode, returnStr); return returnStr; } /** - * 支付成功后,又是会出现页面通知早与后台通知 - * 现页面通知,暂时不做数据处理功能,只生成页面通知URL + * 支付成功后,又是会出现页面通知早与后台通知 现页面通知,暂时不做数据处理功能,只生成页面通知URL + * * @param payWayCode * @param resultMap * @return @@ -789,249 +773,760 @@ public class RpTradePaymentManagerServiceImpl implements RpTradePaymentManagerSe OrderPayResultVo orderPayResultVo = new OrderPayResultVo(); String bankOrderNo = resultMap.get("out_trade_no"); - //根据银行订单号获取支付信息 + // 根据银行订单号获取支付信息 RpTradePaymentRecord rpTradePaymentRecord = rpTradePaymentRecordDao.getByBankOrderNo(bankOrderNo); - if (rpTradePaymentRecord == null){ - throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR,",非法订单,订单不存在"); + if (rpTradePaymentRecord == null) { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, ",非法订单,订单不存在"); } - orderPayResultVo.setOrderPrice(rpTradePaymentRecord.getOrderAmount());//订单金额 - orderPayResultVo.setProductName(rpTradePaymentRecord.getProductName());//产品名称 + orderPayResultVo.setOrderPrice(rpTradePaymentRecord.getOrderAmount());// 订单金额 + orderPayResultVo.setProductName(rpTradePaymentRecord.getProductName());// 产品名称 RpTradePaymentOrder rpTradePaymentOrder = rpTradePaymentOrderDao.selectByMerchantNoAndMerchantOrderNo(rpTradePaymentRecord.getMerchantNo(), rpTradePaymentRecord.getMerchantOrderNo()); - String trade_status = resultMap.get("trade_status"); - //计算得出通知验证结果 - boolean verify_result = AlipayNotify.verify(resultMap); - if(verify_result){//验证成功 - if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){ - String resultUrl = getMerchantNotifyUrl(rpTradePaymentRecord, rpTradePaymentOrder, rpTradePaymentRecord.getReturnUrl(), TradeStatusEnum.SUCCESS); - orderPayResultVo.setReturnUrl(resultUrl); - orderPayResultVo.setStatus(TradeStatusEnum.SUCCESS.name()); - }else{ - String resultUrl = getMerchantNotifyUrl(rpTradePaymentRecord, rpTradePaymentOrder, rpTradePaymentRecord.getReturnUrl(), TradeStatusEnum.FAILED); + // 计算得出通知验证结果 + boolean verify_result = false; + + try { + verify_result = AlipaySignature.rsaCheckV1(resultMap, AlipayConfigUtil.ali_public_key, "UTF-8", "RSA2"); + } catch (AlipayApiException e) { + LOG.error("签名异常:" , e); + } + + if (verify_result) {// 验证成功 + + TradeStatusEnum tradeStatusEnum = TradeStatusEnum.getEnum(rpTradePaymentOrder.getStatus()); + + String resultUrl = getMerchantNotifyUrl(rpTradePaymentRecord, rpTradePaymentOrder, rpTradePaymentRecord.getReturnUrl(), tradeStatusEnum); orderPayResultVo.setReturnUrl(resultUrl); - orderPayResultVo.setStatus(TradeStatusEnum.FAILED.name()); - } - }else{ - throw new TradeBizException(TradeBizException.TRADE_ALIPAY_ERROR,"支付宝签名异常"); + orderPayResultVo.setStatus(tradeStatusEnum.name()); + + } else { + throw new TradeBizException(TradeBizException.TRADE_ALIPAY_ERROR, "支付宝签名异常"); } return orderPayResultVo; } - /** - * 支付订单实体封装 - * @param merchantNo 商户编号 - * @param merchantName 商户名称 - * @param productName 产品名称 - * @param orderNo 商户订单号 - * @param orderDate 下单日期 - * @param orderTime 下单时间 - * @param orderPrice 订单金额 - * @param payWay 支付方式 - * @param payWayName 支付方式名称 - * @param payType 支付类型 - * @param fundIntoType 资金流入类型 - * @param orderIp 下单IP - * @param orderPeriod 订单有效期 - * @param returnUrl 页面通知地址 - * @param notifyUrl 后台通知地址 - * @param remark 支付备注 - * @param field1 扩展字段1 - * @param field2 扩展字段2 - * @param field3 扩展字段3 - * @param field4 扩展字段4 - * @param field5 扩展字段5 + * 封装主扫扫码付交易订单 + * @param rpUserPayConfig + * @param scanPayRequestBo + * @param rpUserInfo * @return */ - private RpTradePaymentOrder sealRpTradePaymentOrder(String merchantNo, String merchantName ,String productName, String orderNo, Date orderDate, Date orderTime, BigDecimal orderPrice, - String payWay,String payWayName , PayTypeEnum payType , String fundIntoType , String orderIp, Integer orderPeriod, String returnUrl, String notifyUrl, String remark, String field1, String field2, String field3, String field4, String field5){ + private RpTradePaymentOrder sealScanPayRpTradePaymentOrder(RpUserPayConfig rpUserPayConfig , ScanPayRequestBo scanPayRequestBo , RpUserInfo rpUserInfo){ RpTradePaymentOrder rpTradePaymentOrder = new RpTradePaymentOrder(); - rpTradePaymentOrder.setProductName(productName);//商品名称 - if (StringUtil.isEmpty(orderNo)){ - throw new TradeBizException(TradeBizException.TRADE_PARAM_ERROR,"订单号错误"); - } + rpTradePaymentOrder.setProductName(scanPayRequestBo.getProductName());// 商品名称 - rpTradePaymentOrder.setMerchantOrderNo(orderNo);//订单号 + rpTradePaymentOrder.setMerchantOrderNo(scanPayRequestBo.getOrderNo());// 订单号 - if (orderPrice == null || orderPrice.doubleValue() <= 0){ - throw new TradeBizException(TradeBizException.TRADE_PARAM_ERROR,"订单金额错误"); - } + rpTradePaymentOrder.setOrderAmount(scanPayRequestBo.getOrderPrice());// 订单金额 - rpTradePaymentOrder.setOrderAmount(orderPrice);//订单金额 + rpTradePaymentOrder.setMerchantName(rpUserInfo.getUserName());// 商户名称 - if (StringUtil.isEmpty(merchantName)){ - throw new TradeBizException(TradeBizException.TRADE_PARAM_ERROR,"商户名称错误"); - } - rpTradePaymentOrder.setMerchantName(merchantName);//商户名称 + rpTradePaymentOrder.setMerchantNo(rpUserInfo.getUserNo());// 商户编号 - if (StringUtil.isEmpty(merchantNo)){ - throw new TradeBizException(TradeBizException.TRADE_PARAM_ERROR,"商户编号错误"); - } - rpTradePaymentOrder.setMerchantNo(merchantNo);//商户编号 + rpTradePaymentOrder.setOrderDate(DateUtils.parseDate(scanPayRequestBo.getOrderDate(), "yyyyMMdd"));// 下单日期 + Date orderTime = DateUtils.parseDate(scanPayRequestBo.getOrderTime(), "yyyyMMddHHmmss"); - if (orderDate == null){ - throw new TradeBizException(TradeBizException.TRADE_PARAM_ERROR,"下单日期错误"); - } - rpTradePaymentOrder.setOrderDate(orderDate);//下单日期 + rpTradePaymentOrder.setOrderTime(orderTime);// 下单时间 + rpTradePaymentOrder.setOrderIp(scanPayRequestBo.getOrderIp());// 下单IP + rpTradePaymentOrder.setOrderRefererUrl("");// 下单前页面 + rpTradePaymentOrder.setReturnUrl(scanPayRequestBo.getReturnUrl());// 页面通知地址 + rpTradePaymentOrder.setNotifyUrl(scanPayRequestBo.getNotifyUrl());// 后台通知地址 - if (orderTime == null){ - throw new TradeBizException(TradeBizException.TRADE_PARAM_ERROR,"下单时间错误"); - } - rpTradePaymentOrder.setOrderTime(orderTime);//下单时间 - rpTradePaymentOrder.setOrderIp(orderIp);//下单IP - rpTradePaymentOrder.setOrderRefererUrl("");//下单前页面 + rpTradePaymentOrder.setOrderPeriod(scanPayRequestBo.getOrderPeriod());// 订单有效期 - if (StringUtil.isEmpty(returnUrl)){ - throw new TradeBizException(TradeBizException.TRADE_PARAM_ERROR,"页面通知地址错误"); - } - rpTradePaymentOrder.setReturnUrl(returnUrl);//页面通知地址 + Date expireTime = DateUtils.addMinute(orderTime, scanPayRequestBo.getOrderPeriod());// 订单过期时间 + rpTradePaymentOrder.setExpireTime(expireTime);// 订单过期时间 + rpTradePaymentOrder.setStatus(TradeStatusEnum.WAITING_PAYMENT.name());// 订单状态 + // 等待支付 - if (StringUtil.isEmpty(notifyUrl)){ - throw new TradeBizException(TradeBizException.TRADE_PARAM_ERROR,"后台通知地址错误"); - } - rpTradePaymentOrder.setNotifyUrl(notifyUrl);//后台通知地址 + PayTypeEnum payType = PayTypeEnum.getEnum(scanPayRequestBo.getPayType()); + if (payType != null){ - if (orderPeriod == null || orderPeriod <= 0){ - throw new TradeBizException(TradeBizException.TRADE_PARAM_ERROR,"订单有效期错误"); + rpTradePaymentOrder.setPayTypeCode(payType.name());// 支付类型 + rpTradePaymentOrder.setPayTypeName(payType.getDesc());// 支付方式 + + PayWayEnum payWayEnum = PayWayEnum.getEnum(payType.getWay()); + rpTradePaymentOrder.setPayWayCode(payWayEnum.name());// 支付通道编码 + rpTradePaymentOrder.setPayWayName(payWayEnum.getDesc());// 支付通道名称 } - rpTradePaymentOrder.setOrderPeriod(orderPeriod);//订单有效期 - Date expireTime = DateUtils.addMinute(orderTime,orderPeriod);//订单过期时间 - rpTradePaymentOrder.setExpireTime(expireTime);//订单过期时间 - rpTradePaymentOrder.setPayWayCode(payWay);//支付通道编码 - rpTradePaymentOrder.setPayWayName(payWayName);//支付通道名称 - rpTradePaymentOrder.setStatus(TradeStatusEnum.WAITING_PAYMENT.name());//订单状态 等待支付 - if (payType != null){ - rpTradePaymentOrder.setPayTypeCode(payType.name());//支付类型 - rpTradePaymentOrder.setPayTypeName(payType.getDesc());//支付方式 - } - rpTradePaymentOrder.setFundIntoType(fundIntoType);//资金流入方向 + rpTradePaymentOrder.setFundIntoType(rpUserPayConfig.getFundIntoType());// 资金流入方向 + rpTradePaymentOrder.setRemark(scanPayRequestBo.getRemark());// 支付备注 - rpTradePaymentOrder.setRemark(remark);//支付备注 - rpTradePaymentOrder.setField1(field1);//扩展字段1 - rpTradePaymentOrder.setField2(field2);//扩展字段2 - rpTradePaymentOrder.setField3(field3);//扩展字段3 - rpTradePaymentOrder.setField4(field4);//扩展字段4 - rpTradePaymentOrder.setField5(field5);//扩展字段5 + return rpTradePaymentOrder; + } + + + /** + * 支付订单实体封装 + * + * @param merchantNo 商户编号 + * @param merchantName 商户名称 + * @param productName 产品名称 + * @param orderNo 商户订单号 + * @param orderDate 下单日期 + * @param orderTime 下单时间 + * @param orderPrice 订单金额 + * @param payWay 支付方式 + * @param payWayName 支付方式名称 + * @param payType 支付类型 + * @param fundIntoType 资金流入类型 + * @param orderIp 下单IP + * @param orderPeriod 订单有效期 + * @param returnUrl 页面通知地址 + * @param notifyUrl 后台通知地址 + * @param remark 支付备注 + * @param field1 扩展字段1 + * @param field2 扩展字段2 + * @param field3 扩展字段3 + * @param field4 扩展字段4 + * @param field5 扩展字段5 + * @return + */ + private RpTradePaymentOrder sealRpTradePaymentOrder(String merchantNo, String merchantName, String productName, String orderNo, Date orderDate, Date orderTime, BigDecimal orderPrice, String payWay, String payWayName, PayTypeEnum payType, String fundIntoType, String orderIp, Integer orderPeriod, String returnUrl, String notifyUrl, String remark, String field1, String field2, String field3, String field4, String field5) { + + return null; + } + + /** + * 封装小程序支付订单 + * @param rpUserPayConfig + * @param programPayRequestBo + * @param rpUserInfo + * @param rpPayWay + * @return + */ + private RpTradePaymentOrder sealProgramRpTradePaymentOrder(RpUserPayConfig rpUserPayConfig , ProgramPayRequestBo programPayRequestBo , RpUserInfo rpUserInfo , RpPayWay rpPayWay){ + RpTradePaymentOrder rpTradePaymentOrder = new RpTradePaymentOrder(); + rpTradePaymentOrder.setProductName(programPayRequestBo.getProductName());// 商品名称 + rpTradePaymentOrder.setMerchantOrderNo(programPayRequestBo.getOrderNo());// 订单号 + rpTradePaymentOrder.setOrderAmount(programPayRequestBo.getOrderPrice());// 订单金额 + rpTradePaymentOrder.setMerchantName(rpUserInfo.getUserName());// 商户名称 + rpTradePaymentOrder.setMerchantNo(rpUserInfo.getUserNo());// 商户编号 + + Date orderDate = DateUtils.parseDate(programPayRequestBo.getOrderDate(), "yyyyMMdd"); + Date orderTime = DateUtils.parseDate(programPayRequestBo.getOrderTime(), "yyyyMMddHHmmss"); + rpTradePaymentOrder.setOrderDate(orderDate);// 下单日期 + rpTradePaymentOrder.setOrderTime(orderTime);// 下单时间 + + rpTradePaymentOrder.setOrderIp(programPayRequestBo.getOrderIp());// 下单IP + rpTradePaymentOrder.setOrderRefererUrl("");// 下单前页面 + rpTradePaymentOrder.setReturnUrl("");// 页面通知地址 + + rpTradePaymentOrder.setNotifyUrl(programPayRequestBo.getNotifyUrl());// 后台通知地址 + rpTradePaymentOrder.setOrderPeriod(0);// 订单有效期 + rpTradePaymentOrder.setExpireTime(new Date());// 订单过期时间 + + rpTradePaymentOrder.setPayWayCode(rpPayWay.getPayWayCode());// 支付通道编码 + rpTradePaymentOrder.setPayWayName(rpPayWay.getPayWayName());// 支付通道名称 + rpTradePaymentOrder.setStatus(TradeStatusEnum.WAITING_PAYMENT.name());// 订单状态 + // 等待支付 + + rpTradePaymentOrder.setPayTypeCode(rpPayWay.getPayTypeCode());// 支付类型 + rpTradePaymentOrder.setPayTypeName(rpPayWay.getPayTypeName());// 支付方式 + rpTradePaymentOrder.setFundIntoType(rpUserPayConfig.getFundIntoType());// 资金流入方向 + + rpTradePaymentOrder.setRemark(programPayRequestBo.getRemark());// 支付备注 return rpTradePaymentOrder; } + /** + * 支付订单实体封装 + * + * @return + */ + private RpTradePaymentOrder sealF2FRpTradePaymentOrder(RpUserPayConfig rpUserPayConfig , F2FPayRequestBo f2FPayRequestBo , RpUserInfo rpUserInfo , RpPayWay rpPayWay) { + + RpTradePaymentOrder rpTradePaymentOrder = new RpTradePaymentOrder(); + rpTradePaymentOrder.setProductName(f2FPayRequestBo.getProductName());// 商品名称 + rpTradePaymentOrder.setMerchantOrderNo(f2FPayRequestBo.getOrderNo());// 订单号 + rpTradePaymentOrder.setOrderAmount(f2FPayRequestBo.getOrderPrice());// 订单金额 + rpTradePaymentOrder.setMerchantName(rpUserInfo.getUserName());// 商户名称 + rpTradePaymentOrder.setMerchantNo(rpUserInfo.getUserNo());// 商户编号 + Date orderDate = DateUtils.parseDate(f2FPayRequestBo.getOrderDate(), "yyyyMMdd"); + Date orderTime = DateUtils.parseDate(f2FPayRequestBo.getOrderTime(), "yyyyMMddHHmmss"); + rpTradePaymentOrder.setOrderDate(orderDate);// 下单日期 + rpTradePaymentOrder.setOrderTime(orderTime);// 下单时间 + rpTradePaymentOrder.setOrderIp(f2FPayRequestBo.getOrderIp());// 下单IP + rpTradePaymentOrder.setOrderRefererUrl("");// 下单前页面 + rpTradePaymentOrder.setReturnUrl("");// 页面通知地址 + rpTradePaymentOrder.setNotifyUrl("");// 后台通知地址 + rpTradePaymentOrder.setOrderPeriod(0);// 订单有效期 + rpTradePaymentOrder.setExpireTime(new Date());// 订单过期时间 + rpTradePaymentOrder.setPayWayCode(rpPayWay.getPayWayCode());// 支付通道编码 + rpTradePaymentOrder.setPayWayName(rpPayWay.getPayWayName());// 支付通道名称 + rpTradePaymentOrder.setStatus(TradeStatusEnum.WAITING_PAYMENT.name());// 订单状态 + rpTradePaymentOrder.setPayTypeCode(rpPayWay.getPayTypeCode());// 支付类型 + rpTradePaymentOrder.setPayTypeName(rpPayWay.getPayTypeName());// 支付方式 + rpTradePaymentOrder.setFundIntoType(rpUserPayConfig.getFundIntoType());// 资金流入方向 + rpTradePaymentOrder.setRemark(f2FPayRequestBo.getRemark());// 支付备注 + + return rpTradePaymentOrder; + } /** * 封装支付流水记录实体 - * @param merchantNo 商户编号 - * @param merchantName 商户名称 - * @param productName 产品名称 - * @param orderNo 商户订单号 - * @param orderPrice 订单金额 - * @param payWay 支付方式编码 - * @param payWayName 支付方式名称 - * @param payType 支付类型 - * @param fundIntoType 资金流入方向 - * @param feeRate 支付费率 - * @param orderIp 订单IP - * @param returnUrl 页面通知地址 - * @param notifyUrl 后台通知地址 - * @param remark 备注 - * @param field1 扩展字段1 - * @param field2 扩展字段2 - * @param field3 扩展字段3 - * @param field4 扩展字段4 - * @param field5 扩展字段5 + * + * @param merchantNo 商户编号 + * @param merchantName 商户名称 + * @param productName 产品名称 + * @param orderNo 商户订单号 + * @param orderPrice 订单金额 + * @param payWay 支付方式编码 + * @param payWayName 支付方式名称 + * @param payType 支付类型 + * @param fundIntoType 资金流入方向 + * @param feeRate 支付费率 + * @param orderIp 订单IP + * @param returnUrl 页面通知地址 + * @param notifyUrl 后台通知地址 + * @param remark 备注 + * @param field1 扩展字段1 + * @param field2 扩展字段2 + * @param field3 扩展字段3 + * @param field4 扩展字段4 + * @param field5 扩展字段5 * @return */ - private RpTradePaymentRecord sealRpTradePaymentRecord(String merchantNo, String merchantName ,String productName, String orderNo, BigDecimal orderPrice , String payWay , String payWayName , PayTypeEnum payType , String fundIntoType , BigDecimal feeRate , - String orderIp , String returnUrl, String notifyUrl, String remark, String field1, String field2, String field3, String field4, String field5){ + private RpTradePaymentRecord sealRpTradePaymentRecord(String merchantNo, String merchantName, String productName, String orderNo, BigDecimal orderPrice, String payWay, String payWayName, PayTypeEnum payType, String fundIntoType, BigDecimal feeRate, String orderIp, String returnUrl, String notifyUrl, String remark, String field1, String field2, String field3, String field4, String field5) { RpTradePaymentRecord rpTradePaymentRecord = new RpTradePaymentRecord(); - rpTradePaymentRecord.setProductName(productName);//产品名称 - rpTradePaymentRecord.setMerchantOrderNo(orderNo);//产品编号 + rpTradePaymentRecord.setProductName(productName);// 产品名称 + rpTradePaymentRecord.setMerchantOrderNo(orderNo);// 产品编号 String trxNo = buildNoService.buildTrxNo(); - rpTradePaymentRecord.setTrxNo(trxNo);//支付流水号 + rpTradePaymentRecord.setTrxNo(trxNo);// 支付流水号 String bankOrderNo = buildNoService.buildBankOrderNo(); - rpTradePaymentRecord.setBankOrderNo(bankOrderNo);//银行订单号 + rpTradePaymentRecord.setBankOrderNo(bankOrderNo);// 银行订单号 rpTradePaymentRecord.setMerchantName(merchantName); - rpTradePaymentRecord.setMerchantNo(merchantNo);//商户编号 - rpTradePaymentRecord.setOrderIp(orderIp);//下单IP - rpTradePaymentRecord.setOrderRefererUrl("");//下单前页面 - rpTradePaymentRecord.setReturnUrl(returnUrl);//页面通知地址 - rpTradePaymentRecord.setNotifyUrl(notifyUrl);//后台通知地址 - rpTradePaymentRecord.setPayWayCode(payWay);//支付通道编码 - rpTradePaymentRecord.setPayWayName(payWayName);//支付通道名称 - rpTradePaymentRecord.setTrxType(TrxTypeEnum.EXPENSE.name());//交易类型 - rpTradePaymentRecord.setOrderFrom(OrderFromEnum.USER_EXPENSE.name());//订单来源 - rpTradePaymentRecord.setOrderAmount(orderPrice);//订单金额 - rpTradePaymentRecord.setStatus(TradeStatusEnum.WAITING_PAYMENT.name());//订单状态 等待支付 - - rpTradePaymentRecord.setPayTypeCode(payType.name());//支付类型 - rpTradePaymentRecord.setPayTypeName(payType.getDesc());//支付方式 - rpTradePaymentRecord.setFundIntoType(fundIntoType);//资金流入方向 - - if (FundInfoTypeEnum.PLAT_RECEIVES.name().equals(fundIntoType)){//平台收款 需要修改费率 成本 利润 收入 以及修改商户账户信息 - BigDecimal orderAmount = rpTradePaymentRecord.getOrderAmount();//订单金额 - BigDecimal platIncome = orderAmount.multiply(feeRate).divide(BigDecimal.valueOf(100),2,BigDecimal.ROUND_HALF_UP); //平台收入 = 订单金额 * 支付费率(设置的费率除以100为真实费率) - BigDecimal platCost = orderAmount.multiply(BigDecimal.valueOf(Double.valueOf(WeixinConfigUtil.readConfig("pay_rate")))).divide(BigDecimal.valueOf(100),2,BigDecimal.ROUND_HALF_UP);//平台成本 = 订单金额 * 微信费率(设置的费率除以100为真实费率) - BigDecimal platProfit = platIncome.subtract(platCost);//平台利润 = 平台收入 - 平台成本 - - rpTradePaymentRecord.setFeeRate(feeRate);//费率 - rpTradePaymentRecord.setPlatCost(platCost);//平台成本 - rpTradePaymentRecord.setPlatIncome(platIncome);//平台收入 - rpTradePaymentRecord.setPlatProfit(platProfit);//平台利润 + rpTradePaymentRecord.setMerchantNo(merchantNo);// 商户编号 + rpTradePaymentRecord.setOrderIp(orderIp);// 下单IP + rpTradePaymentRecord.setOrderRefererUrl("");// 下单前页面 + rpTradePaymentRecord.setReturnUrl(returnUrl);// 页面通知地址 + rpTradePaymentRecord.setNotifyUrl(notifyUrl);// 后台通知地址 + rpTradePaymentRecord.setPayWayCode(payWay);// 支付通道编码 + rpTradePaymentRecord.setPayWayName(payWayName);// 支付通道名称 + rpTradePaymentRecord.setTrxType(TrxTypeEnum.EXPENSE.name());// 交易类型 + rpTradePaymentRecord.setOrderFrom(OrderFromEnum.USER_EXPENSE.name());// 订单来源 + rpTradePaymentRecord.setOrderAmount(orderPrice);// 订单金额 + rpTradePaymentRecord.setStatus(TradeStatusEnum.WAITING_PAYMENT.name());// 订单状态 + // 等待支付 + + rpTradePaymentRecord.setPayTypeCode(payType.name());// 支付类型 + rpTradePaymentRecord.setPayTypeName(payType.getDesc());// 支付方式 + rpTradePaymentRecord.setFundIntoType(fundIntoType);// 资金流入方向 + + if (FundInfoTypeEnum.PLAT_RECEIVES.name().equals(fundIntoType)) {// 平台收款 + // 需要修改费率 + // 成本 + // 利润 + // 收入 + // 以及修改商户账户信息 + BigDecimal orderAmount = rpTradePaymentRecord.getOrderAmount();// 订单金额 + BigDecimal platIncome = orderAmount.multiply(feeRate).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_HALF_UP); // 平台收入 + // = + // 订单金额 + // * + // 支付费率(设置的费率除以100为真实费率) + BigDecimal platCost = orderAmount.multiply(BigDecimal.valueOf(Double.valueOf(WeixinConfigUtil.readConfig("pay_rate")))).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_HALF_UP);// 平台成本 + // = + // 订单金额 + // * + // 微信费率(设置的费率除以100为真实费率) + BigDecimal platProfit = platIncome.subtract(platCost);// 平台利润 = 平台收入 + // - 平台成本 + + rpTradePaymentRecord.setFeeRate(feeRate);// 费率 + rpTradePaymentRecord.setPlatCost(platCost);// 平台成本 + rpTradePaymentRecord.setPlatIncome(platIncome);// 平台收入 + rpTradePaymentRecord.setPlatProfit(platProfit);// 平台利润 } - rpTradePaymentRecord.setRemark(remark);//支付备注 - rpTradePaymentRecord.setField1(field1);//扩展字段1 - rpTradePaymentRecord.setField2(field2);//扩展字段2 - rpTradePaymentRecord.setField3(field3);//扩展字段3 - rpTradePaymentRecord.setField4(field4);//扩展字段4 - rpTradePaymentRecord.setField5(field5);//扩展字段5 + rpTradePaymentRecord.setRemark(remark);// 支付备注 + rpTradePaymentRecord.setField1(field1);// 扩展字段1 + rpTradePaymentRecord.setField2(field2);// 扩展字段2 + rpTradePaymentRecord.setField3(field3);// 扩展字段3 + rpTradePaymentRecord.setField4(field4);// 扩展字段4 + rpTradePaymentRecord.setField5(field5);// 扩展字段5 return rpTradePaymentRecord; } - /** * 封装预支付实体 - * @param appId 公众号ID - * @param mchId 商户号 - * @param productName 商品描述 - * @param remark 支付备注 - * @param bankOrderNo 银行订单号 - * @param orderPrice 订单价格 - * @param orderTime 订单下单时间 - * @param orderPeriod 订单有效期 - * @param weiXinTradeTypeEnum 微信支付方式 - * @param productId 商品ID - * @param openId 用户标识 - * @param orderIp 下单IP + * + * @param appId 公众号ID + * @param mchId 商户号 + * @param productName 商品描述 + * @param remark 支付备注 + * @param bankOrderNo 银行订单号 + * @param orderPrice 订单价格 + * @param orderTime 订单下单时间 + * @param orderPeriod 订单有效期 + * @param weiXinTradeTypeEnum 微信支付方式 + * @param productId 商品ID + * @param openId 用户标识 + * @param orderIp 下单IP * @return */ - private WeiXinPrePay sealWeixinPerPay(String appId ,String mchId ,String productName ,String remark ,String bankOrderNo ,BigDecimal orderPrice , Date orderTime , Integer orderPeriod ,WeiXinTradeTypeEnum weiXinTradeTypeEnum , - String productId ,String openId ,String orderIp){ + private WeiXinPrePay sealWeixinPerPay(String appId, String mchId, String productName, String remark, String bankOrderNo, BigDecimal orderPrice, Date orderTime, Integer orderPeriod, WeiXinTradeTypeEnum weiXinTradeTypeEnum, String productId, String openId, String orderIp) { WeiXinPrePay weiXinPrePay = new WeiXinPrePay(); weiXinPrePay.setAppid(appId); weiXinPrePay.setMchId(mchId); - weiXinPrePay.setBody(productName);//商品描述 - weiXinPrePay.setAttach(remark);//支付备注 - weiXinPrePay.setOutTradeNo(bankOrderNo);//银行订单号 + weiXinPrePay.setBody(productName);// 商品描述 + weiXinPrePay.setAttach(remark);// 支付备注 + weiXinPrePay.setOutTradeNo(bankOrderNo);// 银行订单号 Integer totalFee = orderPrice.multiply(BigDecimal.valueOf(100d)).intValue(); - weiXinPrePay.setTotalFee(totalFee);//订单金额 - weiXinPrePay.setTimeStart(DateUtils.formatDate(orderTime, "yyyyMMddHHmmss"));//订单开始时间 - weiXinPrePay.setTimeExpire(DateUtils.formatDate(DateUtils.addMinute(orderTime, orderPeriod), "yyyyMMddHHmmss"));//订单到期时间 - weiXinPrePay.setNotifyUrl(WeixinConfigUtil.readConfig("notify_url"));//通知地址 - weiXinPrePay.setTradeType(weiXinTradeTypeEnum);//交易类型 - weiXinPrePay.setProductId(productId);//商品ID - weiXinPrePay.setOpenid(openId);//用户标识 - weiXinPrePay.setSpbillCreateIp(orderIp);//下单IP + weiXinPrePay.setTotalFee(totalFee);// 订单金额 + weiXinPrePay.setTimeStart(DateUtils.formatDate(orderTime, "yyyyMMddHHmmss"));// 订单开始时间 + weiXinPrePay.setTimeExpire(DateUtils.formatDate(DateUtils.addMinute(orderTime, orderPeriod), "yyyyMMddHHmmss"));// 订单到期时间 + weiXinPrePay.setNotifyUrl(WeixinConfigUtil.readConfig("notify_url"));// 通知地址 + weiXinPrePay.setTradeType(weiXinTradeTypeEnum);// 交易类型 + weiXinPrePay.setProductId(productId);// 商品ID + weiXinPrePay.setOpenid(openId);// 用户标识 + weiXinPrePay.setSpbillCreateIp(orderIp);// 下单IP return weiXinPrePay; } + + /** + * 处理交易记录 如果交易记录是成功或者本地未支付,查询上游已支付,返回TRUE 如果上游支付结果为未支付,返回FALSE + * + * @param bankOrderNo 银行订单号 + * @return + */ + @Override + public boolean processingTradeRecord(String bankOrderNo) { + RpTradePaymentRecord byBankOrderNo = rpTradePaymentRecordDao.getByBankOrderNo(bankOrderNo); + if (byBankOrderNo == null) { + LOG.info("不存在该银行订单号[{}]对应的交易记录", bankOrderNo); + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "非法订单号"); + } + LOG.info("订单号:[{}],交易类型:[{}]", byBankOrderNo.getBankOrderNo(), byBankOrderNo.getPayWayCode()); + + if (!TradeStatusEnum.WAITING_PAYMENT.name().equals(byBankOrderNo.getStatus())) { + LOG.info("该银行订单号[{}]对应的交易记录状态为:{},不需要再处理", bankOrderNo, byBankOrderNo.getStatus()); + return true; + } + + // 微信 + if (byBankOrderNo.getPayWayCode().equals(PayWayEnum.WEIXIN.name())) { + Map resultMap; + if (PayTypeEnum.WX_PROGRAM_PAY.name().equals(byBankOrderNo.getPayTypeCode())) { + LOG.info("微信--小程序订单查询!订单号:[{}]", byBankOrderNo.getBankOrderNo()); + resultMap = WeiXinPayUtils.orderQuery(byBankOrderNo.getBankOrderNo(), WeixinConfigUtil.xAppId, WeixinConfigUtil.xMchId, WeixinConfigUtil.xPayKey); + } else { + LOG.info("微信--订单查询!订单号:[{}]", byBankOrderNo.getBankOrderNo()); + resultMap = WeiXinPayUtils.orderQuery(byBankOrderNo.getBankOrderNo(), WeixinConfigUtil.appId, WeixinConfigUtil.mch_id, WeixinConfigUtil.partnerKey); + } + LOG.info("微信订单查询结果:{}", resultMap.toString()); + if (resultMap == null || resultMap.isEmpty()) { + return false; + } + Object returnCode = resultMap.get("return_code"); + // 查询失败 + if (null == returnCode || "FAIL".equals(returnCode)) { + return false; + } + // 当trade_state为SUCCESS时才返回result_code + if ("SUCCESS".equals(resultMap.get("trade_state"))) { + completeSuccessOrder(byBankOrderNo, byBankOrderNo.getBankTrxNo(), new Date(), "订单交易成功"); + return true; + } + return false; + } + + //支付宝 + if (byBankOrderNo.getPayWayCode().equals(PayWayEnum.ALIPAY.name())) { + if (PayTypeEnum.DIRECT_PAY.name().equals(byBankOrderNo.getPayTypeCode())) { + //支付宝--即时到账 + LOG.info("支付宝--即时到账订单查询!订单号:[{}]", byBankOrderNo.getBankOrderNo()); + Map resultMap = AliPayUtil.singleTradeQuery(byBankOrderNo.getBankOrderNo()); + if (resultMap.isEmpty() || !"T".equals(resultMap.get("is_success"))) { + return false; + } + // 当返回状态为“TRADE_FINISHED”交易成功结束和“TRADE_SUCCESS”支付成功时更新交易状态 + if ("TRADE_SUCCESS".equals(resultMap.get("trade_status")) || "TRADE_FINISHED".equals(resultMap.get("trade_status"))) { + completeSuccessOrder(byBankOrderNo, byBankOrderNo.getBankTrxNo(), new Date(), "订单交易成功"); + return true; + } + } else if (PayTypeEnum.F2F_PAY.name().equals(byBankOrderNo.getPayTypeCode())) { + //支付宝--条码支付 + LOG.info("支付宝--条码支付订单查询!订单号:[{}]", byBankOrderNo.getBankOrderNo()); + Map resultMap = AliPayUtil.tradeQuery(byBankOrderNo.getBankOrderNo()); + if (!"10000".equals(resultMap.get("code"))) { + return false; + } + // 当返回状态为“TRADE_FINISHED”交易成功结束和“TRADE_SUCCESS”支付成功时更新交易状态 + if ("TRADE_SUCCESS".equals(resultMap.get("tradeStatus")) || "TRADE_FINISHED".equals(resultMap.get("tradeStatus"))) { + completeSuccessOrder(byBankOrderNo, byBankOrderNo.getBankTrxNo(), new Date(), "订单交易成功"); + return true; + } + return false; + } + } + return false; + } + + /** + * 小程序支付 + * @param rpUserPayConfig + * @param programPayRequestBo + * @return + */ + @Override + public ProgramPayResultVo programPay(RpUserPayConfig rpUserPayConfig, ProgramPayRequestBo programPayRequestBo) { + + // 根据支付产品及支付方式获取费率 + PayTypeEnum payType = PayTypeEnum.getEnum(programPayRequestBo.getPayType()); + RpPayWay payWay = rpPayWayService.getByPayWayTypeCode(rpUserPayConfig.getProductCode(), payType.getWay(), payType.name()); + if (payWay == null) { + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "用户支付配置有误"); + } + + String merchantNo = rpUserPayConfig.getUserNo();// 商户编号 + RpUserInfo rpUserInfo = rpUserInfoService.getDataByMerchentNo(merchantNo); + if (rpUserInfo == null) { + throw new UserBizException(UserBizException.USER_IS_NULL, "用户不存在"); + } + + //生产订单记录 + RpTradePaymentOrder rpTradePaymentOrder = rpTradePaymentOrderDao.selectByMerchantNoAndMerchantOrderNo(merchantNo, programPayRequestBo.getOrderNo()); + if (rpTradePaymentOrder == null) { + rpTradePaymentOrder = sealProgramRpTradePaymentOrder( rpUserPayConfig , programPayRequestBo , rpUserInfo , payWay); + + rpTradePaymentOrderDao.insert(rpTradePaymentOrder); + } else { + if (TradeStatusEnum.SUCCESS.name().equals(rpTradePaymentOrder.getStatus())) { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "订单已支付成功,无需重复支付"); + } + if (rpTradePaymentOrder.getOrderAmount().compareTo(programPayRequestBo.getOrderPrice()) != 0) { + rpTradePaymentOrder.setOrderAmount(programPayRequestBo.getOrderPrice());// 如果金额不一致,修改金额为最新的金额 + } + } + + return getProgramPayResultVo(rpTradePaymentOrder, payWay, rpUserPayConfig.getPaySecret(), programPayRequestBo.getOpenId(), null); + } + + @Transactional + @Override + public AuthInitResultVo initDirectAuth(String productName, BigDecimal orderPrice, String orderIp, AuthParamVo paramVo, RpUserPayConfig userPayConfig) { + if (userPayConfig == null) { + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "用户支付配置有误"); + } + + String merchantNo = userPayConfig.getUserNo();// 商户编号 + RpUserInfo userInfo = rpUserInfoService.getDataByMerchentNo(merchantNo); + if (userInfo == null) { + throw new UserBizException(UserBizException.USER_IS_NULL, "用户不存在"); + } + + List payWayList = rpPayWayService.listByProductCode(userPayConfig.getProductCode()); + if (payWayList == null || payWayList.size() <= 0) { + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "支付产品配置有误"); + } + + Date orderDate = new Date(); + Date orderTime = orderDate; + //通知地址,因为订单为不能为空,没有什么意义 + String returnUrl = "http://www.roncoo.com"; + String notifyUrl = "http://www.roncoo.com"; + + AuthInitResultVo authInitResultVo = new AuthInitResultVo(); + RpTradePaymentOrder tradePaymentOrder = rpTradePaymentOrderDao.selectByMerchantNoAndMerchantOrderNo(merchantNo, paramVo.getOrderNo()); + if (tradePaymentOrder == null) { + tradePaymentOrder = sealRpTradePaymentOrder(merchantNo, userInfo.getUserName(), productName, paramVo.getOrderNo(), orderDate, orderTime, orderPrice, null, null, null, userPayConfig.getFundIntoType(), orderIp, 30, returnUrl, notifyUrl, paramVo.getRemark(), null, null, null, null, null); + rpTradePaymentOrderDao.insert(tradePaymentOrder); + } else { + if (TradeStatusEnum.SUCCESS.name().equals(tradePaymentOrder.getStatus())) { + authInitResultVo.setTradeStatus(TradeStatusEnum.SUCCESS); + } else if (tradePaymentOrder.getOrderAmount().compareTo(orderPrice) != 0) { + tradePaymentOrder.setOrderAmount(orderPrice);// 如果金额不一致,修改金额为最新的金额 + } + } + + RpUserBankAuth userBankAuth = userBankAuthDao.findByMerchantNoAndPayOrderNo(merchantNo, paramVo.getOrderNo()); + if (TradeStatusEnum.SUCCESS.equals(authInitResultVo.getTradeStatus())) { + if (userBankAuth == null) { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "用户鉴权非法订单请求,鉴权记录不存在!"); + } + if (AuthStatusEnum.WAITING_AUTH.name().equals(userBankAuth.getStatus()) || AuthStatusEnum.SUCCESS.name().equals(userBankAuth.getStatus()) || AuthStatusEnum.FAILED.name().equals(userBankAuth.getStatus())) { + authInitResultVo.setAuth(true); + } else { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "非法鉴权记录"); + } + } else { + if (userBankAuth == null) { + userBankAuth = new RpUserBankAuth(); + userBankAuth.setMerchantNo(merchantNo); + userBankAuth.setPayOrderNo(paramVo.getOrderNo()); + userBankAuth.setUserName(paramVo.getUserName()); + userBankAuth.setPhone(paramVo.getPhone()); + userBankAuth.setIdNo(paramVo.getIdNo()); + userBankAuth.setBankAccountNo(paramVo.getBankAccountNo()); + userBankAuth.setStatus(AuthStatusEnum.WAITING_AUTH.name()); + userBankAuth.setRemark(paramVo.getRemark()); + userBankAuthDao.insert(userBankAuth); + } else if (AuthStatusEnum.WAITING_AUTH.name().equals(userBankAuth.getStatus())) { + userBankAuth.setUserName(paramVo.getUserName()); + userBankAuth.setPhone(paramVo.getPhone()); + userBankAuth.setIdNo(paramVo.getIdNo()); + userBankAuth.setBankAccountNo(paramVo.getBankAccountNo()); + userBankAuthDao.update(userBankAuth); + } else { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "用户鉴权,非法请求"); + } + } + + authInitResultVo.setProductName(tradePaymentOrder.getProductName());// 产品名称 + authInitResultVo.setMerchantName(tradePaymentOrder.getMerchantName());// 商户名称 + authInitResultVo.setMerchantNo(merchantNo); + authInitResultVo.setOrderAmount(tradePaymentOrder.getOrderAmount());// 订单金额 + authInitResultVo.setMerchantOrderNo(tradePaymentOrder.getMerchantOrderNo());// 商户订单号 + authInitResultVo.setPayKey(paramVo.getPayKey());// 商户支付key + + Map payWayEnumMap = new HashMap(); + for (RpPayWay payWay : payWayList) { + PayTypeEnum payTypeEnum = PayTypeEnum.getEnum(payWay.getPayTypeCode()); + payWayEnumMap.put(payWay.getPayWayCode(), payTypeEnum); + } + authInitResultVo.setPayTypeEnumMap(payWayEnumMap); + return authInitResultVo; + } + + @Override + public AuthProgramInitResultVo initProgramDirectAuth(String productName, BigDecimal orderPrice, String orderIp, AuthProgramInitParamVo paramVo, RpUserPayConfig userPayConfig) { + if (userPayConfig == null) { + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "用户支付配置有误"); + } + + String merchantNo = userPayConfig.getUserNo();// 商户编号 + RpUserInfo userInfo = rpUserInfoService.getDataByMerchentNo(merchantNo); + if (userInfo == null) { + throw new UserBizException(UserBizException.USER_IS_NULL, "用户不存在"); + } + + // 根据支付产品及支付方式获取费率 + RpPayWay payWay; + PayTypeEnum payType; + LOG.info("支付[payWayCode]:{}", paramVo.getPayWayCode()); + if (PayWayEnum.WEIXIN.name().equals(paramVo.getPayWayCode())) { + payType = PayTypeEnum.WX_PROGRAM_PAY; + payWay = rpPayWayService.getByPayWayTypeCode(userPayConfig.getProductCode(), paramVo.getPayWayCode(), payType.name()); + } else { + throw new TradeBizException(TradeBizException.TRADE_PAY_WAY_ERROR, "暂不支持此支付方式"); + } + if (payWay == null) { + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "用户支付配置有误"); + } + + Date orderDate = new Date(); + Date orderTime = orderDate; + //通知地址,因为订单为不能为空,没有什么意义 + String returnUrl = "http://www.roncoo.com"; + String notifyUrl = "http://www.roncoo.com"; + + AuthProgramInitResultVo resultVo = new AuthProgramInitResultVo(); + resultVo.setMchOrderNo(paramVo.getOrderNo()); + RpTradePaymentOrder tradePaymentOrder = rpTradePaymentOrderDao.selectByMerchantNoAndMerchantOrderNo(merchantNo, paramVo.getOrderNo()); + + LOG.info("====>小程序鉴权--创建订单!"); + if (tradePaymentOrder == null) { + tradePaymentOrder = sealRpTradePaymentOrder(merchantNo, userInfo.getUserName(), productName, paramVo.getOrderNo(), orderDate, orderTime, orderPrice, null, null, null, userPayConfig.getFundIntoType(), orderIp, 30, returnUrl, notifyUrl, paramVo.getRemark(), null, null, null, null, null); + rpTradePaymentOrderDao.insert(tradePaymentOrder); + } else { + if (TradeStatusEnum.SUCCESS.name().equals(tradePaymentOrder.getStatus())) { + resultVo.setTradeStatus(TradeStatusEnum.SUCCESS); + } else if (tradePaymentOrder.getOrderAmount().compareTo(orderPrice) != 0) { + tradePaymentOrder.setOrderAmount(orderPrice);// 如果金额不一致,修改金额为最新的金额 + } + } + + RpUserBankAuth userBankAuth = userBankAuthDao.findByMerchantNoAndPayOrderNo(merchantNo, paramVo.getOrderNo()); + if (TradeStatusEnum.SUCCESS.equals(resultVo.getTradeStatus())) { + if (userBankAuth == null) { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "用户鉴权非法订单请求,鉴权记录不存在!"); + } + if (AuthStatusEnum.WAITING_AUTH.name().equals(userBankAuth.getStatus()) || AuthStatusEnum.SUCCESS.name().equals(userBankAuth.getStatus()) || AuthStatusEnum.FAILED.name().equals(userBankAuth.getStatus())) { + resultVo.setAuth(true); + } else { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "非法鉴权记录"); + } + } else { + //调用小程序支付 + ProgramPayResultVo programPayResultVo = getProgramPayResultVo(tradePaymentOrder, payWay, userPayConfig.getPaySecret(), paramVo.getOpenId(), null); + if (!PublicEnum.YES.name().equals(programPayResultVo.getStatus())) { + throw new UserBizException(UserBizException.USER_PAY_CONFIG_ERRPR, "请求小程序支付失败!"); + } + resultVo.setPayMessage(programPayResultVo.getPayMessage()); + resultVo.setBankReturnMsg(programPayResultVo.getBankReturnMsg()); + if (userBankAuth == null) { + LOG.info("小程序鉴权--创建鉴权记录!"); + userBankAuth = new RpUserBankAuth(); + userBankAuth.setMerchantNo(merchantNo); + userBankAuth.setPayOrderNo(paramVo.getOrderNo()); + userBankAuth.setUserName(paramVo.getUserName()); + userBankAuth.setPhone(paramVo.getPhone()); + userBankAuth.setIdNo(paramVo.getIdNo()); + userBankAuth.setBankAccountNo(paramVo.getBankAccountNo()); + userBankAuth.setStatus(AuthStatusEnum.WAITING_AUTH.name()); + userBankAuth.setRemark(paramVo.getRemark()); + userBankAuthDao.insert(userBankAuth); + } else if (AuthStatusEnum.WAITING_AUTH.name().equals(userBankAuth.getStatus())) { + LOG.info("小程序鉴权--鉴权记录已存在,更新记录!"); + userBankAuth.setUserName(paramVo.getUserName()); + userBankAuth.setPhone(paramVo.getPhone()); + userBankAuth.setIdNo(paramVo.getIdNo()); + userBankAuth.setBankAccountNo(paramVo.getBankAccountNo()); + userBankAuthDao.update(userBankAuth); + } else { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "用户鉴权,非法请求"); + } + } + + resultVo.setErrCode(PublicEnum.YES.name()); + Map paramMap = JSON.parseObject(JSON.toJSONString(resultVo)); + resultVo.setSign(MerchantApiUtil.getSign(paramMap, userPayConfig.getPaySecret())); + return resultVo; + } + + @Override + public AuthResultVo userAuth(String merchantNo, String orderNo) { + AuthResultVo resultVo = new AuthResultVo(); + + //查询订单 + RpTradePaymentOrder tradePaymentOrder = rpTradePaymentOrderDao.selectByMerchantNoAndMerchantOrderNo(merchantNo, orderNo); + if (tradePaymentOrder == null) { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "鉴权订单不存在"); + } + if (!TradeStatusEnum.SUCCESS.name().equals(tradePaymentOrder.getStatus())) { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "鉴权订单未支付成功"); + } + + RpUserBankAuth userBankAuth = userBankAuthDao.findByMerchantNoAndPayOrderNo(merchantNo, orderNo); + if (userBankAuth == null) { + throw new TradeBizException(TradeBizException.TRADE_ORDER_ERROR, "鉴权记录不存在"); + } + + resultVo.setMerchantNo(merchantNo); + resultVo.setOrderNo(orderNo); + resultVo.setUserName(userBankAuth.getUserName()); + resultVo.setPhone(userBankAuth.getPhone()); + resultVo.setIdNo(userBankAuth.getIdNo()); + resultVo.setBankAccountNo(userBankAuth.getBankAccountNo()); + if (AuthStatusEnum.WAITING_AUTH.name().equals(userBankAuth.getStatus())) { + LOG.info("鉴权记录,未鉴权需要再次调用鉴权接口"); + Map resultMap = AuthUtil.auth(orderNo, userBankAuth.getUserName(), userBankAuth.getPhone(), userBankAuth.getIdNo(), userBankAuth.getBankAccountNo()); + if (resultMap == null || resultMap.isEmpty()) { + resultVo.setAuthStatusEnum(AuthStatusEnum.FAILED); + return resultVo; + } + if ("0000".equals(resultMap.get("resultCode"))) { + userBankAuth.setStatus(AuthStatusEnum.SUCCESS.name()); + } else if ("9998".equals(resultMap.get("resultCode"))) { + LOG.info("鉴权返回余额不足!"); + userBankAuth.setStatus(AuthStatusEnum.WAITING_AUTH.name()); + } else { + //除了成功的,其他的状态置为失败 + userBankAuth.setStatus(AuthStatusEnum.FAILED.name()); + } + userBankAuth.setEditTime(new Date()); + userBankAuthDao.update(userBankAuth); + resultVo.setAuthStatusEnum(AuthStatusEnum.valueOf(userBankAuth.getStatus())); + } else { + LOG.info("鉴权记录,已鉴权不需要再次调用鉴权接口"); + resultVo.setAuthStatusEnum(AuthStatusEnum.valueOf(userBankAuth.getStatus())); + } + return resultVo; + } + + + /** + * 通过支付订单及商户费率生成支付记录 + * + * @param tradePaymentOrder 支付订单 + * @param payWay 商户支付配置 + * @return + */ + private ProgramPayResultVo getProgramPayResultVo(RpTradePaymentOrder tradePaymentOrder, RpPayWay payWay, String merchantPaySecret, String openId, List roncooPayGoodsDetailses) { + + ProgramPayResultVo resultVo = new ProgramPayResultVo(); + String payWayCode = payWay.getPayWayCode();// 支付方式 + + PayTypeEnum payType = null; + if (PayWayEnum.WEIXIN.name().equals(payWay.getPayWayCode())) { + payType = PayTypeEnum.WX_PROGRAM_PAY; + } else if (PayWayEnum.ALIPAY.name().equals(payWay.getPayWayCode())) { + // TODO 支付宝小程序支付,需要自定义枚举 + throw new TradeBizException(TradeBizException.TRADE_PAY_WAY_ERROR, "暂不支持此支付方式"); + } + + tradePaymentOrder.setPayTypeCode(payType.name());// 支付类型 + tradePaymentOrder.setPayTypeName(payType.getDesc());// 支付方式 + tradePaymentOrder.setPayWayCode(payWay.getPayWayCode());//支付通道编号 + tradePaymentOrder.setPayWayName(payWay.getPayWayName());//支付通道名称 + + //生成支付流水 + RpTradePaymentRecord rpTradePaymentRecord = sealRpTradePaymentRecord(tradePaymentOrder.getMerchantNo(), tradePaymentOrder.getMerchantName(), tradePaymentOrder.getProductName(), tradePaymentOrder.getMerchantOrderNo(), tradePaymentOrder.getOrderAmount(), payWay.getPayWayCode(), payWay.getPayWayName(), payType, tradePaymentOrder.getFundIntoType(), BigDecimal.valueOf(payWay.getPayRate()), tradePaymentOrder.getOrderIp(), tradePaymentOrder.getReturnUrl(), tradePaymentOrder.getNotifyUrl(), tradePaymentOrder.getRemark(), tradePaymentOrder.getField1(), tradePaymentOrder.getField2(), tradePaymentOrder.getField3(), tradePaymentOrder.getField4(), tradePaymentOrder.getField5()); + rpTradePaymentRecordDao.insert(rpTradePaymentRecord); + + if (PayWayEnum.WEIXIN.name().equals(payWayCode)) {// 微信支付 + Map resultMap = WeiXinPayUtil.appletPay(rpTradePaymentRecord.getBankOrderNo(), rpTradePaymentRecord.getProductName(), rpTradePaymentRecord.getOrderAmount(), rpTradePaymentRecord.getOrderIp(), WeixinConfigUtil.x_notify_url, openId, roncooPayGoodsDetailses); + if (resultMap == null || resultMap.isEmpty()) { + resultVo.setStatus(PublicEnum.NO.name()); + resultVo.setBankReturnMsg("请求支付失败!"); + } else { + if ("YES".equals(resultMap.get("verify"))) { + if ("SUCCESS".equals(resultMap.get("return_code")) && "SUCCESS".equals(resultMap.get("result_code"))) { + resultVo.setStatus(PublicEnum.YES.name()); + resultVo.setBankReturnMsg(String.valueOf(resultMap.get("return_msg"))); + + Object prepayId = resultMap.get("prepay_id"); + Object appid = resultMap.get("appid"); + SortedMap returnMap = new TreeMap<>(); + returnMap.put("appId", appid);//appId + returnMap.put("timeStamp", System.currentTimeMillis());//当前时间戳 + returnMap.put("nonceStr", WeiXinPayUtil.getnonceStr());//随机数 + returnMap.put("package", "prepay_id=" + prepayId);// + returnMap.put("signType", "MD5");//签名方式 + returnMap.put("paySign", WeiXinPayUtil.getSign(returnMap, WeixinConfigUtil.xPayKey)); + returnMap.remove("appId"); + String jsonString = JSON.toJSONString(returnMap); + resultVo.setPayMessage(jsonString); + resultVo.setStatus(PublicEnum.YES.name()); + //请求成功,发起轮询 + rpNotifyService.orderSend(rpTradePaymentRecord.getBankOrderNo()); + } else { + resultVo.setStatus(PublicEnum.NO.name()); + resultVo.setBankReturnMsg(String.valueOf(resultMap.get("return_msg"))); + } + } else { + resultVo.setStatus(PublicEnum.NO.name()); + resultVo.setBankReturnMsg("请求微信返回信息验签不通过!"); + } + } + } else if (PayWayEnum.ALIPAY.name().equals(payWayCode)) {// 支付宝支付 + throw new TradeBizException(TradeBizException.TRADE_PAY_WAY_ERROR, "暂不支持此支付方式"); + } + + Map paramMap = new HashMap<>(); + if (!StringUtil.isEmpty(resultVo.getPayMessage())) { + paramMap.put("payMessage", resultVo.getPayMessage());//支付信息 + } + if (!StringUtil.isEmpty(resultVo.getBankReturnMsg())) { + paramMap.put("bankReturnMsg", resultVo.getBankReturnMsg()); + } + paramMap.put("status", resultVo.getStatus()); + String sign = MerchantApiUtil.getSign(paramMap, merchantPaySecret); + resultVo.setSign(sign); + return resultVo; + } } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpTradePaymentQueryServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpTradePaymentQueryServiceImpl.java index 616cf627f701e112d31d5d985c3d8bec135eae8b..0ee86273efe935bd45b13b6f559791f58898fa3a 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpTradePaymentQueryServiceImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpTradePaymentQueryServiceImpl.java @@ -15,30 +15,29 @@ */ package com.roncoo.pay.trade.service.impl; -import java.math.BigDecimal; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.roncoo.pay.common.core.utils.DateUtils; -import com.roncoo.pay.trade.utils.MerchantApiUtil; -import com.roncoo.pay.trade.vo.PaymentOrderQueryParam; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import com.roncoo.pay.common.core.enums.PublicEnum; import com.roncoo.pay.common.core.page.PageBean; import com.roncoo.pay.common.core.page.PageParam; +import com.roncoo.pay.common.core.utils.DateUtils; import com.roncoo.pay.trade.dao.RpTradePaymentOrderDao; import com.roncoo.pay.trade.dao.RpTradePaymentRecordDao; -import com.roncoo.pay.trade.entity.RpTradePaymentOrder; -import com.roncoo.pay.trade.entity.RpTradePaymentRecord; import com.roncoo.pay.trade.enums.TradeStatusEnum; import com.roncoo.pay.trade.service.RpTradePaymentQueryService; +import com.roncoo.pay.trade.utils.MerchantApiUtil; import com.roncoo.pay.trade.vo.OrderPayResultVo; +import com.roncoo.pay.trade.vo.PaymentOrderQueryParam; import com.roncoo.pay.user.entity.RpUserPayConfig; import com.roncoo.pay.user.exception.UserBizException; import com.roncoo.pay.user.service.RpUserPayConfigService; +import com.roncoo.pay.trade.entity.RpTradePaymentOrder; +import com.roncoo.pay.trade.entity.RpTradePaymentRecord; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 功能说明:交易模块查询类实现 @@ -59,7 +58,7 @@ public class RpTradePaymentQueryServiceImpl implements RpTradePaymentQueryServic /** * 根据参数查询交易记录List - * + * * @param paramMap * @return */ @@ -102,7 +101,7 @@ public class RpTradePaymentQueryServiceImpl implements RpTradePaymentQueryServic } - private String getMerchantNotifyUrl(RpTradePaymentRecord rpTradePaymentRecord ,RpTradePaymentOrder rpTradePaymentOrder ,String sourceUrl , TradeStatusEnum tradeStatusEnum){ + private String getMerchantNotifyUrl(RpTradePaymentRecord rpTradePaymentRecord , RpTradePaymentOrder rpTradePaymentOrder , String sourceUrl , TradeStatusEnum tradeStatusEnum){ RpUserPayConfig rpUserPayConfig = rpUserPayConfigService.getByUserNo(rpTradePaymentRecord.getMerchantNo()); if (rpUserPayConfig == null){ @@ -151,17 +150,17 @@ public class RpTradePaymentQueryServiceImpl implements RpTradePaymentQueryServic /** * 根据银行订单号查询支付记录 - * + * * @param bankOrderNo * @return */ public RpTradePaymentRecord getRecordByBankOrderNo(String bankOrderNo) { return rpTradePaymentRecordDao.getByBankOrderNo(bankOrderNo); } - + /** * 根据支付流水号查询支付记录 - * + * * @param trxNo * @return */ @@ -231,4 +230,24 @@ public class RpTradePaymentQueryServiceImpl implements RpTradePaymentQueryServic return rpTradePaymentRecordDao.listPage(pageParam,paramMap); } + + /** + * 获取交易流水报表 + * + * @param merchantNo + * @return + */ + public List> getPaymentReport(String merchantNo){ + return rpTradePaymentRecordDao.getPaymentReport(merchantNo); + } + + /** + * 获取交易方式报表 + * + * @param merchantNo + * @return + */ + public List> getPayWayReport(String merchantNo){ + return rpTradePaymentRecordDao.getPayWayReport(merchantNo); + } } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpTradeReconciliationServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpTradeReconciliationServiceImpl.java index 8870dd7e17bffa233d2c949b46b9ad5037c13a82..d3e42b43fccdbded2332bf7e9d8d23772e7f6fe5 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpTradeReconciliationServiceImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpTradeReconciliationServiceImpl.java @@ -15,14 +15,6 @@ */ package com.roncoo.pay.trade.service.impl; -import java.math.BigDecimal; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - import com.roncoo.pay.account.service.RpAccountTransactionService; import com.roncoo.pay.notify.service.RpNotifyService; import com.roncoo.pay.reconciliation.entity.RpAccountCheckMistake; @@ -34,6 +26,13 @@ import com.roncoo.pay.trade.enums.TradeStatusEnum; import com.roncoo.pay.trade.enums.TrxTypeEnum; import com.roncoo.pay.trade.exception.TradeBizException; import com.roncoo.pay.trade.service.RpTradeReconciliationService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; /** * 功能说明:交易模块对账差错实现 diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpUserBankAuthServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpUserBankAuthServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..9939cf7cd2104b88cf7f6ea5b407ed3c5c920717 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/service/impl/RpUserBankAuthServiceImpl.java @@ -0,0 +1,24 @@ +package com.roncoo.pay.trade.service.impl; + +import com.roncoo.pay.trade.dao.RpUserBankAuthDao; +import com.roncoo.pay.trade.service.RpUserBankAuthService; +import com.roncoo.pay.trade.entity.RpUserBankAuth; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service("rpUserBankAuthServiceImpl") +public class RpUserBankAuthServiceImpl implements RpUserBankAuthService { + + @Autowired + private RpUserBankAuthDao userBankAuthDao; + + @Override + public RpUserBankAuth findByMerchantNoAndPayOrderNo(String merchantNo, String payOrderNo) { + return userBankAuthDao.findByMerchantNoAndPayOrderNo(merchantNo, payOrderNo); + } + + @Override + public void updateByKey(RpUserBankAuth userBankAuth) { + userBankAuthDao.update(userBankAuth); + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/AlipayConfigUtil.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/AlipayConfigUtil.java index a8ae535a8687e3d4ada404a88c0a1247ef99d204..db31c26ca8b4da565ddaa0ddfe2550b890a6fc19 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/AlipayConfigUtil.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/AlipayConfigUtil.java @@ -15,12 +15,12 @@ */ package com.roncoo.pay.trade.utils; -import java.io.IOException; -import java.util.Properties; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.io.IOException; +import java.util.Properties; + /** * 功能说明:支付宝属性文件加载工具. * diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/MD5Util.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/MD5Util.java index d0f86dc22248a6afdf65af3d1e792736a8b2566a..813a70b846d143cbfb7a5c4356db252404791bcc 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/MD5Util.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/MD5Util.java @@ -15,11 +15,11 @@ */ package com.roncoo.pay.trade.utils; -import java.security.MessageDigest; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.security.MessageDigest; + /** * 功能说明:MD5签名工具类 * diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/MerchantApiUtil.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/MerchantApiUtil.java index b28a0c04514dd97b620b5a7868fad418bb55f7a9..df62dc2cce0fb9e69b4715b05940590748754341 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/MerchantApiUtil.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/MerchantApiUtil.java @@ -15,12 +15,14 @@ */ package com.roncoo.pay.trade.utils; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; -import org.apache.commons.lang.StringUtils; - /** * 功能说明:商户API工具类 * @@ -29,7 +31,7 @@ import org.apache.commons.lang.StringUtils; */ public class MerchantApiUtil { - + private static final Logger LOG = LoggerFactory.getLogger(MerchantApiUtil.class); /** * 获取参数签名 * @param paramMap 签名参数 @@ -38,6 +40,11 @@ public class MerchantApiUtil { */ public static String getSign (Map paramMap , String paySecret){ SortedMap smap = new TreeMap(paramMap); + + if (smap.get("sign") != null) { + smap.remove("sign"); + } + StringBuffer stringBuffer = new StringBuffer(); for (Map.Entry m : smap.entrySet()) { Object value = m.getValue(); @@ -47,9 +54,11 @@ public class MerchantApiUtil { } stringBuffer.delete(stringBuffer.length() - 1, stringBuffer.length()); + LOG.info("签名原文:{}" , stringBuffer.toString()); + String argPreSign = stringBuffer.append("&paySecret=").append(paySecret).toString(); String signStr = MD5Util.encode(argPreSign).toUpperCase(); - + LOG.info("签名结果:{}" , signStr); return signStr; } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/WeiXinPayUtils.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/WeiXinPayUtils.java index 39e87fe34db6f0c3707aa62377201e877a1b1dd5..9c8e8ecf42af867cc6955280a663d64800f1759d 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/WeiXinPayUtils.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/WeiXinPayUtils.java @@ -34,10 +34,9 @@ import java.net.URL; import java.util.*; /** - * 功能说明:微信支付工具类 - * - * @author Peter - * 龙果学院(www.roncoo.com) + * 功能说明:微信支付工具类 + * + * @author Peter 龙果学院(www.roncoo.com) */ public class WeiXinPayUtils { @@ -45,6 +44,7 @@ public class WeiXinPayUtils { /** * 发送xml数据,获取返回结果 + * * @param requestUrl * @param requestMethod * @param xmlStr @@ -87,6 +87,7 @@ public class WeiXinPayUtils { for (Element e : elementList) { map.put(e.getName(), e.getText()); } + LOG.info("微信查询返回结果:"+map.toString()); inputStreamReader.close(); inputStream.close(); inputStream = null; @@ -102,14 +103,15 @@ public class WeiXinPayUtils { } /** - * 生成预支付XML + * 生成预支付XML + * * @param weiXinPrePay * @param partnerKey * @return */ - public static String getPrePayXml(WeiXinPrePay weiXinPrePay, String partnerKey){ + public static String getPrePayXml(WeiXinPrePay weiXinPrePay, String partnerKey) { - getPrePaySign(weiXinPrePay, partnerKey);//生成预支付请求签名 + getPrePaySign(weiXinPrePay, partnerKey);// 生成预支付请求签名 StringBuilder sb = new StringBuilder(); sb.append("").append(weiXinPrePay.getAppid()).append(""); @@ -118,9 +120,9 @@ public class WeiXinPayUtils { sb.append("").append(weiXinPrePay.getMchId()).append(""); sb.append("").append(weiXinPrePay.getNonceStr()).append(""); sb.append("").append(weiXinPrePay.getNotifyUrl()).append(""); - if (WeiXinTradeTypeEnum.NATIVE.name().equals(weiXinPrePay.getTradeType())){ + if (WeiXinTradeTypeEnum.NATIVE.name().equals(weiXinPrePay.getTradeType())) { sb.append("").append(weiXinPrePay.getProductId()).append(""); - }else if (WeiXinTradeTypeEnum.JSAPI.name().equals(weiXinPrePay.getTradeType())){ + } else if (WeiXinTradeTypeEnum.JSAPI.name().equals(weiXinPrePay.getTradeType())) { sb.append("").append(weiXinPrePay.getOpenid()).append(""); } sb.append("").append(weiXinPrePay.getOutTradeNo()).append(""); @@ -137,15 +139,17 @@ public class WeiXinPayUtils { /** * 微信拼接签名参数 - * @param appid 公众账号ID - * @param mch_id 商户号 - * @param device_info 设备号 - * @param trade_type 交易类型 - * @param prePay 预支付返回Map - * @param partnerKey 签名EY + * + * @param appid 公众账号ID + * @param mch_id 商户号 + * @param device_info 设备号 + * @param trade_type 交易类型 + * @param prePay 预支付返回Map + * @param partnerKey 签名EY * @return */ - public static String geWeiXintPrePaySign(String appid , String mch_id , String device_info , String trade_type , Map prePay , String partnerKey){ + public static String geWeiXintPrePaySign(String appid, String mch_id, String device_info, String trade_type, + Map prePay, String partnerKey) { Map preParams = new HashMap(); if (!StringUtil.isEmpty(prePay.get("return_code"))) { preParams.put("return_code", prePay.get("return_code")); @@ -190,24 +194,24 @@ public class WeiXinPayUtils { return preSign; } - - - public static boolean notifySign(Map result , String sign , String partnerKey) { + public static boolean notifySign(Map result, String sign, String partnerKey) { String argNotifySign = getStringByStringMap(result) + "&key=" + partnerKey; String notifySign = MD5Util.encode(argNotifySign).toUpperCase(); - if (notifySign.equals(sign)){ + if (notifySign.equals(sign)) { return true; - }else{ + } else { return false; } } + /** * 获取预支付请求签名 + * * @param weiXinPrePay * @param partnerKey * @return */ - private static void getPrePaySign(WeiXinPrePay weiXinPrePay,String partnerKey){ + private static void getPrePaySign(WeiXinPrePay weiXinPrePay, String partnerKey) { Map prePayMap = new HashMap(); prePayMap.put("appid", weiXinPrePay.getAppid());// 公众账号ID @@ -222,9 +226,9 @@ public class WeiXinPayUtils { prePayMap.put("time_expire", weiXinPrePay.getTimeExpire()); // 截止时间 prePayMap.put("notify_url", weiXinPrePay.getNotifyUrl()); // 接收财付通通知的URL prePayMap.put("trade_type", weiXinPrePay.getTradeType().name()); // 交易类型 - if (WeiXinTradeTypeEnum.NATIVE.name().equals(weiXinPrePay.getTradeType())){ - prePayMap.put("product_id", weiXinPrePay.getProductId()); //商品ID - }else if (WeiXinTradeTypeEnum.JSAPI.name().equals(weiXinPrePay.getTradeType())){ + if (WeiXinTradeTypeEnum.NATIVE.name().equals(weiXinPrePay.getTradeType())) { + prePayMap.put("product_id", weiXinPrePay.getProductId()); // 商品ID + } else if (WeiXinTradeTypeEnum.JSAPI.name().equals(weiXinPrePay.getTradeType())) { prePayMap.put("openid", weiXinPrePay.getOpenid()); // openid } @@ -233,9 +237,9 @@ public class WeiXinPayUtils { weiXinPrePay.setSign(preSign); } - /** * 根据Map获取排序拼接后的字符串 + * * @param map * @return */ @@ -259,7 +263,6 @@ public class WeiXinPayUtils { return sb.toString(); } - /** * 解析微信发来的请求(XML) * @@ -270,7 +273,7 @@ public class WeiXinPayUtils { @SuppressWarnings("unchecked") public static Map parseXml(InputStream inputStream) throws Exception { - if (inputStream == null){ + if (inputStream == null) { return null; } @@ -279,13 +282,43 @@ public class WeiXinPayUtils { Document document = reader.read(inputStream); Element root = document.getRootElement();// 得到xml根元素 List elementList = root.elements();// 得到根元素的所有子节点 - for (Element e : elementList) { // 遍历所有子节点 + for (Element e : elementList) { // 遍历所有子节点 map.put(e.getName(), e.getText()); } - inputStream.close(); // 释放资源 + inputStream.close(); // 释放资源 inputStream = null; return map; } + + /** + * 订单查询 + * + * @param outTradeNo + * @return + */ + public static Map orderQuery(String outTradeNo, String appId, String MchId, String partnerKey) { + Random random = new Random(); + Map paramMap = new HashMap<>(); + paramMap.put("appid", appId); + paramMap.put("mch_id", MchId); + String nonce_str = ""; + for (int i = 0; i < 31; i++) { + nonce_str += random.nextInt(10); + } + paramMap.put("nonce_str", nonce_str); + paramMap.put("out_trade_no", outTradeNo); + String signStr = getStringByMap(paramMap) + "&key=" + partnerKey; + paramMap.put("sign", MD5Util.encode(signStr).toUpperCase()); + Set ks = paramMap.keySet(); + StringBuilder sb = new StringBuilder(""); + for (String key : ks) { + sb.append("<" + key + ">" + paramMap.get(key) + ""); + } + sb.append(""); + Map resultMap = httpXmlRequest("https://api.mch.weixin.qq.com/pay/orderquery", "POST", + sb.toString()); + return resultMap; + } } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/WeixinConfigUtil.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/WeixinConfigUtil.java index 71504e251740638d4ae779ff2568ec206165e6e5..ab4e5fbcf4a184609d74eb7a484d1fdd44f2c813 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/WeixinConfigUtil.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/WeixinConfigUtil.java @@ -15,12 +15,12 @@ */ package com.roncoo.pay.trade.utils; -import java.io.IOException; -import java.util.Properties; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.io.IOException; +import java.util.Properties; + /** * 功能说明:微信属性文件工具类 * @@ -61,4 +61,22 @@ public class WeixinConfigUtil { public static String readConfig(String key) { return (String) properties.get(key); } + + //app_id + public static final String appId = (String) properties.get("appId"); + + //商户号 + public static final String mch_id = (String) properties.get("mch_id"); + + //商户秘钥 + public static final String partnerKey = (String) properties.get("partnerKey"); + + //小程序支付 + public static final String xAuthUrl = (String) properties.get("x_auth_url"); + public static final String xGrantType = (String) properties.get("x_grant_type"); + public static final String xAppId = (String) properties.get("x_appId"); + public static final String xPartnerKey = (String) properties.get("x_partnerKey"); + public static final String xPayKey = (String) properties.get("x_payKey"); + public static final String xMchId = (String) properties.get("x_mch_id"); + public static final String x_notify_url = (String) properties.get("x_notify_url"); } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/AliPayUtil.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/AliPayUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..12f9ca6b6ef738c2f24c0beeda7e9e889c0fb19c --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/AliPayUtil.java @@ -0,0 +1,213 @@ +package com.roncoo.pay.trade.utils.alipay; + +import com.alibaba.fastjson.JSONObject; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.request.AlipayTradePayRequest; +import com.alipay.api.request.AlipayTradeQueryRequest; +import com.alipay.api.response.AlipayTradePayResponse; +import com.alipay.api.response.AlipayTradeQueryResponse; +import com.roncoo.pay.common.core.utils.StringUtil; +import com.roncoo.pay.trade.utils.alipay.sign.MD5; +import com.roncoo.pay.reconciliation.utils.alipay.httpClient.HttpProtocolHandler; +import com.roncoo.pay.reconciliation.utils.alipay.httpClient.HttpRequest; +import com.roncoo.pay.reconciliation.utils.alipay.httpClient.HttpResponse; +import com.roncoo.pay.reconciliation.utils.alipay.httpClient.HttpResultType; +import com.roncoo.pay.trade.entity.RoncooPayGoodsDetails; +import com.roncoo.pay.trade.utils.alipay.config.AlipayConfigUtil; +import org.apache.commons.httpclient.NameValuePair; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.math.BigDecimal; +import java.util.*; + +public class AliPayUtil { + + private static final Logger logger = LoggerFactory.getLogger(AliPayUtil.class); + + private AliPayUtil() { + + } + + /** + * 支付宝被扫(扫码设备) + * + * @param outTradeNo + * @param authCode + * @param subject + * @param amount + * @param body + * @param roncooPayGoodsDetailses + * @return + */ + public static Map tradePay(String outTradeNo, String authCode, String subject, BigDecimal amount, String body, List roncooPayGoodsDetailses) { + logger.info("======>支付宝被扫"); + String charset = "UTF-8"; + String format = "json"; + String signType = "RSA2"; + String scene = "bar_code";//支付场景--条码支付 + String totalAmount = amount.toString();//订单金额 + String discountableAmount = "0.0";//默认折扣金额为0,建议由业务系统记录折扣金额,值传递给支付宝实际支付金额 + String storeId = "ykt_pay_store_id"; // (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持 + String timeExpress = "5m";// 支付超时,线下扫码交易定义为5分钟 + + AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfigUtil.trade_pay_url, AlipayConfigUtil.app_id, AlipayConfigUtil.mch_private_key, format, charset, AlipayConfigUtil.ali_public_key, signType); + + SortedMap paramMap = new TreeMap<>(); + paramMap.put("out_trade_no", outTradeNo); + paramMap.put("scene", scene); + paramMap.put("auth_code", authCode); + paramMap.put("subject", subject); + paramMap.put("total_amount", totalAmount); + paramMap.put("discountable_amount", discountableAmount); + paramMap.put("body", body); + paramMap.put("store_id", storeId); + paramMap.put("timeout_express", timeExpress); + + // 商品明细列表,需填写购买商品详细信息, + if (roncooPayGoodsDetailses != null && roncooPayGoodsDetailses.size() > 0) { + List> goodsList = new ArrayList<>(); + for (RoncooPayGoodsDetails roncooPayGoodsDetails : roncooPayGoodsDetailses) { + SortedMap goodsMap = new TreeMap<>(); + goodsMap.put("goods_id", roncooPayGoodsDetails.getGoodsId()); + goodsMap.put("goods_name", roncooPayGoodsDetails.getGoodsName()); + goodsMap.put("quantity", roncooPayGoodsDetails.getNums()); + goodsMap.put("price", roncooPayGoodsDetails.getSinglePrice()); + goodsList.add(goodsMap); + } + paramMap.put("goods_detail", goodsList); + } + + SortedMap extendParamsMap = new TreeMap<>(); + extendParamsMap.put("sys_service_provider_id", AlipayConfigUtil.partner); + paramMap.put("extend_params", extendParamsMap); + + AlipayTradePayRequest request = new AlipayTradePayRequest(); + System.out.println(JSONObject.toJSONString(paramMap)); + request.setBizContent(JSONObject.toJSONString(paramMap)); + try { + AlipayTradePayResponse response = alipayClient.execute(request); + JSONObject responseJSON = JSONObject.parseObject(JSONObject.toJSONString(response)); + logger.info("支付宝返回结果:{}", responseJSON); + return responseJSON; + } catch (AlipayApiException e) { + logger.error("支付宝扫码,支付异常:{}", e); + JSONObject resultJSON = new JSONObject(); + resultJSON.put("outTradeNo", outTradeNo); + resultJSON.put("totalAmount", amount); + resultJSON.put("errorCode", "9999"); + return resultJSON; + } + } + + /** + * 订单查询 + * + * @return + */ + public static Map tradeQuery(String outTradeNo) { + logger.info("======>支付宝交易查询"); + String charset = "UTF-8"; + String format = "json"; + String signType = "RSA2"; + AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfigUtil.trade_query_url, AlipayConfigUtil.app_id, AlipayConfigUtil.mch_private_key, format, charset, AlipayConfigUtil.ali_public_key, signType); + + SortedMap bizContentMap = new TreeMap<>(); + bizContentMap.put("out_trade_no", outTradeNo); + AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); + request.setBizContent(JSONObject.toJSONString(bizContentMap)); + try { + AlipayTradeQueryResponse response = alipayClient.execute(request); + JSONObject responseJSON = JSONObject.parseObject(JSONObject.toJSONString(response)); + logger.info("支付宝订单查询返回结果:{}", responseJSON); + return responseJSON; + } catch (AlipayApiException e) { + logger.error("支付宝交易查询异常:{}", e); + return null; + } + } + + + public static Map singleTradeQuery(String outTradeNo) { + SortedMap paramMap = new TreeMap<>(); + paramMap.put("service", "single_trade_query"); + paramMap.put("partner", AlipayConfigUtil.partner); + paramMap.put("_input_charset", AlipayConfigUtil.input_charset); + paramMap.put("out_trade_no", outTradeNo); + paramMap.put("sign", getSign(paramMap, AlipayConfigUtil.key)); + paramMap.put("sign_type", AlipayConfigUtil.sign_type); + HttpProtocolHandler httpProtocolHandler = HttpProtocolHandler.getInstance(); + HttpRequest request = new HttpRequest(HttpResultType.BYTES); + // 设置编码集 + request.setCharset(AlipayConfigUtil.input_charset); + request.setParameters(generatNameValuePair(paramMap)); + request.setUrl("https://mapi.alipay.com/gateway.do?_input_charset=" + AlipayConfigUtil.input_charset); + String strResult = null; + try { + HttpResponse response = httpProtocolHandler.execute(request, "", ""); + if (response == null) { + return null; + } + strResult = response.getStringResult(); + } catch (Exception e) { + logger.info("支付宝扫码查询--请求异常!"); + } + logger.info("支付宝扫码查询--返回结果:{}", strResult); + try { + Document document = DocumentHelper.parseText(strResult); + List tradeList = document.getRootElement().element("response").element("trade").elements(); + SortedMap responseMap = new TreeMap<>(); + for (Element ele : tradeList) { + responseMap.put(ele.getName(), ele.getText()); + } + String resultSign = getSign(responseMap, AlipayConfigUtil.key); + + String sign = document.getRootElement().element("sign").getText(); + if (resultSign.equals(sign)) { + Map resultMap = new HashMap<>(); + resultMap.putAll(responseMap); + resultMap.put("is_success",document.getRootElement().element("is_success").getText()); + return resultMap; + } else { + logger.info("支付宝--订单查询验签不通过:{},返回签名:[{}],返回报文签名:[{}]", sign, resultSign); + return null; + } + + } catch (DocumentException e) { + logger.info("支付宝扫码查询--返回结果解析失败!"); + return null; + } + } + + /** + * MAP类型数组转换成NameValuePair类型 + * + * @param properties MAP类型数组 + * @return NameValuePair类型数组 + */ + private static NameValuePair[] generatNameValuePair(SortedMap properties) { + NameValuePair[] nameValuePair = new NameValuePair[properties.size()]; + int i = 0; + for (Map.Entry entry : properties.entrySet()) { + nameValuePair[i++] = new NameValuePair(entry.getKey(), entry.getValue()); + } + + return nameValuePair; + } + + private static String getSign(SortedMap paramMap, String key) { + StringBuilder signBuilder = new StringBuilder(); + for (Map.Entry entry : paramMap.entrySet()) { + if (!"sign".equals(entry.getKey()) && !"sign_type".equals(entry.getKey()) && !StringUtil.isEmpty(entry.getValue())) { + signBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); + } + } + return MD5.sign(signBuilder.substring(0, signBuilder.length() - 1), key, "UTF-8"); + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/config/AlipayConfigUtil.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/config/AlipayConfigUtil.java index e5106e1104f98aea3f118255fc971b326fc14eab..eab6c529aff524793f8c9a2c8ad00eaa0981a47b 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/config/AlipayConfigUtil.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/config/AlipayConfigUtil.java @@ -23,81 +23,99 @@ import java.io.IOException; import java.util.Properties; /** - *类名:AlipayConfigUtil - *功能:基础配置类 - *详细:设置帐户有关信息及返回路径 - *版本:3.4 - *修改日期:2016-03-08 - *说明: - *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 - *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 + * 类名:AlipayConfigUtil + * 功能:基础配置类 + * 详细:设置帐户有关信息及返回路径 + * 版本:3.4 + * 修改日期:2016-03-08 + * 说明: + * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 + * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */ public class AlipayConfigUtil { - private static final Log LOG = LogFactory.getLog(AlipayConfigUtil.class); + private static final Log LOG = LogFactory.getLog(AlipayConfigUtil.class); + + /** + * 通过静态代码块读取上传文件的验证格式配置文件,静态代码块只执行一次(单例) + */ + private static Properties properties = new Properties(); + + /** + * 私有构造方法 + **/ + private AlipayConfigUtil() { + } + + static { + try { + // 从类路径下读取属性文件 + properties.load(AlipayConfigUtil.class.getClassLoader() + .getResourceAsStream("alipay_config.properties")); + } catch (IOException e) { + LOG.error(e); + } + } - /** - * 通过静态代码块读取上传文件的验证格式配置文件,静态代码块只执行一次(单例) - */ - private static Properties properties = new Properties(); +//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ - /** 私有构造方法 **/ - private AlipayConfigUtil(){} + // 合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm + public static final String partner = (String) properties.get("partner"); - static{ - try { - // 从类路径下读取属性文件 - properties.load(AlipayConfigUtil.class.getClassLoader() - .getResourceAsStream("alipay_config.properties")); - } catch (IOException e) { - LOG.error(e); - } - } + // 收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号 + public static final String seller_id = (String) properties.get("seller_id"); -//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ + // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm + public static final String key = (String) properties.get("key"); - // 合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm - public static final String partner = (String) properties.get("partner"); - - // 收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号 - public static final String seller_id = (String) properties.get("seller_id"); + // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 + public static final String notify_url = (String) properties.get("notify_url"); - // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm - public static final String key = (String) properties.get("key"); + // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 + public static final String return_url = (String) properties.get("return_url"); + + // 签名方式 + public static final String sign_type = (String) properties.get("sign_type"); + + // 调试用,创建TXT日志文件夹路径,见AlipayCore.java类中的logResult(String sWord)打印方法。 + public static final String log_path = (String) properties.get("log_path"); + + // 字符编码格式 目前支持 gbk 或 utf-8 + public static final String input_charset = (String) properties.get("input_charset"); + + // 支付类型 ,无需修改 + public static final String payment_type = (String) properties.get("payment_type"); - // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 - public static final String notify_url = (String) properties.get("notify_url"); + // 调用的接口名,无需修改 + public static final String service = (String) properties.get("service"); - // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 - public static final String return_url = (String) properties.get("return_url"); + //支付宝被扫地址 + public static final String trade_pay_url = (String) properties.get("trade_pay_url"); - // 签名方式 - public static final String sign_type = (String) properties.get("sign_type");; - - // 调试用,创建TXT日志文件夹路径,见AlipayCore.java类中的logResult(String sWord)打印方法。 - public static final String log_path = (String) properties.get("log_path");; - - // 字符编码格式 目前支持 gbk 或 utf-8 - public static final String input_charset = (String) properties.get("input_charset");; - - // 支付类型 ,无需修改 - public static final String payment_type = (String) properties.get("payment_type");; - - // 调用的接口名,无需修改 - public static final String service = (String) properties.get("service");; + //支付宝交易查询地址 + public static final String trade_query_url = (String) properties.get("trade_query_url"); + + //app_id + public static final String app_id = (String) properties.get("app_id"); + + //商户私钥 + public static final String mch_private_key = (String) properties.get("mch_private_key"); + + //支付宝公钥 + public static final String ali_public_key = (String) properties.get("ali_public_key"); //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ - + //↓↓↓↓↓↓↓↓↓↓ 请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ - - // 防钓鱼时间戳 若要使用请调用类文件submit中的query_timestamp函数 - public static final String anti_phishing_key = ""; - - // 客户端的IP地址 非局域网的外网IP地址,如:221.0.0.1 - public static final String exter_invoke_ip = ""; - + + // 防钓鱼时间戳 若要使用请调用类文件submit中的query_timestamp函数 + public static final String anti_phishing_key = ""; + + // 客户端的IP地址 非局域网的外网IP地址,如:221.0.0.1 + public static final String exter_invoke_ip = ""; + //↑↑↑↑↑↑↑↑↑↑请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ - + } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/f2fpay/AliF2FPaySubmit.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/f2fpay/AliF2FPaySubmit.java deleted file mode 100644 index 62db270878931f08929587a569d189632336d558..0000000000000000000000000000000000000000 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/f2fpay/AliF2FPaySubmit.java +++ /dev/null @@ -1,231 +0,0 @@ -package com.roncoo.pay.trade.utils.alipay.f2fpay; - -import com.alipay.api.AlipayResponse; -import com.alipay.api.domain.TradeFundBill; -import com.alipay.api.response.AlipayTradeQueryResponse; -import com.alipay.demo.trade.config.Configs; -import com.alipay.demo.trade.model.ExtendParams; -import com.alipay.demo.trade.model.GoodsDetail; -import com.alipay.demo.trade.model.builder.AlipayTradePayContentBuilder; -import com.alipay.demo.trade.model.result.AlipayF2FPayResult; -import com.alipay.demo.trade.model.result.AlipayF2FQueryResult; -import com.alipay.demo.trade.service.AlipayMonitorService; -import com.alipay.demo.trade.service.AlipayTradeService; -import com.alipay.demo.trade.service.impl.AlipayMonitorServiceImpl; -import com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl; -import com.alipay.demo.trade.service.impl.AlipayTradeWithHBServiceImpl; -import com.alipay.demo.trade.utils.Utils; -import com.roncoo.pay.trade.entity.RoncooPayGoodsDetails; -import com.roncoo.pay.trade.enums.TradeStatusEnum; -import com.roncoo.pay.trade.vo.F2FPayResultVo; -import com.roncoo.pay.user.enums.FundInfoTypeEnum; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Repository; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 功能说明:支付宝当面付功能提交类 - * - * - * @author Peter - * 龙果学院(www.roncoo.com) - */ -@Repository("aliF2FPaySubmit") -public class AliF2FPaySubmit { - - private static final Logger LOG = LoggerFactory.getLogger(AliF2FPaySubmit.class); - - private AlipayTradeService tradeService; - - private AlipayTradeService tradeWithHBService; - - private AlipayMonitorService monitorService; - -// static { -// /** 一定要在创建AlipayTradeService之前调用Configs.init()设置默认参数 -// * Configs会读取classpath下的alipayrisk10.properties文件配置信息,如果找不到该文件则确认该文件是否在classpath目录 -// */ -// Configs.init("zfbinfo.properties"); -// -// /** 使用Configs提供的默认参数 -// * AlipayTradeService可以使用单例或者为静态成员对象,不需要反复new -// */ -// tradeService = new AlipayTradeServiceImpl.ClientBuilder().build(); -// -// /** 支付宝当面付2.0服务(集成了交易保障接口逻辑)**/ -// tradeWithHBService = new AlipayTradeWithHBServiceImpl.ClientBuilder().build(); -// -// /** 如果需要在程序中覆盖Configs提供的默认参数, 可以使用ClientBuilder类的setXXX方法修改默认参数 否则使用代码中的默认设置 */ -// monitorService = new AlipayMonitorServiceImpl.ClientBuilder() -// .setCharset("GBK") -// .setFormat("json") -// .build(); -// } - - - /** - * 初始化当面付支付配置 - * @param appId - * @param pid - * @param privateKey - * @param publicKey - */ - public void initConfigs (String fundInfoType,String appId , String pid , String privateKey , String publicKey){ - - /** 一定要在创建AlipayTradeService之前调用Configs.init()设置默认参数 - * Configs会读取classpath下的alipayrisk10.properties文件配置信息,如果找不到该文件则确认该文件是否在classpath目录 - */ - Configs.init("zfbinfo.properties"); - - if (FundInfoTypeEnum.MERCHANT_RECEIVES.name().equals(fundInfoType)){//商户收款 - Configs.setAppid(appId); - Configs.setPid(pid); - Configs.setPrivateKey(privateKey); - Configs.setPublicKey(publicKey); - } - - /** 使用Configs提供的默认参数 - * AlipayTradeService可以使用单例或者为静态成员对象,不需要反复new - */ - tradeService = new AlipayTradeServiceImpl.ClientBuilder().build(); - - /** 支付宝当面付2.0服务(集成了交易保障接口逻辑)**/ - tradeWithHBService = new AlipayTradeWithHBServiceImpl.ClientBuilder().build(); - - /** 如果需要在程序中覆盖Configs提供的默认参数, 可以使用ClientBuilder类的setXXX方法修改默认参数 否则使用代码中的默认设置 */ - monitorService = new AlipayMonitorServiceImpl.ClientBuilder() - .setCharset("GBK") - .setFormat("json") - .build(); - } - - /** - * 支付宝当面付 - * @param outTradeNo 商户请求支付订单号 - * @param subject 订单名称 - * @param body 订单描述 - * @param authCode 支付授权码 - * @param amount 支付金额 - * @param roncooPayGoodsDetailses - */ - public Map f2fPay(String outTradeNo , String subject , String body ,String authCode , BigDecimal amount , List roncooPayGoodsDetailses) { - Map returnMap = new HashMap(); - - String totalAmount = amount.toString() ;//订单金额 - String undiscountableAmount = "0.0";//默认折扣金额为0,建议由业务系统记录折扣金额,值传递给支付宝实际支付金额 - String storeId = "roncoo_pay_store_id"; // (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持 - // 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),详情请咨询支付宝技术支持 - String providerId = "2088100200300400500"; - ExtendParams extendParams = new ExtendParams(); - extendParams.setSysServiceProviderId(providerId); - String timeExpress = "5m";// 支付超时,线下扫码交易定义为5分钟 - - // 商品明细列表,需填写购买商品详细信息, - List goodsDetailList = new ArrayList(); - if (roncooPayGoodsDetailses != null && roncooPayGoodsDetailses.size() > 0){ - for (RoncooPayGoodsDetails roncooPayGoodsDetails : roncooPayGoodsDetailses){ - // 创建一个商品信息,参数含义分别为商品id(使用国标)、名称、单价(单位为分)、数量,如果需要添加商品类别,详见GoodsDetail - GoodsDetail goods = GoodsDetail.newInstance(roncooPayGoodsDetails.getGoodsId(), roncooPayGoodsDetails.getGoodsName(), roncooPayGoodsDetails.getSinglePrice(), roncooPayGoodsDetails.getNums()); - // 创建好一个商品后添加至商品明细列表 - goodsDetailList.add(goods); - } - } - - // 创建请求builder,设置请求参数 - AlipayTradePayContentBuilder builder = new AlipayTradePayContentBuilder() - .setOutTradeNo(outTradeNo) - .setSubject(subject) - .setAuthCode(authCode) - .setTotalAmount(totalAmount) - .setStoreId(storeId) - .setUndiscountableAmount(undiscountableAmount) - .setBody(body) - .setExtendParams(extendParams) - .setGoodsDetailList(goodsDetailList) - .setTimeExpress(timeExpress); - - // 调用tradePay方法获取当面付应答 - AlipayF2FPayResult result = tradeService.tradePay(builder); - switch (result.getTradeStatus()) { - case SUCCESS: - LOG.info("支付宝支付成功: )"); - returnMap.put("status",TradeStatusEnum.SUCCESS.name()); - returnMap.put("bankTrxNo",result.getResponse().getTradeNo()); - break; - - case FAILED: - LOG.error("支付宝支付失败!!!"); - returnMap.put("status",TradeStatusEnum.FAILED.name()); - break; - - case UNKNOWN: - returnMap.put("status", TradeStatusEnum.WAITING_PAYMENT.name());//未知支付状态的订单,置为等待支付状态 - LOG.error("系统异常,订单状态未知!!!"); - break; - - default: - returnMap.put("status",TradeStatusEnum.FAILED.name()); - LOG.error("不支持的交易状态,交易返回异常!!!"); - break; - } - - returnMap.put("bankReturnMsg",result.getResponse() == null ? "" : result.getResponse().getBody());//银行返回信息 - return returnMap; - } - - - /** - * 根据商户订单号查询商户 - * @param outTradeNo - */ - public void f2fPayquery(String outTradeNo) { - - AlipayF2FQueryResult result = tradeService.queryTradeResult(outTradeNo); - switch (result.getTradeStatus()) { - case SUCCESS: - LOG.info("查询返回该订单支付成功: )"); - - AlipayTradeQueryResponse response = result.getResponse(); - dumpResponse(response); - - LOG.info(response.getTradeStatus()); - if (Utils.isListNotEmpty(response.getFundBillList())) { - for (TradeFundBill bill : response.getFundBillList()) { - LOG.info(bill.getFundChannel() + ":" + bill.getAmount()); - } - } - break; - - case FAILED: - LOG.error("查询返回该订单支付失败或被关闭!!!"); - break; - - case UNKNOWN: - LOG.error("系统异常,订单支付状态未知!!!"); - break; - - default: - LOG.error("不支持的交易状态,交易返回异常!!!"); - break; - } - } - - public void dumpResponse(AlipayResponse response) { - if (response != null) { - LOG.info(String.format("code:%s, msg:%s", response.getCode(), response.getMsg())); - if (StringUtils.isNotEmpty(response.getSubCode())) { - LOG.info(String.format("subCode:%s, subMsg:%s", response.getSubCode(), response.getSubMsg())); - } - LOG.info("body:" + response.getBody()); - } - } - - -} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/sign/MD5.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/sign/MD5.java index dfa16d6b7eab94613ae8ad64efb654c5fe7605bd..6cc08384bc5d8b5f52b94dcbc4b58a54bbfc0f13 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/sign/MD5.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/sign/MD5.java @@ -15,9 +15,10 @@ */ package com.roncoo.pay.trade.utils.alipay.sign; +import org.apache.commons.codec.digest.DigestUtils; + import java.io.UnsupportedEncodingException; import java.security.SignatureException; -import org.apache.commons.codec.digest.DigestUtils; /** * 功能:支付宝MD5签名处理核心文件,不需要修改 diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/AlipayNotify.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/AlipayNotify.java index 330948acd4a0690368d031abda9abfe1ce6b9b1f..0108eeb91f9e192b2725c0330cef02c3887a8239 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/AlipayNotify.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/AlipayNotify.java @@ -1,7 +1,7 @@ package com.roncoo.pay.trade.utils.alipay.util; -import com.roncoo.pay.trade.utils.alipay.config.AlipayConfigUtil; import com.roncoo.pay.trade.utils.alipay.sign.MD5; +import com.roncoo.pay.trade.utils.alipay.config.AlipayConfigUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/AlipaySubmit.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/AlipaySubmit.java index 8204beb56f26c9a1726b42b2735087fc10d0dbd3..f0ed599c124000e6afd7749f5da3dd3681d6e8a0 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/AlipaySubmit.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/AlipaySubmit.java @@ -1,7 +1,7 @@ package com.roncoo.pay.trade.utils.alipay.util; -import com.roncoo.pay.trade.utils.alipay.config.AlipayConfigUtil; import com.roncoo.pay.trade.utils.alipay.sign.MD5; +import com.roncoo.pay.trade.utils.alipay.config.AlipayConfigUtil; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Node; diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/UtilDate.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/UtilDate.java index 89461a19ee349f1a11d69dcddf67a36c69ad3ad5..fee688860fce35b8cfecc0e0e9932e57e22cde32 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/UtilDate.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/UtilDate.java @@ -1,10 +1,10 @@ package com.roncoo.pay.trade.utils.alipay.util; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; -import java.text.SimpleDateFormat; -import java.text.DateFormat; /* * *类名:UtilDate diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/httpClient/HttpProtocolHandler.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/httpClient/HttpProtocolHandler.java index 5dd464af13b544364e6403cd3777b8d0b30bde02..8124ec35223a8f1c6ef005e86ab29f8131f41da6 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/httpClient/HttpProtocolHandler.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/httpClient/HttpProtocolHandler.java @@ -1,24 +1,15 @@ package com.roncoo.pay.trade.utils.alipay.util.httpClient; -import org.apache.commons.httpclient.HttpException; -import java.io.IOException; -import java.net.UnknownHostException; - -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.HttpConnectionManager; -import org.apache.commons.httpclient.HttpMethod; -import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; -import org.apache.commons.httpclient.NameValuePair; +import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; -import org.apache.commons.httpclient.util.IdleConnectionTimeoutThread; -import org.apache.commons.httpclient.methods.multipart.FilePart; -import org.apache.commons.httpclient.methods.multipart.FilePartSource; -import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity; -import org.apache.commons.httpclient.methods.multipart.Part; -import org.apache.commons.httpclient.methods.multipart.StringPart; +import org.apache.commons.httpclient.methods.multipart.*; import org.apache.commons.httpclient.params.HttpMethodParams; +import org.apache.commons.httpclient.util.IdleConnectionTimeoutThread; + import java.io.File; +import java.io.IOException; +import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/httpClient/HttpRequest.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/httpClient/HttpRequest.java index 14ce25605c6eeb8f6ff68c6d731238e81c4f4729..ee0cefeef85a11108bbae13e6a99376883bc234f 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/httpClient/HttpRequest.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/alipay/util/httpClient/HttpRequest.java @@ -58,7 +58,7 @@ public class HttpRequest { /** * 请求返回的方式 */ - private HttpResultType resultType = HttpResultType.BYTES; + private HttpResultType resultType = HttpResultType.BYTES; public HttpRequest(HttpResultType resultType) { super(); diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/auth/AuthConfigUtil.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/auth/AuthConfigUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..25d8bf757008f434eb2be1581005351b62f47b57 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/auth/AuthConfigUtil.java @@ -0,0 +1,45 @@ +package com.roncoo.pay.trade.utils.auth; + +import com.roncoo.pay.trade.utils.alipay.config.AlipayConfigUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Properties; + +public class AuthConfigUtil { + + private static final Logger logger = LoggerFactory.getLogger(AuthConfigUtil.class); + + private static Properties properties = new Properties(); + + private static final String CONF_URL = "auth_config.properties"; + + public static String PAYKEY = ""; + public static String PAYSECRET = ""; + public static String AUTHURL = ""; + public static String AUTH_ORDER_QUERY_URL = ""; + public static String AUTH_AMOUNT = ""; + + private AuthConfigUtil() { + + } + + static { + try { + // 从类路径下读取属性文件 + properties.load(AlipayConfigUtil.class.getClassLoader().getResourceAsStream(CONF_URL)); + init(); + } catch (IOException e) { + logger.error("鉴权配置文件加载失败!{}", e); + } + } + + private static void init() { + PAYKEY = properties.getProperty("pay_key"); + PAYSECRET = properties.getProperty("pay_secret"); + AUTHURL = properties.getProperty("auth_url"); + AUTH_ORDER_QUERY_URL = properties.getProperty("auth_order_query_url"); + AUTH_AMOUNT = properties.getProperty("auth_amount"); + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/auth/AuthUtil.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/auth/AuthUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..00c46166446b4a5a5bff273880c25a3274706445 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/auth/AuthUtil.java @@ -0,0 +1,122 @@ +package com.roncoo.pay.trade.utils.auth; + +import com.alibaba.fastjson.JSON; +import com.roncoo.pay.common.core.utils.StringUtil; +import com.roncoo.pay.trade.utils.MD5Util; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.NameValuePair; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.params.HttpConnectionManagerParams; +import org.apache.commons.httpclient.params.HttpMethodParams; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; + +/** + * 鉴权工具类 + */ +public class AuthUtil { + + private static final Logger logger = LoggerFactory.getLogger(AuthUtil.class); + + private static final String PRODUCTTYPE = "13000104";//产品类型 + + private AuthUtil() { + + } + + public static Map auth(String orderNo, String name, String phone, String idNo, String bankAccountNo) { + + SortedMap paramMap = new TreeMap<>(); + paramMap.put("payKey", AuthConfigUtil.PAYKEY); + paramMap.put("outTradeNo", orderNo); + paramMap.put("productType", PRODUCTTYPE); + paramMap.put("orderTime", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())); + paramMap.put("name", name); + paramMap.put("accountNo", bankAccountNo); + paramMap.put("certNo", idNo); + paramMap.put("phone", phone); + paramMap.put("sign", getSign(paramMap, AuthConfigUtil.PAYSECRET)); + Map resultMap = request(paramMap, AuthConfigUtil.AUTHURL); + if (resultMap == null || resultMap.isEmpty()) { + return null; + } + SortedMap responseMap = new TreeMap<>(); + for (Map.Entry entry : resultMap.entrySet()) { + responseMap.put(entry.getKey(), String.valueOf(entry.getValue())); + } + String resultSign = getSign(responseMap, AuthConfigUtil.PAYSECRET); + if (resultSign.equals(resultMap.get("sign"))) { + return resultMap; + } else { + logger.error("鉴权返回结果验签失败,返回签名:[{}],结果签名:[{}]", resultMap.get("sign"), resultSign); + return null; + } + } + + /** + * post请求 + * + * @param paramMap 请求参数 + * @param requestUrl 请求地址 + * @return + */ + private static Map request(SortedMap paramMap, String requestUrl) { + logger.info("鉴权请求地址:[{}],请求参数:[{}]", requestUrl, paramMap); + HttpClient httpClient = new HttpClient(); + HttpConnectionManagerParams managerParams = httpClient.getHttpConnectionManager().getParams(); + // 设置连接超时时间(单位毫秒) + managerParams.setConnectionTimeout(9000); + // 设置读数据超时时间(单位毫秒) + managerParams.setSoTimeout(12000); + PostMethod postMethod = new PostMethod(requestUrl); + postMethod.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8"); + NameValuePair[] pairs = new NameValuePair[paramMap.size()]; + int i = 0; + for (Map.Entry entry : paramMap.entrySet()) { + pairs[i++] = new NameValuePair(entry.getKey(), entry.getValue()); + } + postMethod.setRequestBody(pairs); + try { + Integer code = httpClient.executeMethod(postMethod); + if (code.compareTo(200) == 0) { + String result = postMethod.getResponseBodyAsString(); + logger.info("鉴权请求成功,同步返回数据:{}", result); + return JSON.parseObject(result); + } else { + logger.error("鉴权请求失败,返回状态码:[{}]", code); + } + } catch (IOException e) { + logger.info("鉴权请求异常:{}", e); + return null; + } + return null; + } + + /** + * 签名 + * + * @param paramMap 签名参数 + * @param paySecret 签名秘钥 + * @return + */ + private static String getSign(SortedMap paramMap, String paySecret) { + StringBuilder signBuilder = new StringBuilder(); + for (Map.Entry entry : paramMap.entrySet()) { + if (!"sign".equals(entry.getKey()) && entry.getValue() != null && !StringUtil.isEmpty(entry.getValue())) { + signBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); + } + } + signBuilder.append("paySecret=").append(paySecret); + logger.info("鉴权签名原文:[{}]", signBuilder); + String sign = MD5Util.encode(signBuilder.toString()).toUpperCase(); + logger.info("鉴权签名结果:[{}]", sign); + return sign; + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/httpclient/HttpClientWrapper.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/httpclient/HttpClientWrapper.java index 70feaa329a8ccd08b0ab6efde633275cfd716890..8be10ebcb61d5db2b0013ba7a9d782c0f32143f1 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/httpclient/HttpClientWrapper.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/httpclient/HttpClientWrapper.java @@ -66,10 +66,10 @@ public interface HttpClientWrapper { * @throws IOException */ public String doRequest(MethodType method, String url, - Map params, String charset) throws HttpException, + Map params, String charset) throws HttpException, IOException; /** - * + * * @param method * @param url * @param charset @@ -82,7 +82,7 @@ public interface HttpClientWrapper { /** * 无返回值 实现HttpResponseCallBack接口 对流进行处理封转返回值 外部可以利用到流来得到结果 主要考虑的是多线程下载的情况 - * + * * @param method * @param url * @param params @@ -90,16 +90,16 @@ public interface HttpClientWrapper { * @throws HttpException * @throws IOException */ - + // HttpResponseCallBack 是设置的一个回调类 ,主要是考虑由于httpClient 返回的流 当连接关闭时流也关闭了 // 所以利用回调的方式在流关闭之间嵌入用户代码,来操做流 public void doRequest(HttpResponseCallBack callback, MethodType method, - String url, Map params, String charset) + String url, Map params, String charset) throws HttpException, IOException; /** * 无返回值 外部可以利用到流来得到结果 主要考虑的是多线程下载的情况 - * + * * @param method * @param url * @param charset @@ -111,6 +111,6 @@ public interface HttpClientWrapper { // HttpResponseCallBack 是设置的一个回调类 ,主要是考虑由于httpClient 返回的流 当连接关闭时流也关闭了 // 所以利用回调的方式在流关闭之间嵌入用户代码,来操做流 public void doRequest(HttpResponseCallBack callback, MethodType method, - String url, String charset) throws HttpException, IOException; + String url, String charset) throws HttpException, IOException; } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/httpclient/SimpleHttpParam.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/httpclient/SimpleHttpParam.java index 11f24859eb88609ccdf4779c954451736fefcf66..3cb74361d15f6b6a6e76011ac9c4afd1deb4940a 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/httpclient/SimpleHttpParam.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/httpclient/SimpleHttpParam.java @@ -78,7 +78,7 @@ public class SimpleHttpParam { /** * 客户端信任的证书 */ - private TrustKeyStore TrustKeyStore; + private com.roncoo.pay.trade.utils.httpclient.TrustKeyStore TrustKeyStore; /** * 如果需要验证服务端证书,是否验证host与证书匹配 */ @@ -169,10 +169,10 @@ public class SimpleHttpParam { public void setClientKeyStore(ClientKeyStore clientKeyStore) { this.clientKeyStore = clientKeyStore; } - public TrustKeyStore getTrustKeyStore() { + public com.roncoo.pay.trade.utils.httpclient.TrustKeyStore getTrustKeyStore() { return TrustKeyStore; } - public void setTrustKeyStore(TrustKeyStore trustKeyStore) { + public void setTrustKeyStore(com.roncoo.pay.trade.utils.httpclient.TrustKeyStore trustKeyStore) { TrustKeyStore = trustKeyStore; } public boolean isHostnameVerify() { diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/httpclient/SimpleHttpUtils.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/httpclient/SimpleHttpUtils.java index f8acf2e3aba6858fbdf2d40586135f1290b7147c..c8013982a96919eda2cd180bd484d4f4944d8f55 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/httpclient/SimpleHttpUtils.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/httpclient/SimpleHttpUtils.java @@ -15,8 +15,8 @@ */ package com.roncoo.pay.trade.utils.httpclient; -import org.apache.commons.io.output.ByteArrayOutputStream; -import org.apache.log4j.Logger; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import javax.net.ssl.*; import java.io.*; @@ -39,7 +39,7 @@ import java.util.Map.Entry; * 龙果学院(www.roncoo.com) */ public class SimpleHttpUtils { - private static final Logger logger = Logger.getLogger(SimpleHttpUtils.class); + private static final Log logger = LogFactory.getLog(SimpleHttpUtils.class); /** * 默认字符编码 diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/weixin/WeiXinPayUtil.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/weixin/WeiXinPayUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..3fb4efc238e6f64c3d8dc80b5e0d443b60880bf2 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/utils/weixin/WeiXinPayUtil.java @@ -0,0 +1,175 @@ +package com.roncoo.pay.trade.utils.weixin; + +import com.alibaba.fastjson.JSONObject; +import com.roncoo.pay.common.core.utils.StringUtil; +import com.roncoo.pay.trade.utils.MD5Util; +import com.roncoo.pay.trade.utils.WeixinConfigUtil; +import com.roncoo.pay.trade.entity.RoncooPayGoodsDetails; +import com.roncoo.pay.trade.utils.WeiXinPayUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.math.BigDecimal; +import java.util.*; + +public class WeiXinPayUtil { + + private static final Logger logger = LoggerFactory.getLogger(WeiXinPayUtil.class); + + private WeiXinPayUtil() { + + } + + /** + * 微信被扫(扫码设备) + * + * @param outTradeNo + * @param body + * @param totalAmount + * @param spbillCreateIp + * @param authCode + * @return + */ + public static Map micropay(String outTradeNo, String body, BigDecimal totalAmount, String spbillCreateIp, String authCode) { + String nonce_str = getnonceStr(); + Integer total_fee = totalAmount.multiply(BigDecimal.valueOf(100L)).intValue(); + + SortedMap paramMap = new TreeMap<>(); + paramMap.put("appid", WeixinConfigUtil.appId); + paramMap.put("mch_id", WeixinConfigUtil.mch_id); + paramMap.put("nonce_str", nonce_str); + paramMap.put("sign_type", "MD5"); + paramMap.put("body", body); + paramMap.put("out_trade_no", outTradeNo); + paramMap.put("total_fee", total_fee); + paramMap.put("fee_type", "CNY"); + paramMap.put("spbill_create_ip", spbillCreateIp); + paramMap.put("auth_code", authCode); + paramMap.put("sign", getSign(paramMap, WeixinConfigUtil.partnerKey)); + String data = mapToXml(paramMap); + logger.info("微信条码请求报文:{}", data); + Map resultMap = WeiXinPayUtils.httpXmlRequest("https://api.mch.weixin.qq.com/pay/micropay", "POST", data); + logger.info("微信条码返回报文:{}", resultMap); + if (resultMap == null || resultMap.isEmpty()) { + return null; + } + SortedMap responseMap = new TreeMap<>(); + responseMap.putAll(resultMap); + String resultSign = getSign(responseMap, WeixinConfigUtil.partnerKey); + if (resultSign.equals(resultMap.get("sign"))) { + resultMap.put("verify", "YES"); + } else { + logger.info("返回报文验签失败,返回报文签名:{},返回签名:{}", resultSign, resultMap.get("sign")); + resultMap.put("verify", "NO"); + } + return resultMap; + } + + /** + * 小程序支付 + * + * @return + */ + public static Map appletPay(String outTradeNo, String body, BigDecimal totalAmount, String spbillCreateIp, String notifyUrl, String openid, List goodsDetails) { + String nonce_str = getnonceStr(); + Integer totalFee = totalAmount.multiply(BigDecimal.valueOf(100L)).intValue(); + String tradeType = "JSAPI"; + + SortedMap paramMap = new TreeMap<>(); + paramMap.put("appid", WeixinConfigUtil.xAppId); + paramMap.put("mch_id", WeixinConfigUtil.xMchId); + paramMap.put("nonce_str", nonce_str); + paramMap.put("sign_type", "MD5"); + paramMap.put("body", body); + paramMap.put("out_trade_no", outTradeNo); + paramMap.put("total_fee", totalFee); + paramMap.put("spbill_create_ip", spbillCreateIp); + paramMap.put("notify_url", notifyUrl); + paramMap.put("trade_type", tradeType); + paramMap.put("openid", openid); + if (goodsDetails != null && !goodsDetails.isEmpty()) { + List> goodList = new ArrayList<>(); + for (RoncooPayGoodsDetails goodsDetail : goodsDetails) { + SortedMap goodsDetailMap = new TreeMap<>(); + goodsDetailMap.put("goods_id", goodsDetail.getGoodsId()); + goodsDetailMap.put("quantity", goodsDetail.getNums()); + goodsDetailMap.put("goods_name", goodsDetail.getGoodsName()); + goodsDetailMap.put("price", goodsDetail.getSinglePrice()); + goodList.add(goodsDetailMap); + } + JSONObject goodsDetailJson = new JSONObject(); + goodsDetailJson.put("goods_detail", goodList); + paramMap.put("detail", goodsDetailJson.toJSONString()); + } + paramMap.put("sign", getSign(paramMap, WeixinConfigUtil.xPayKey)); + String data = mapToXml(paramMap); + logger.info("微信小程序统一下单,请求报文:{}", data); + Map resultMap = WeiXinPayUtils.httpXmlRequest("https://api.mch.weixin.qq.com/pay/unifiedorder", "POST", data); + logger.info("微信小程序统一下单,返回报文:{}", resultMap); + if (resultMap == null || resultMap.isEmpty()) { + return null; + } + SortedMap responseMap = new TreeMap<>(); + responseMap.putAll(resultMap); + String resultSign = getSign(responseMap, WeixinConfigUtil.xPayKey); + if (resultSign.equals(resultMap.get("sign"))) { + resultMap.put("verify", "YES"); + } else { + logger.info("返回报文验签失败,返回报文签名:{},返回签名:{}", resultSign, resultMap.get("sign")); + resultMap.put("verify", "NO"); + } + return resultMap; + } + + /** + * 生成随机字符串 + * + * @return + */ + public static String getnonceStr() { + Random random = new Random(); + StringBuilder nonceStrBuilder = new StringBuilder(); + for (int i = 0; i < 31; i++) { + nonceStrBuilder.append(random.nextInt(10)); + } + return nonceStrBuilder.toString(); + } + + /** + * 签名 + * + * @param paramMap + * @param key + * @return + */ + public static String getSign(SortedMap paramMap, String key) { + StringBuilder signBuilder = new StringBuilder(); + for (Map.Entry entry : paramMap.entrySet()) { + if (!"sign".equals(entry.getKey()) && !StringUtil.isEmpty(entry.getValue())) { + signBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); + } + } + signBuilder.append("key=").append(key); + logger.info("微信待签名参数字符串:{}", signBuilder.toString()); + return MD5Util.encode(signBuilder.toString()).toUpperCase(); + } + + /** + * 转xml格式 + * + * @param paramMap + * @return + */ + private static String mapToXml(SortedMap paramMap) { + StringBuilder dataBuilder = new StringBuilder(""); + for (Map.Entry entry : paramMap.entrySet()) { + if (!StringUtil.isEmpty(entry.getValue())) { + dataBuilder.append("<").append(entry.getKey()).append(">").append(entry.getValue()).append(""); + } + } + dataBuilder.append(""); + logger.info("Map转Xml结果:{}", dataBuilder.toString()); + return dataBuilder.toString(); + } + +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/AuthInitResultVo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/AuthInitResultVo.java new file mode 100644 index 0000000000000000000000000000000000000000..6899a7c973a99e3ac7f1b7e483dc797519f237d7 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/AuthInitResultVo.java @@ -0,0 +1,130 @@ +package com.roncoo.pay.trade.vo; + +import com.roncoo.pay.common.core.enums.PayTypeEnum; +import com.roncoo.pay.common.core.enums.PayWayEnum; +import com.roncoo.pay.trade.enums.TradeStatusEnum; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Map; + +public class AuthInitResultVo implements Serializable { + + private static final long serialVersionUID = 3312403855750120397L; + /** + * 订单金额 + */ + private BigDecimal orderAmount; + + /** + * 产品名称 + */ + private String productName; + + /** + * 商户名称 + */ + private String merchantName; + + /** + * 商户号 + */ + private String merchantNo; + + /** + * 商户订单号 + */ + private String merchantOrderNo; + + /** + * + */ + private String payKey; + + /** + * 支付方式列表 + */ + private Map payTypeEnumMap; + + /** + * 订单状态 + */ + private TradeStatusEnum tradeStatus = TradeStatusEnum.WAITING_PAYMENT; + + /** + * 是否鉴权 + */ + private boolean isAuth = false; + + public BigDecimal getOrderAmount() { + return orderAmount; + } + + public void setOrderAmount(BigDecimal orderAmount) { + this.orderAmount = orderAmount; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getMerchantName() { + return merchantName; + } + + public void setMerchantName(String merchantName) { + this.merchantName = merchantName; + } + + public String getMerchantNo() { + return merchantNo; + } + + public void setMerchantNo(String merchantNo) { + this.merchantNo = merchantNo; + } + + public String getMerchantOrderNo() { + return merchantOrderNo; + } + + public void setMerchantOrderNo(String merchantOrderNo) { + this.merchantOrderNo = merchantOrderNo; + } + + public String getPayKey() { + return payKey; + } + + public void setPayKey(String payKey) { + this.payKey = payKey; + } + + public TradeStatusEnum getTradeStatus() { + return tradeStatus; + } + + public void setTradeStatus(TradeStatusEnum tradeStatus) { + this.tradeStatus = tradeStatus; + } + + public boolean isAuth() { + return isAuth; + } + + public void setAuth(boolean auth) { + isAuth = auth; + } + + public Map getPayTypeEnumMap() { + return payTypeEnumMap; + } + + public void setPayTypeEnumMap(Map payTypeEnumMap) { + this.payTypeEnumMap = payTypeEnumMap; + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/AuthParamVo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/AuthParamVo.java new file mode 100644 index 0000000000000000000000000000000000000000..fb1d9fd971114bd148940c27e54829572069fd9b --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/AuthParamVo.java @@ -0,0 +1,126 @@ +package com.roncoo.pay.trade.vo; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; + +public class AuthParamVo implements Serializable { + + private static final long serialVersionUID = -428316450503841861L; + /** + * 支付Key + */ + @Size(max = 32, message = "支付Key[payKey]长度最大32位") + @NotNull(message = "支付Key[payKey]不能为空") + private String payKey; + + /** + * 订单号 + */ + @Size(max = 32, message = "订单号[orderNo]长度最大32位") + @NotNull(message = "订单号[orderNo]不能为空") + private String orderNo; + + /** + * 用户姓名 + */ + @Size(max = 50, message = "用户姓名[userName]长度最大50位") + @NotNull(message = "用户姓名[userName]不能为空") + private String userName; + + /** + * 手机号 + */ + @Size(max = 11, message = "手机号码[phone]长度最大11位") + @NotNull(message = "手机号码[phone]不能为空") + private String phone; + + /** + * 身份证号 + */ + @Size(max = 18, message = "身份证号[idNo]长度最大18位") + @NotNull(message = "身份证号[idNo]不能为空") + private String idNo; + + /** + * 银行卡号 + */ + @Size(max = 20, message = "银行卡号[bankAccountNo]长度最大20位") + @NotNull(message = "银行卡号[bankAccountNo]不能为空") + private String bankAccountNo; + + /** + * 备注 + */ + private String remark; + + /** + * 签名 + */ + @NotNull(message = "数据签名[sign]不能为空") + private String sign; + + public String getPayKey() { + return payKey; + } + + public void setPayKey(String payKey) { + this.payKey = payKey; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getIdNo() { + return idNo; + } + + public void setIdNo(String idNo) { + this.idNo = idNo; + } + + public String getBankAccountNo() { + return bankAccountNo; + } + + public void setBankAccountNo(String bankAccountNo) { + this.bankAccountNo = bankAccountNo; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/AuthProgramInitParamVo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/AuthProgramInitParamVo.java new file mode 100644 index 0000000000000000000000000000000000000000..aaf6bdb48cdcbbe4c4090d3585f30b2031856227 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/AuthProgramInitParamVo.java @@ -0,0 +1,148 @@ +package com.roncoo.pay.trade.vo; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; + +public class AuthProgramInitParamVo implements Serializable{ + + private static final long serialVersionUID = 8312768816414393880L; + /** + * 支付Key + */ + @Size(max = 32, message = "支付Key[payKey]长度最大32位") + @NotNull(message = "支付Key[payKey]不能为空") + private String payKey; + + /** + * 订单号 + */ + @Size(max = 32, message = "订单号[orderNo]长度最大32位") + @NotNull(message = "订单号[orderNo]不能为空") + private String orderNo; + + /** + * 用户姓名 + */ + @Size(max = 50, message = "用户姓名[userName]长度最大50位") + @NotNull(message = "用户姓名[userName]不能为空") + private String userName; + + /** + * 手机号 + */ + @Size(max = 11, message = "手机号码[phone]长度最大11位") + @NotNull(message = "手机号码[phone]不能为空") + private String phone; + + /** + * 身份证号 + */ + @Size(max = 18, message = "身份证号[idNo]长度最大18位") + @NotNull(message = "身份证号[idNo]不能为空") + private String idNo; + + /** + * 银行卡号 + */ + @Size(max = 20, message = "银行卡号[bankAccountNo]长度最大20位") + @NotNull(message = "银行卡号[bankAccountNo]不能为空") + private String bankAccountNo; + + @NotNull(message = "用户标识[openId]不能为空") + private String openId; + + @NotNull(message = "支付类型[payWayCode]不能为空") + private String payWayCode; + + /** + * 备注 + */ + private String remark; + + /** + * 签名 + */ + @NotNull(message = "数据签名[sign]不能为空") + private String sign; + + public String getPayKey() { + return payKey; + } + + public void setPayKey(String payKey) { + this.payKey = payKey; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getIdNo() { + return idNo; + } + + public void setIdNo(String idNo) { + this.idNo = idNo; + } + + public String getBankAccountNo() { + return bankAccountNo; + } + + public void setBankAccountNo(String bankAccountNo) { + this.bankAccountNo = bankAccountNo; + } + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public String getPayWayCode() { + return payWayCode; + } + + public void setPayWayCode(String payWayCode) { + this.payWayCode = payWayCode; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/AuthProgramInitResultVo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/AuthProgramInitResultVo.java new file mode 100644 index 0000000000000000000000000000000000000000..6457ca1c14d00fe7dd55ce20fd32608960f97ee8 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/AuthProgramInitResultVo.java @@ -0,0 +1,98 @@ +package com.roncoo.pay.trade.vo; + +import com.roncoo.pay.trade.enums.TradeStatusEnum; + +import java.io.Serializable; + +public class AuthProgramInitResultVo implements Serializable { + + private static final long serialVersionUID = -5167161500901848253L; + + private String mchOrderNo; + + /** + * 交易状态 YES 成功,其他失败 + */ + private String errCode; + + /** + * 支付信息 + */ + private String payMessage; + + /** + * 银行返回信息 + */ + private String bankReturnMsg; + + /** + * 订单状态 + */ + private TradeStatusEnum tradeStatus = TradeStatusEnum.WAITING_PAYMENT; + + /** + * 是否鉴权 + */ + private boolean isAuth = false; + + /** + * 签名结果 + */ + private String sign; + + public String getMchOrderNo() { + return mchOrderNo; + } + + public void setMchOrderNo(String mchOrderNo) { + this.mchOrderNo = mchOrderNo; + } + + public String getErrCode() { + return errCode; + } + + public void setErrCode(String errCode) { + this.errCode = errCode; + } + + public String getPayMessage() { + return payMessage; + } + + public void setPayMessage(String payMessage) { + this.payMessage = payMessage; + } + + public String getBankReturnMsg() { + return bankReturnMsg; + } + + public void setBankReturnMsg(String bankReturnMsg) { + this.bankReturnMsg = bankReturnMsg; + } + + public TradeStatusEnum getTradeStatus() { + return tradeStatus; + } + + public void setTradeStatus(TradeStatusEnum tradeStatus) { + this.tradeStatus = tradeStatus; + } + + public boolean isAuth() { + return isAuth; + } + + public void setAuth(boolean auth) { + isAuth = auth; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/AuthResultVo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/AuthResultVo.java new file mode 100644 index 0000000000000000000000000000000000000000..f021f8757438dfe6e10e6d291388b6ac28e3a706 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/AuthResultVo.java @@ -0,0 +1,90 @@ +package com.roncoo.pay.trade.vo; + +import com.roncoo.pay.trade.enums.AuthStatusEnum; + +import java.io.Serializable; + +public class AuthResultVo implements Serializable { + + private static final long serialVersionUID = 841503118815819232L; + + private String merchantNo; + + private String orderNo; + + private String userName; + + private String phone; + + private String idNo; + + private String bankAccountNo; + + private AuthStatusEnum authStatusEnum; + + private String authMsg; + + public String getMerchantNo() { + return merchantNo; + } + + public void setMerchantNo(String merchantNo) { + this.merchantNo = merchantNo; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getIdNo() { + return idNo; + } + + public void setIdNo(String idNo) { + this.idNo = idNo; + } + + public String getBankAccountNo() { + return bankAccountNo; + } + + public void setBankAccountNo(String bankAccountNo) { + this.bankAccountNo = bankAccountNo; + } + + public AuthStatusEnum getAuthStatusEnum() { + return authStatusEnum; + } + + public void setAuthStatusEnum(AuthStatusEnum authStatusEnum) { + this.authStatusEnum = authStatusEnum; + } + + public String getAuthMsg() { + return authMsg; + } + + public void setAuthMsg(String authMsg) { + this.authMsg = authMsg; + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/F2FPayResultVo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/F2FPayResultVo.java index 82b472ef1c0e4ef6ead772ab5a3869ffba73de37..eadcb169a24564fa947fe19a55390a3d6e18c890 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/F2FPayResultVo.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/F2FPayResultVo.java @@ -1,7 +1,5 @@ package com.roncoo.pay.trade.vo; -import com.roncoo.pay.trade.enums.TradeStatusEnum; - /** * 功能说明: * diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/OrderPayResultVo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/OrderPayResultVo.java index fbe249f239d5907ab6e7ad3769659d72343b8ca9..998dd8006514197bc1c434d0d2f2dc05afe944d2 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/OrderPayResultVo.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/OrderPayResultVo.java @@ -15,7 +15,7 @@ */ package com.roncoo.pay.trade.vo; -import com.roncoo.pay.common.core.enums.PublicEnum; +import com.roncoo.pay.trade.enums.TradeStatusEnum; import java.io.Serializable; import java.math.BigDecimal; @@ -29,7 +29,7 @@ import java.math.BigDecimal; public class OrderPayResultVo implements Serializable { /** 状态 **/ - private String status = PublicEnum.NO.name(); + private String status = TradeStatusEnum.WAITING_PAYMENT.name(); /** 金额 **/ private BigDecimal orderPrice; diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/PaymentOrderQueryParam.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/PaymentOrderQueryParam.java index 5587a9d56ff154fb88fcde67f44de0cebaca8d4d..722af7933dab15bc523cd17e72097eef725332fa 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/PaymentOrderQueryParam.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/PaymentOrderQueryParam.java @@ -16,7 +16,6 @@ package com.roncoo.pay.trade.vo; import java.io.Serializable; -import java.util.Date; /** * 功能说明:支付订单查询条件实体 diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/ProgramPayResultVo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/ProgramPayResultVo.java new file mode 100644 index 0000000000000000000000000000000000000000..1923a33d160af0bcbefb2d7e5612855594cb3fa5 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/ProgramPayResultVo.java @@ -0,0 +1,63 @@ +package com.roncoo.pay.trade.vo; + +import java.io.Serializable; + +/** + * 小程序支付返回实体 + */ +public class ProgramPayResultVo implements Serializable { + + private static final long serialVersionUID = 651601163997960632L; + + /** + * 交易状态 + */ + private String status; + + /** + * 支付信息 + */ + private String payMessage; + + /** + * 银行返回信息 + */ + private String bankReturnMsg; + + /** + * 签名结果 + */ + private String sign; + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getPayMessage() { + return payMessage; + } + + public void setPayMessage(String payMessage) { + this.payMessage = payMessage; + } + + public String getBankReturnMsg() { + return bankReturnMsg; + } + + public void setBankReturnMsg(String bankReturnMsg) { + this.bankReturnMsg = bankReturnMsg; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/RpPayGateWayPageShowVo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/RpPayGateWayPageShowVo.java index 925996aa21643349b6a6833d56f301aff4620e8c..6e032877f68bbaa11c6181f21497218dd9ccd58c 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/RpPayGateWayPageShowVo.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/trade/vo/RpPayGateWayPageShowVo.java @@ -15,6 +15,7 @@ */ package com.roncoo.pay.trade.vo; +import com.roncoo.pay.common.core.enums.PayTypeEnum; import com.roncoo.pay.common.core.enums.PayWayEnum; import java.math.BigDecimal; @@ -44,7 +45,7 @@ public class RpPayGateWayPageShowVo { private String payKey; /** 支付方式列表 **/ - private Map payWayEnumMap; + private Map payTypeEnumMap; public BigDecimal getOrderAmount() { return orderAmount; @@ -70,14 +71,6 @@ public class RpPayGateWayPageShowVo { this.merchantName = merchantName; } - public Map getPayWayEnumMap() { - return payWayEnumMap; - } - - public void setPayWayEnumMap(Map payWayEnumMap) { - this.payWayEnumMap = payWayEnumMap; - } - public String getMerchantOrderNo() { return merchantOrderNo; } @@ -93,4 +86,12 @@ public class RpPayGateWayPageShowVo { public void setPayKey(String payKey) { this.payKey = payKey; } + + public Map getPayTypeEnumMap() { + return payTypeEnumMap; + } + + public void setPayTypeEnumMap(Map payTypeEnumMap) { + this.payTypeEnumMap = payTypeEnumMap; + } } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/BuildNoDao.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/BuildNoDao.java index d4a99c80bc3d1bf3688ded8ccf08efe86412d0dd..1ec4d09c58d795e1f98c064849671541da611012 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/BuildNoDao.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/BuildNoDao.java @@ -1,12 +1,12 @@ /* * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -25,6 +25,5 @@ import com.roncoo.pay.user.entity.SeqBuild; */ public interface BuildNoDao extends BaseDao { - public String getSeqNextValue(SeqBuild seqBuild); } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/BuildNoDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/BuildNoDaoImpl.java index 04735041f977b12c8d86ec091d28bd2a2b4ddc3e..b1acc6cb866c78b842709481af5a34658823ff6d 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/BuildNoDaoImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/BuildNoDaoImpl.java @@ -1,12 +1,12 @@ /* * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,11 +15,10 @@ */ package com.roncoo.pay.user.dao.impl; -import org.springframework.stereotype.Repository; - import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl; import com.roncoo.pay.user.dao.BuildNoDao; import com.roncoo.pay.user.entity.SeqBuild; +import org.springframework.stereotype.Repository; /** * 生成编号dao实现类 @@ -29,8 +28,4 @@ import com.roncoo.pay.user.entity.SeqBuild; @Repository public class BuildNoDaoImpl extends BaseDaoImpl implements BuildNoDao { - @Override - public String getSeqNextValue(SeqBuild seqBuild) { - return super.getSqlSession().selectOne(getStatement("getSeqNextValue"),seqBuild); - } } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpPayProductDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpPayProductDaoImpl.java index 49bcfcfa459e74378ca15def635d692d62c3cf0c..e254fbc7b6a985d22cfce16ec044b15121d5d595 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpPayProductDaoImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpPayProductDaoImpl.java @@ -15,11 +15,10 @@ */ package com.roncoo.pay.user.dao.impl; -import org.springframework.stereotype.Repository; - import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl; import com.roncoo.pay.user.dao.RpPayProductDao; import com.roncoo.pay.user.entity.RpPayProduct; +import org.springframework.stereotype.Repository; /** * 支付产品dao实现类 @@ -27,5 +26,5 @@ import com.roncoo.pay.user.entity.RpPayProduct; * @author:zenghao */ @Repository -public class RpPayProductDaoImpl extends BaseDaoImpl implements RpPayProductDao{ +public class RpPayProductDaoImpl extends BaseDaoImpl implements RpPayProductDao { } \ No newline at end of file diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpPayWayDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpPayWayDaoImpl.java index 7749f833a5d338a88a4e34c9e4d7249e62819479..42fbcc4784bef7ff4118bb077afab6b271596992 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpPayWayDaoImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpPayWayDaoImpl.java @@ -15,11 +15,10 @@ */ package com.roncoo.pay.user.dao.impl; -import org.springframework.stereotype.Repository; - import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl; import com.roncoo.pay.user.dao.RpPayWayDao; import com.roncoo.pay.user.entity.RpPayWay; +import org.springframework.stereotype.Repository; /** * 支付方式dao实现类 diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserBankAccountDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserBankAccountDaoImpl.java index 6081aeece6d901c9079daf2958f9f5756db54f2f..089e246ce6e45ea111c13a24a6788f358766e71a 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserBankAccountDaoImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserBankAccountDaoImpl.java @@ -15,11 +15,10 @@ */ package com.roncoo.pay.user.dao.impl; -import org.springframework.stereotype.Repository; - import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl; import com.roncoo.pay.user.dao.RpUserBankAccountDao; import com.roncoo.pay.user.entity.RpUserBankAccount; +import org.springframework.stereotype.Repository; /** * 用户银行账户dao实现类 diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserInfoDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserInfoDaoImpl.java index f9aaf43d0902a2cd2fa98844ba0a21715bfa0534..20e02008e94c004500458ab2ff15973647f89bb9 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserInfoDaoImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserInfoDaoImpl.java @@ -15,11 +15,10 @@ */ package com.roncoo.pay.user.dao.impl; -import org.springframework.stereotype.Repository; - import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl; import com.roncoo.pay.user.dao.RpUserInfoDao; import com.roncoo.pay.user.entity.RpUserInfo; +import org.springframework.stereotype.Repository; /** * 用户信息dao实现类 @@ -27,5 +26,5 @@ import com.roncoo.pay.user.entity.RpUserInfo; * @author:zenghao */ @Repository -public class RpUserInfoDaoImpl extends BaseDaoImpl implements RpUserInfoDao{ +public class RpUserInfoDaoImpl extends BaseDaoImpl implements RpUserInfoDao { } \ No newline at end of file diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserPayConfigDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserPayConfigDaoImpl.java index 9ccbf8da620e32f0317d11592898efb8c60db664..c3341ad05c6319e15a696bb373b3323f50f6e833 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserPayConfigDaoImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserPayConfigDaoImpl.java @@ -15,15 +15,14 @@ */ package com.roncoo.pay.user.dao.impl; -import java.util.HashMap; -import java.util.Map; - -import org.springframework.stereotype.Repository; - import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl; import com.roncoo.pay.common.core.enums.PublicStatusEnum; import com.roncoo.pay.user.dao.RpUserPayConfigDao; import com.roncoo.pay.user.entity.RpUserPayConfig; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.Map; /** * 用户支付配置dao实现类 @@ -31,7 +30,7 @@ import com.roncoo.pay.user.entity.RpUserPayConfig; * @author:zenghao */ @Repository -public class RpUserPayConfigDaoImpl extends BaseDaoImpl implements RpUserPayConfigDao{ +public class RpUserPayConfigDaoImpl extends BaseDaoImpl implements RpUserPayConfigDao { @Override public RpUserPayConfig getByUserNo(String userNo, String auditStatus) { Map paramMap = new HashMap(); diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserPayInfoDaoImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserPayInfoDaoImpl.java index b81387f03d375eed4c43633aba7c7a4de9d11b05..457791c2279697d9613a664e99a3ee1b77e235f1 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserPayInfoDaoImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/dao/impl/RpUserPayInfoDaoImpl.java @@ -15,11 +15,10 @@ */ package com.roncoo.pay.user.dao.impl; -import org.springframework.stereotype.Repository; - import com.roncoo.pay.common.core.dao.impl.BaseDaoImpl; import com.roncoo.pay.user.dao.RpUserPayInfoDao; import com.roncoo.pay.user.entity.RpUserPayInfo; +import org.springframework.stereotype.Repository; import java.util.HashMap; import java.util.Map; @@ -30,7 +29,7 @@ import java.util.Map; * @author:zenghao */ @Repository -public class RpUserPayInfoDaoImpl extends BaseDaoImpl implements RpUserPayInfoDao{ +public class RpUserPayInfoDaoImpl extends BaseDaoImpl implements RpUserPayInfoDao { /** * 通过商户编号获取商户第三方支付信息 * diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpPayProduct.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpPayProduct.java index a8710c9dc0208999a3dc55302aee64c62f8d1296..65fa8f884fc8ced72871288db22ae7acd0bc7314 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpPayProduct.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpPayProduct.java @@ -15,11 +15,11 @@ */ package com.roncoo.pay.user.entity; -import java.io.Serializable; - import com.roncoo.pay.common.core.entity.BaseEntity; import com.roncoo.pay.common.core.enums.PublicEnum; +import java.io.Serializable; + /** * 支付产品实体类 * 龙果学院:www.roncoo.com diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpPayWay.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpPayWay.java index 42c01e0e5f44498893d016de49aea3fcc2e4ed25..56a63dcea5c49492ae3f77afcc612506d7387c7a 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpPayWay.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpPayWay.java @@ -15,10 +15,10 @@ */ package com.roncoo.pay.user.entity; -import java.io.Serializable; - import com.roncoo.pay.common.core.entity.BaseEntity; +import java.io.Serializable; + /** * 支付方式实体类 * 龙果学院:www.roncoo.com diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserBankAccount.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserBankAccount.java index 87cb400a6c7698ecb9fac5469df092472d0b5afd..dc9b44732b88bfa35dd0bc137d087484aa35673c 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserBankAccount.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserBankAccount.java @@ -24,8 +24,6 @@ import com.roncoo.pay.common.core.entity.BaseEntity; */ public class RpUserBankAccount extends BaseEntity { - private static final long serialVersionUID = 1L; - /** 银行卡开户所在省 **/ private String province; diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserInfo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserInfo.java index 59c6eec1dbeb6287d80f6a8a4923a147754f97f3..204181ad8ca25ae05f5c55be6f412b19768ddefe 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserInfo.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserInfo.java @@ -15,11 +15,11 @@ */ package com.roncoo.pay.user.entity; -import java.io.Serializable; - import com.roncoo.pay.common.core.entity.BaseEntity; import com.roncoo.pay.common.core.enums.PublicStatusEnum; +import java.io.Serializable; + /** * 用户信息 * 龙果学院:www.roncoo.com @@ -34,9 +34,38 @@ public class RpUserInfo extends BaseEntity implements Serializable { private String accountNo; private static final long serialVersionUID = 1L; + + private String mobile; + + private String password; + /** 支付密码 */ + private String payPwd; + + public String getPayPwd() { + return payPwd; + } + + public void setPayPwd(String payPwd) { + this.payPwd = payPwd; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } - public String getUserNo() { + public String getUserNo() { return userNo; } diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserPayConfig.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserPayConfig.java index ff2e6ca08360bcfb2030143231ed636b6bc057ac..506e7e6abb6592c61f0639e4dd86853e05ad1224 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserPayConfig.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserPayConfig.java @@ -15,12 +15,13 @@ */ package com.roncoo.pay.user.entity; -import java.io.Serializable; - import com.roncoo.pay.common.core.entity.BaseEntity; import com.roncoo.pay.common.core.enums.PublicEnum; +import com.roncoo.pay.common.core.enums.SecurityRatingEnum; import com.roncoo.pay.user.enums.FundInfoTypeEnum; +import java.io.Serializable; + /** * 用户支付配置实体类 * 龙果学院:www.roncoo.com @@ -49,6 +50,13 @@ public class RpUserPayConfig extends BaseEntity implements Serializable { private String paySecret; + /** 安全等级 **/ + private String securityRating = SecurityRatingEnum.MD5.name(); + + + /**商户服务器IP **/ + private String merchantServerIp; + public String getPaySecret() { return paySecret; } @@ -138,4 +146,20 @@ public class RpUserPayConfig extends BaseEntity implements Serializable { public String getFundIntoTypeDesc() { return FundInfoTypeEnum.getEnum(this.getFundIntoType()).getDesc(); } + + public String getSecurityRating() { + return securityRating; + } + + public void setSecurityRating(String securityRating) { + this.securityRating = securityRating; + } + + public String getMerchantServerIp() { + return merchantServerIp; + } + + public void setMerchantServerIp(String merchantServerIp) { + this.merchantServerIp = merchantServerIp; + } } \ No newline at end of file diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserPayInfo.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserPayInfo.java index d944f61fd9ca1e24c5b515a071ed2a901312bb7f..04a12dd8d9a37317cd355883c18bf21aebb8fd8f 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserPayInfo.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserPayInfo.java @@ -15,10 +15,10 @@ */ package com.roncoo.pay.user.entity; -import java.io.Serializable; - import com.roncoo.pay.common.core.entity.BaseEntity; +import java.io.Serializable; + /** * 用户第三方支付信息实体类 * 龙果学院:www.roncoo.com diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserQuickPayBankAccount.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserQuickPayBankAccount.java new file mode 100644 index 0000000000000000000000000000000000000000..089b102279f8d4789cf2ed04213f92b9886cf6fd --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/RpUserQuickPayBankAccount.java @@ -0,0 +1,202 @@ +package com.roncoo.pay.user.entity; + +import com.roncoo.pay.common.core.entity.BaseEntity; +import com.roncoo.pay.common.core.enums.PublicStatusEnum; +import com.roncoo.pay.common.core.utils.StringUtil; + +/** + * + * 类功能说明:快捷支付银行卡
+ * 类修改者:
+ * 修改日期:
+ * 修改说明:
+ * 公司名称:广州市领课科技有限公司
+ * 作者:shenjialong
+ * 创建时间:2016年12月27日
+ * 版本:V1.0
+ */ +public class RpUserQuickPayBankAccount extends BaseEntity { + + /** 银行卡开户所在省 **/ + private String province; + + /** 银行卡开户所在城市 **/ + private String city; + + /** 银行卡开户所在区 **/ + private String areas; + + /** 银行卡开户名eg:张三 **/ + private String bankAccountName; + + /** 银行卡卡号 **/ + private String bankAccountNo; + + /** 银行卡类型 **/ + private String bankAccountType; + + /** 证件类型 **/ + private String cardType; + + /** 证件号码 **/ + private String cardNo; + + /** 手机号码 **/ + private String mobileNo; + + /** 银行名称 **/ + private String bankName; + + /** 银行编号eg:ICBC **/ + private String bankCode; + + /** 用户编号 **/ + private String userNo; + + /** CVN2信用卡确认码 **/ + private String cvn2; + + /** 信用卡到期时间 **/ + private String expDate; + + /** 是否默认 **/ + private String isDefault; + /** 是否认证 **/ + private String isAuth; + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getAreas() { + return areas; + } + + public void setAreas(String areas) { + this.areas = areas; + } + + public String getBankAccountName() { + return bankAccountName; + } + + public void setBankAccountName(String bankAccountName) { + this.bankAccountName = bankAccountName; + } + + public String getBankAccountNo() { + return bankAccountNo; + } + + public void setBankAccountNo(String bankAccountNo) { + this.bankAccountNo = bankAccountNo; + } + + public String getBankAccountType() { + return bankAccountType; + } + + public void setBankAccountType(String bankAccountType) { + this.bankAccountType = bankAccountType; + } + + public String getCardType() { + return cardType; + } + + public void setCardType(String cardType) { + this.cardType = cardType; + } + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public String getMobileNo() { + return mobileNo; + } + + public void setMobileNo(String mobileNo) { + this.mobileNo = mobileNo; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getBankCode() { + return bankCode; + } + + public void setBankCode(String bankCode) { + this.bankCode = bankCode; + } + + public String getUserNo() { + return userNo; + } + + public void setUserNo(String userNo) { + this.userNo = userNo; + } + + public String getCvn2() { + return cvn2; + } + + public void setCvn2(String cvn2) { + this.cvn2 = cvn2; + } + + public String getExpDate() { + return expDate; + } + + public void setExpDate(String expDate) { + this.expDate = expDate; + } + + public String getIsDefault() { + return isDefault; + } + + public void setIsDefault(String isDefault) { + this.isDefault = isDefault; + } + + public String getIsAuth() { + return isAuth; + } + + public void setIsAuth(String isAuth) { + this.isAuth = isAuth; + } + + public String getStatusDesc() { + if (StringUtil.isEmpty(this.getStatus())) { + return ""; + } else { + return PublicStatusEnum.getEnum(this.getStatus()).getDesc(); + } + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/SeqBuild.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/SeqBuild.java index b80c55f5ec1975110bc42c6524ec5b25dc706a03..f4c9cddda3ac9f476a27ca72c18599a926e9f260 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/SeqBuild.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/entity/SeqBuild.java @@ -15,10 +15,10 @@ */ package com.roncoo.pay.user.entity; -import java.io.Serializable; - import com.roncoo.pay.common.core.entity.BaseEntity; +import java.io.Serializable; + /** * 此实体没有关联的表,只作用于序列查找时传参使用 * 龙果学院:www.roncoo.com diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/enums/BusCategoryEnum.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/enums/BusCategoryEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..b6de6a2905f6ef1f25eaa779c453e4b05948ffa8 --- /dev/null +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/enums/BusCategoryEnum.java @@ -0,0 +1,194 @@ +/* + * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.roncoo.pay.user.enums; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 经营类目枚举 + * 龙果学院:www.roncoo.com + * @author:zenghao + */ +public enum BusCategoryEnum { + + XXLS("1001","线下零售","0","5000","0","24"),//线下零售 + + CYSP("1002","餐饮/食品","0","2000","7","24"),//餐饮、食品 + + PWLY("1003","票务/旅游","0","999","0","24"),//票务、旅游 + + JYPX("1004","教育/培训","1000","5000","0","24"),//教育、培训 + + YLJSFW("1006","娱乐/健身服务","0","1000","0","24"),//生活、健身服务 + + YL("1007","医疗","0","1500","0","24"),//医疗 + + SCPM("1008","收藏/拍卖","1000","5000","9","21"), + + WLKD("1009","物流/快递","0","300","9","20"), + + GY("1010","公益","0","500","9","20"), + + TX("1011","通讯","0","500","0","24"), + + JRBX("1012","金融/保险","500","5000","0","24"), + + WLXNFW("1013","网络虚拟服务","0","5000","0","24"), + + SHJF("1014","生活缴费","0","1000","0","24"), + + JD("1015","酒店","200","5000","0","24"), + + JJ("1016","家居","200","5000","0","24"), + + DSTG("1017","电商团购","0","5000","0","24"), + QT("1018","其他","0","5000","0","24"); + + /** 编码*/ + private String code; + /** 描述 */ + private String desc; + /** 最低金额*/ + private String minAmount; + /** 最大金额*/ + private String maxAmount; + /** 开始时间*/ + private String beginTime; + /** 结束时间*/ + private String endTime; + + public String getMinAmount() { + return minAmount; + } + + public void setMinAmount(String minAmount) { + this.minAmount = minAmount; + } + + public String getMaxAmount() { + return maxAmount; + } + + public void setMaxAmount(String maxAmount) { + this.maxAmount = maxAmount; + } + + public String getBeginTime() { + return beginTime; + } + + public void setBeginTime(String beginTime) { + this.beginTime = beginTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + + + private BusCategoryEnum(String code,String desc,String minAmount,String maxAmount,String beginTime,String endTime) { + this.code = code; + this.desc = desc; + this.minAmount = minAmount; + this.maxAmount = maxAmount; + this.beginTime = beginTime; + this.endTime = endTime; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public static BusCategoryEnum getEnum(String enumName) { + BusCategoryEnum resultEnum = null; + BusCategoryEnum[] enumAry = BusCategoryEnum.values(); + for (int i = 0; i < enumAry.length; i++) { + if (enumAry[i].name().equals(enumName)) { + resultEnum = enumAry[i]; + break; + } + } + return resultEnum; + } + + public static Map> toMap() { + BusCategoryEnum[] ary = BusCategoryEnum.values(); + Map> enumMap = new HashMap>(); + for (int num = 0; num < ary.length; num++) { + Map map = new HashMap(); + String key = ary[num].name(); + map.put("desc", ary[num].getDesc()); + enumMap.put(key, map); + } + return enumMap; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static List toList() { + BusCategoryEnum[] ary = BusCategoryEnum.values(); + List list = new ArrayList(); + for (int i = 0; i < ary.length; i++) { + Map map = new HashMap(); + map.put("name", ary[i].name()); + map.put("desc", ary[i].getDesc()); + map.put("minAmount", ary[i].getMinAmount()); + map.put("maxAmount", ary[i].getMaxAmount()); + map.put("beginTime", ary[i].getBeginTime()); + map.put("endTime", ary[i].getEndTime()); + list.add(map); + } + return list; + } + + /** + * 取枚举的json字符串 + * + * @return + */ + public static String getJsonStr() { + BusCategoryEnum[] enums = BusCategoryEnum.values(); + StringBuffer jsonStr = new StringBuffer("["); + for (BusCategoryEnum senum : enums) { + if (!"[".equals(jsonStr.toString())) { + jsonStr.append(","); + } + jsonStr.append("{id:'").append(senum).append("',desc:'").append(senum.getDesc()).append("'}"); + } + jsonStr.append("]"); + return jsonStr.toString(); + } +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/exception/PayBizException.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/exception/PayBizException.java index e39fd813f36a922d4957994ca093854453c77611..fd1ed94425f1a9de80fbee2c296ab5d65c5c254b 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/exception/PayBizException.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/exception/PayBizException.java @@ -1,12 +1,12 @@ /* * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -16,7 +16,6 @@ package com.roncoo.pay.user.exception; import com.roncoo.pay.common.core.exception.BizException; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -27,32 +26,45 @@ import org.apache.commons.logging.LogFactory; */ public class PayBizException extends BizException { - /** 支付方式已存在 **/ + /** + * + */ + private static final long serialVersionUID = -7163126205323125757L; + + /** 支付方式已存在 **/ public static final int PAY_TYPE_IS_EXIST = 101; - + /** 支付产品已存在 **/ public static final int PAY_PRODUCT_IS_EXIST = 102; - + /** 支付产品已关联数据 **/ public static final int PAY_PRODUCT_HAS_DATA = 103; - + /** 用户支付配置已存在 **/ public static final int USER_PAY_CONFIG_IS_EXIST = 104; - + /** 用户支付配置不存在 **/ public static final int USER_PAY_CONFIG_IS_NOT_EXIST = 105; - + /** 用户支付配置已生效 **/ public static final int USER_PAY_CONFIG_IS_EFFECTIVE = 106; - + /** 支付产品已生效 **/ public static final int PAY_PRODUCT_IS_EFFECTIVE = 107; - + /** 支付产品不存在 **/ public static final int PAY_PRODUCT_IS_NOT_EXIST = 108; - + /** 支付方式不存在 **/ - public static final int PAY_TYPE_IS_NOT_EXIST = 108; + public static final int PAY_TYPE_IS_NOT_EXIST = 109; + + /** 请求参数异常 **/ + public static final int REQUEST_PARAM_ERR = 110; + + /** + * 请求银行异常 + */ + public static final int REQUEST_BANK_ERR = 111; private static final Log LOG = LogFactory.getLog(PayBizException.class); diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/exception/UserBizException.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/exception/UserBizException.java index c2da7201dfad4eb2114f065453cd10044016e849..a4e3ba08867dad0f46f205fcfd6e7e2906565014 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/exception/UserBizException.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/exception/UserBizException.java @@ -15,11 +15,10 @@ */ package com.roncoo.pay.user.exception; +import com.roncoo.pay.common.core.exception.BizException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import com.roncoo.pay.common.core.exception.BizException; - /** * 用户业务异常类 * 龙果学院:www.roncoo.com @@ -27,7 +26,12 @@ import com.roncoo.pay.common.core.exception.BizException; */ public class UserBizException extends BizException { - /** 用户不存在 **/ + /** + * + */ + private static final long serialVersionUID = -6402548375645868682L; + + /** 用户不存在 **/ public static final int USER_IS_NULL = 101; /** 用户支付配置有误 **/ diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpPayProductService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpPayProductService.java index 75faeb9e72999f8829191eaf2d27b96efd72c0d5..478e0bda4eaf16c88aab66e07b84ec7404ad4cb9 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpPayProductService.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpPayProductService.java @@ -15,12 +15,12 @@ */ package com.roncoo.pay.user.service; -import java.util.List; - import com.roncoo.pay.common.core.page.PageBean; import com.roncoo.pay.common.core.page.PageParam; -import com.roncoo.pay.user.entity.RpPayProduct; import com.roncoo.pay.user.exception.PayBizException; +import com.roncoo.pay.user.entity.RpPayProduct; + +import java.util.List; /** * 支付产品service接口 diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpPayWayService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpPayWayService.java index 44756ab6da2a0caf9db8517eb8629e995ebd1d86..4498c4718a35c65ac184a089aab739ba71b6c1ac 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpPayWayService.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpPayWayService.java @@ -15,12 +15,12 @@ */ package com.roncoo.pay.user.service; -import java.util.List; - import com.roncoo.pay.common.core.page.PageBean; import com.roncoo.pay.common.core.page.PageParam; -import com.roncoo.pay.user.entity.RpPayWay; import com.roncoo.pay.user.exception.PayBizException; +import com.roncoo.pay.user.entity.RpPayWay; + +import java.util.List; /** * 支付方式service接口 diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpUserInfoService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpUserInfoService.java index 9ab743156fb506ec12e21c347e84c909e9c17676..78c6b6c81bd42700f41f23974d53046d85d69f33 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpUserInfoService.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpUserInfoService.java @@ -15,12 +15,12 @@ */ package com.roncoo.pay.user.service; -import java.util.List; - import com.roncoo.pay.common.core.page.PageBean; import com.roncoo.pay.common.core.page.PageParam; import com.roncoo.pay.user.entity.RpUserInfo; +import java.util.List; + /** * 用户信息service接口 * 龙果学院:www.roncoo.com @@ -60,9 +60,13 @@ public interface RpUserInfoService{ * * @param userName * 用户名 + * @param mobile + * 手机号 + * @param password + * 密码 * @return */ - void registerOffline(String userName) ; + void registerOffline(String userName, String mobile, String password) ; /** * 根据商户编号获取商户信息 @@ -71,6 +75,13 @@ public interface RpUserInfoService{ */ RpUserInfo getDataByMerchentNo(String merchantNo); + /** + * 根据手机号获取商户信息 + * @param mobile + * @return + */ + RpUserInfo getDataByMobile(String mobile); + /** * 获取所有用户 * @return diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpUserPayConfigService.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpUserPayConfigService.java index 9a24e633fb68694be060135ba701c5273e11c68d..7d6c03059a0ecf1e69266bb92fa65dd987d01761 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpUserPayConfigService.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/RpUserPayConfigService.java @@ -15,12 +15,12 @@ */ package com.roncoo.pay.user.service; -import java.util.List; - import com.roncoo.pay.common.core.page.PageBean; import com.roncoo.pay.common.core.page.PageParam; -import com.roncoo.pay.user.entity.RpUserPayConfig; import com.roncoo.pay.user.exception.PayBizException; +import com.roncoo.pay.user.entity.RpUserPayConfig; + +import java.util.List; /** * 用户支付配置service接口 @@ -85,21 +85,35 @@ public interface RpUserPayConfigService{ * 创建用户支付配置 */ void createUserPayConfig(String userNo, String userName, String productCode, String productName, Integer riskDay, String fundIntoType, - String isAutoSett, String appId, String merchantId, String partnerKey, String ali_partner, String ali_sellerId, String ali_key, - String ali_appid, String ali_rsaPrivateKey, String ali_rsaPublicKey) throws PayBizException; - + String isAutoSett, String appId, String merchantId, String partnerKey, String ali_partner, String ali_sellerId, String ali_key, + String ali_appid, String ali_rsaPrivateKey, String ali_rsaPublicKey) throws PayBizException; + + /** + * 创建用户支付配置 + */ + void createUserPayConfig(String userNo, String userName, String productCode, String productName, Integer riskDay, String fundIntoType, + String isAutoSett, String appId, String merchantId, String partnerKey, String ali_partner, String ali_sellerId, String ali_key, + String ali_appid, String ali_rsaPrivateKey, String ali_rsaPublicKey, String securityRating, String merchantServerIp) throws PayBizException; + /** * 删除支付产品 * @param userNo */ void deleteUserPayConfig(String userNo) throws PayBizException; - + + /** + * 修改用户支付配置 + */ + void updateUserPayConfig(String userNo, String productCode, String productName, Integer riskDay, String fundIntoType, + String isAutoSett, String appId, String merchantId, String partnerKey, String ali_partner, String ali_sellerId, String ali_key, + String ali_appid, String ali_rsaPrivateKey, String ali_rsaPublicKey) throws PayBizException; + /** * 修改用户支付配置 */ void updateUserPayConfig(String userNo, String productCode, String productName, Integer riskDay, String fundIntoType, - String isAutoSett, String appId, String merchantId, String partnerKey, String ali_partner, String ali_sellerId, String ali_key, - String ali_appid, String ali_rsaPrivateKey, String ali_rsaPublicKey) throws PayBizException; + String isAutoSett, String appId, String merchantId, String partnerKey, String ali_partner, String ali_sellerId, String ali_key, + String ali_appid, String ali_rsaPrivateKey, String ali_rsaPublicKey, String securityRating, String merchantServerIp) throws PayBizException; /** * 审核 diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/BuildNoServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/BuildNoServiceImpl.java index 38dfb1a998c99fd22d3f68d1ae414b9cdb918281..d98a98ac94eb4065aff21765a922e50f1ca48d6a 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/BuildNoServiceImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/BuildNoServiceImpl.java @@ -1,12 +1,12 @@ /* * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,21 +15,13 @@ */ package com.roncoo.pay.user.service.impl; -import java.util.Date; - +import com.baomidou.mybatisplus.toolkit.IdWorker; +import com.roncoo.pay.user.service.BuildNoService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.alibaba.druid.util.StringUtils; -import com.roncoo.pay.common.core.exception.BizException; -import com.roncoo.pay.common.core.utils.DateUtils; -import com.roncoo.pay.user.dao.BuildNoDao; -import com.roncoo.pay.user.entity.SeqBuild; -import com.roncoo.pay.user.service.BuildNoService; - /** * 生成编号service实现类,每个编号前面都会有一个前缀用来方便区分是那种编号 * 龙果学院:www.roncoo.com @@ -41,43 +33,30 @@ public class BuildNoServiceImpl implements BuildNoService { private static final Log LOG = LogFactory.getLog(BuildNoServiceImpl.class); /** 对账批次号前缀 **/ - private static final String RECONCILIATION_BATCH_NO = "5555"; + private static final String RECONCILIATION_BATCH_NO = "5"; /** 银行订单号 **/ - private static final String BANK_ORDER_NO_PREFIX = "6666"; + private static final String BANK_ORDER_NO_PREFIX = "6"; /** 支付流水号前缀 **/ - private static final String TRX_NO_PREFIX = "7777"; + private static final String TRX_NO_PREFIX = "7"; /** 用户编号前缀 **/ - private static final String USER_NO_PREFIX = "8888"; + private static final String USER_NO_PREFIX = "8"; /** 账户编号前缀 **/ - private static final String ACCOUNT_NO_PREFIX = "9999"; - - @Autowired - private BuildNoDao buildNoDao; + private static final String ACCOUNT_NO_PREFIX = "9"; /** 获取用户编号 **/ @Transactional(rollbackFor = Exception.class) public String buildUserNo() { - // 获取用户编号序列 - String userNoSeq = this.getSeqNextValue("USER_NO_SEQ"); - - // 20位的用户编号规范:'8888' + yyyyMMdd(时间) + 序列的后8位 - String dateString = DateUtils.toString(new Date(), "yyyyMMdd"); - String userNo = USER_NO_PREFIX + dateString + userNoSeq.substring(userNoSeq.length() - 8, userNoSeq.length()); + String userNo = USER_NO_PREFIX + IdWorker.getId() ; return userNo; } /** 获取账户编号 **/ @Transactional(rollbackFor = Exception.class) public String buildAccountNo() { - // 获取账户编号序列值,用于生成20位的账户编号 - String accountNoSeq = this.getSeqNextValue("ACCOUNT_NO_SEQ"); - // 20位的账户编号规范:'9999' + yyyyMMdd(时间) + 序列的后8位 - String dateString = DateUtils.toString(new Date(), "yyyyMMdd"); - String accountNo = ACCOUNT_NO_PREFIX + dateString + accountNoSeq.substring(accountNoSeq.length() - 8, accountNoSeq.length()); - + String accountNo = ACCOUNT_NO_PREFIX + IdWorker.getId(); return accountNo; } @@ -86,11 +65,7 @@ public class BuildNoServiceImpl implements BuildNoService { **/ @Override public String buildTrxNo() { - - String trxNoSeq = this.getSeqNextValue("TRX_NO_SEQ"); - // 20位的支付流水号规范:'8888' + yyyyMMdd(时间) + 序列的后8位 - String dateString = DateUtils.toString(new Date(), "yyyyMMdd"); - String trxNo = TRX_NO_PREFIX + dateString + trxNoSeq.substring(trxNoSeq.length() - 8, trxNoSeq.length()); + String trxNo = TRX_NO_PREFIX + IdWorker.getId(); return trxNo; } @@ -99,40 +74,14 @@ public class BuildNoServiceImpl implements BuildNoService { **/ @Override public String buildBankOrderNo() { - - String bankOrderNoSeq = this.getSeqNextValue("BANK_ORDER_NO_SEQ"); - // 20位的用户编号规范:'8888' + yyyyMMdd(时间) + 序列的后8位 - String dateString = DateUtils.toString(new Date(), "yyyyMMdd"); - String bankOrderNo = BANK_ORDER_NO_PREFIX + dateString + bankOrderNoSeq.substring(bankOrderNoSeq.length() - 8, bankOrderNoSeq.length()); + String bankOrderNo = BANK_ORDER_NO_PREFIX + IdWorker.getId(); return bankOrderNo; } /** 获取对账批次号 **/ public String buildReconciliationNo() { - String batchNoSeq = this.getSeqNextValue("RECONCILIATION_BATCH_NO_SEQ"); - String dateString = DateUtils.toString(new Date(), "yyyyMMdd"); - String batchNo = RECONCILIATION_BATCH_NO + dateString + batchNoSeq.substring(batchNoSeq.length() - 8, batchNoSeq.length()); + String batchNo = RECONCILIATION_BATCH_NO + IdWorker.getId(); return batchNo; } - /** - * 根据序列名称,获取序列值 - */ - @Transactional(rollbackFor = Exception.class) - public String getSeqNextValue(String seqName) { - String seqNextValue = null; - try { - SeqBuild seqBuild = new SeqBuild(); - seqBuild.setSeqName(seqName); - seqNextValue = buildNoDao.getSeqNextValue(seqBuild); - } catch (Exception e) { - LOG.error("生成序号异常:" + "seqName=" + seqName, e); - throw BizException.DB_GET_SEQ_NEXT_VALUE_ERROR; - } - if (StringUtils.isEmpty(seqNextValue)) { - throw BizException.DB_GET_SEQ_NEXT_VALUE_ERROR; - } - return seqNextValue; - } - -} \ No newline at end of file +} diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpPayProductServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpPayProductServiceImpl.java index 9c7c14f0de7192bef9511a5b049d450503133210..f28a92db3f50cf9dddce42a27f7b06130cc426cb 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpPayProductServiceImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpPayProductServiceImpl.java @@ -15,14 +15,6 @@ */ package com.roncoo.pay.user.service.impl; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import com.roncoo.pay.common.core.enums.PublicEnum; import com.roncoo.pay.common.core.enums.PublicStatusEnum; import com.roncoo.pay.common.core.page.PageBean; @@ -36,6 +28,13 @@ import com.roncoo.pay.user.exception.PayBizException; import com.roncoo.pay.user.service.RpPayProductService; import com.roncoo.pay.user.service.RpPayWayService; import com.roncoo.pay.user.service.RpUserPayConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 支付产品service实现类 @@ -43,7 +42,7 @@ import com.roncoo.pay.user.service.RpUserPayConfigService; * @author:zenghao */ @Service("rpPayProductService") -public class RpPayProductServiceImpl implements RpPayProductService{ +public class RpPayProductServiceImpl implements RpPayProductService { @Autowired private RpPayProductDao rpPayProductDao; diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpPayWayServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpPayWayServiceImpl.java index b3093e62b26874d6f048bbf2f8a29a8d2fa7ed90..b5768fc5662a6eca4ac30eec675298af9d367d65 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpPayWayServiceImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpPayWayServiceImpl.java @@ -15,14 +15,6 @@ */ package com.roncoo.pay.user.service.impl; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import com.roncoo.pay.common.core.enums.PayTypeEnum; import com.roncoo.pay.common.core.enums.PayWayEnum; import com.roncoo.pay.common.core.enums.PublicEnum; @@ -36,6 +28,13 @@ import com.roncoo.pay.user.entity.RpPayWay; import com.roncoo.pay.user.exception.PayBizException; import com.roncoo.pay.user.service.RpPayProductService; import com.roncoo.pay.user.service.RpPayWayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 支付方式service实现类 @@ -43,7 +42,7 @@ import com.roncoo.pay.user.service.RpPayWayService; * @author:zenghao */ @Service("rpPayWayService") -public class RpPayWayServiceImpl implements RpPayWayService{ +public class RpPayWayServiceImpl implements RpPayWayService { @Autowired private RpPayWayDao rpPayWayDao; diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserBankAccountServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserBankAccountServiceImpl.java index 88c6f40e1417851967988ce1d2308d7c03de7fe4..98b6cd92355c0c9aedf752a13a393f81a59b65e5 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserBankAccountServiceImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserBankAccountServiceImpl.java @@ -15,13 +15,6 @@ */ package com.roncoo.pay.user.service.impl; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import com.roncoo.pay.common.core.enums.PublicEnum; import com.roncoo.pay.common.core.enums.PublicStatusEnum; import com.roncoo.pay.common.core.utils.StringUtil; @@ -29,6 +22,12 @@ import com.roncoo.pay.user.dao.RpUserBankAccountDao; import com.roncoo.pay.user.entity.RpUserBankAccount; import com.roncoo.pay.user.enums.BankCodeEnum; import com.roncoo.pay.user.service.RpUserBankAccountService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; /** * 用户银行账户service实现类 @@ -36,7 +35,7 @@ import com.roncoo.pay.user.service.RpUserBankAccountService; * @author:zenghao */ @Service("rpUserBankAccountService") -public class RpUserBankAccountServiceImpl implements RpUserBankAccountService{ +public class RpUserBankAccountServiceImpl implements RpUserBankAccountService { @Autowired private RpUserBankAccountDao rpUserBankAccountDao; diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserInfoServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserInfoServiceImpl.java index 99c8244627c1a2af6872f029c725c19b33874413..9a8e83c2a51d4e68fb46398cb5cb38f01b35e675 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserInfoServiceImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserInfoServiceImpl.java @@ -15,26 +15,26 @@ */ package com.roncoo.pay.user.service.impl; -import java.math.BigDecimal; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - import com.roncoo.pay.account.entity.RpAccount; import com.roncoo.pay.account.service.RpAccountService; import com.roncoo.pay.common.core.enums.PublicStatusEnum; import com.roncoo.pay.common.core.page.PageBean; import com.roncoo.pay.common.core.page.PageParam; +import com.roncoo.pay.common.core.utils.EncryptUtil; import com.roncoo.pay.common.core.utils.StringUtil; import com.roncoo.pay.user.dao.RpUserInfoDao; import com.roncoo.pay.user.entity.RpUserInfo; import com.roncoo.pay.user.service.BuildNoService; import com.roncoo.pay.user.service.RpUserInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 用户信息service实现类 @@ -80,11 +80,15 @@ public class RpUserInfoServiceImpl implements RpUserInfoService{ * * @param userName * 用户名 + * @param mobile + * 手机号 + * @param password + * 密码 * @return */ @Override @Transactional(rollbackFor = Exception.class) - public void registerOffline(String userName) { + public void registerOffline(String userName, String mobile, String password) { String userNo = buildNoService.buildUserNo(); String accountNo = buildNoService.buildAccountNo(); @@ -96,6 +100,9 @@ public class RpUserInfoServiceImpl implements RpUserInfoService{ rpUserInfo.setStatus(PublicStatusEnum.ACTIVE.name()); rpUserInfo.setUserName(userName); rpUserInfo.setUserNo(userNo); + rpUserInfo.setMobile(mobile); + rpUserInfo.setPassword(EncryptUtil.encodeMD5String(password)); + rpUserInfo.setPayPwd(EncryptUtil.encodeMD5String("123456")); rpUserInfo.setVersion(0); this.saveData(rpUserInfo); @@ -133,6 +140,19 @@ public class RpUserInfoServiceImpl implements RpUserInfoService{ return rpUserInfoDao.getBy(paramMap); } + /** + * 根据手机号获取商户信息 + * @param mobile + * @return + */ + @Override + public RpUserInfo getDataByMobile(String mobile){ + Map paramMap = new HashMap(); + paramMap.put("mobile", mobile); + paramMap.put("status", PublicStatusEnum.ACTIVE.name()); + return rpUserInfoDao.getBy(paramMap); + } + /** * 获取所有用户 * @return diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserPayConfigServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserPayConfigServiceImpl.java index 46169f50ec65e2084407e04965c8afaad6df86a1..f23fde1211220d9e6c8904b876cdf0ea5fbab332 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserPayConfigServiceImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserPayConfigServiceImpl.java @@ -15,14 +15,6 @@ */ package com.roncoo.pay.user.service.impl; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import com.roncoo.pay.common.core.enums.PayWayEnum; import com.roncoo.pay.common.core.enums.PublicEnum; import com.roncoo.pay.common.core.enums.PublicStatusEnum; @@ -39,6 +31,14 @@ import com.roncoo.pay.user.service.RpPayProductService; import com.roncoo.pay.user.service.RpPayWayService; import com.roncoo.pay.user.service.RpUserPayConfigService; import com.roncoo.pay.user.service.RpUserPayInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 用户支付配置service实现类 @@ -134,15 +134,30 @@ public class RpUserPayConfigServiceImpl implements RpUserPayConfigService{ * 创建用户支付配置 */ @Override + @Transactional(rollbackFor = Exception.class) public void createUserPayConfig(String userNo, String userName, String productCode, String productName, Integer riskDay, String fundIntoType, String isAutoSett, String appId, String merchantId, String partnerKey, String ali_partner, String ali_sellerId, String ali_key, String ali_appid, String ali_rsaPrivateKey, String ali_rsaPublicKey) throws PayBizException{ - + + createUserPayConfig( userNo, userName, productCode, productName, riskDay, + fundIntoType, isAutoSett, appId, merchantId, partnerKey, + ali_partner, ali_sellerId, ali_key, ali_appid, ali_rsaPrivateKey, ali_rsaPublicKey , null , null); + } + + /** + * 创建用户支付配置 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void createUserPayConfig(String userNo, String userName, String productCode, String productName, Integer riskDay, + String fundIntoType, String isAutoSett, String appId, String merchantId, String partnerKey, + String ali_partner, String ali_sellerId, String ali_key, String ali_appid, String ali_rsaPrivateKey, String ali_rsaPublicKey , String securityRating , String merchantServerIp) throws PayBizException{ + RpUserPayConfig payConfig = rpUserPayConfigDao.getByUserNo(userNo, null); if(payConfig != null){ throw new PayBizException(PayBizException.USER_PAY_CONFIG_IS_EXIST,"用户支付配置已存在"); } - + RpUserPayConfig rpUserPayConfig = new RpUserPayConfig(); rpUserPayConfig.setUserNo(userNo); rpUserPayConfig.setUserName(userName); @@ -156,8 +171,10 @@ public class RpUserPayConfigServiceImpl implements RpUserPayConfigService{ rpUserPayConfig.setPayKey(StringUtil.get32UUID()); rpUserPayConfig.setPaySecret(StringUtil.get32UUID()); rpUserPayConfig.setId(StringUtil.get32UUID()); + rpUserPayConfig.setSecurityRating(securityRating);//安全等级 + rpUserPayConfig.setMerchantServerIp(merchantServerIp); saveData(rpUserPayConfig); - + //查询支付产品下有哪些支付方式 List payWayList = rpPayWayService.listByProductCode(productCode); Map map = new HashMap(); @@ -165,7 +182,7 @@ public class RpUserPayConfigServiceImpl implements RpUserPayConfigService{ for(RpPayWay payWay : payWayList){ map.put(payWay.getPayWayCode(), payWay.getPayWayName()); } - + for (String key : map.keySet()) { if(key.equals(PayWayEnum.WEIXIN.name())){ //创建用户第三方支付信息 @@ -192,7 +209,7 @@ public class RpUserPayConfigServiceImpl implements RpUserPayConfigService{ rpUserPayInfo.setPayWayName(PayWayEnum.WEIXIN.getDesc()); rpUserPayInfoService.updateData(rpUserPayInfo); } - + }else if(key.equals(PayWayEnum.ALIPAY.name())){ //创建用户第三方支付信息 RpUserPayInfo rpUserPayInfo = rpUserPayInfoService.getByUserNo(userNo, PayWayEnum.ALIPAY.name()); @@ -226,11 +243,11 @@ public class RpUserPayConfigServiceImpl implements RpUserPayConfigService{ } } } - - - + + + } - + /** * 删除支付产品 * @param userNo @@ -255,19 +272,33 @@ public class RpUserPayConfigServiceImpl implements RpUserPayConfigService{ public void updateUserPayConfig(String userNo, String productCode, String productName, Integer riskDay, String fundIntoType, String isAutoSett, String appId, String merchantId, String partnerKey, String ali_partner, String ali_sellerId, String ali_key, String ali_appid, String ali_rsaPrivateKey, String ali_rsaPublicKey) throws PayBizException{ + + updateUserPayConfig( userNo, productCode, productName, riskDay, fundIntoType, + isAutoSett, appId, merchantId, partnerKey, + ali_partner, ali_sellerId, ali_key, ali_appid, ali_rsaPrivateKey, ali_rsaPublicKey , null , null); + } + /** + * 修改用户支付配置 + */ + @Override + public void updateUserPayConfig(String userNo, String productCode, String productName, Integer riskDay, String fundIntoType, + String isAutoSett, String appId, String merchantId, String partnerKey, + String ali_partner, String ali_sellerId, String ali_key, String ali_appid, String ali_rsaPrivateKey, String ali_rsaPublicKey , String securityRating , String merchantServerIp) throws PayBizException{ RpUserPayConfig rpUserPayConfig = rpUserPayConfigDao.getByUserNo(userNo, null); if(rpUserPayConfig == null){ throw new PayBizException(PayBizException.USER_PAY_CONFIG_IS_NOT_EXIST,"用户支付配置不存在"); } - + rpUserPayConfig.setProductCode(productCode); rpUserPayConfig.setProductName(productName); rpUserPayConfig.setRiskDay(riskDay); rpUserPayConfig.setFundIntoType(fundIntoType); rpUserPayConfig.setIsAutoSett(isAutoSett); rpUserPayConfig.setEditTime(new Date()); + rpUserPayConfig.setSecurityRating(securityRating);//安全等级 + rpUserPayConfig.setMerchantServerIp(merchantServerIp); updateData(rpUserPayConfig); - + //查询支付产品下有哪些支付方式 List payWayList = rpPayWayService.listByProductCode(productCode); Map map = new HashMap(); @@ -275,7 +306,7 @@ public class RpUserPayConfigServiceImpl implements RpUserPayConfigService{ for(RpPayWay payWay : payWayList){ map.put(payWay.getPayWayCode(), payWay.getPayWayName()); } - + for (String key : map.keySet()) { if(key.equals(PayWayEnum.WEIXIN.name())){ //创建用户第三方支付信息 @@ -302,7 +333,7 @@ public class RpUserPayConfigServiceImpl implements RpUserPayConfigService{ rpUserPayInfo.setPayWayName(PayWayEnum.WEIXIN.getDesc()); rpUserPayInfoService.updateData(rpUserPayInfo); } - + }else if(key.equals(PayWayEnum.ALIPAY.name())){ //创建用户第三方支付信息 RpUserPayInfo rpUserPayInfo = rpUserPayInfoService.getByUserNo(userNo, PayWayEnum.ALIPAY.name()); @@ -337,7 +368,7 @@ public class RpUserPayConfigServiceImpl implements RpUserPayConfigService{ } } } - + /** * 审核 * @param userNo diff --git a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserPayInfoServiceImpl.java b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserPayInfoServiceImpl.java index de1e923608c39066380250ed4067bdf56f6a973d..b88c3ab750d0be32fdfbbfc0f4952c87179c88c4 100644 --- a/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserPayInfoServiceImpl.java +++ b/roncoo-pay-service/src/main/java/com/roncoo/pay/user/service/impl/RpUserPayInfoServiceImpl.java @@ -15,17 +15,16 @@ */ package com.roncoo.pay.user.service.impl; -import java.util.HashMap; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import com.roncoo.pay.common.core.page.PageBean; import com.roncoo.pay.common.core.page.PageParam; import com.roncoo.pay.user.dao.RpUserPayInfoDao; import com.roncoo.pay.user.entity.RpUserPayInfo; import com.roncoo.pay.user.service.RpUserPayInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; /** * 用户第三方支付信息service实现类 @@ -33,7 +32,7 @@ import com.roncoo.pay.user.service.RpUserPayInfoService; * @author:zenghao */ @Service("rpUserPayInfoService") -public class RpUserPayInfoServiceImpl implements RpUserPayInfoService{ +public class RpUserPayInfoServiceImpl implements RpUserPayInfoService { @Autowired private RpUserPayInfoDao rpUserPayInfoDao; diff --git a/roncoo-pay-service/src/main/resources/WxCityNo.txt b/roncoo-pay-service/src/main/resources/WxCityNo.txt new file mode 100644 index 0000000000000000000000000000000000000000..05987443074b8a06fb32c929758d2e2a8a0a35c3 --- /dev/null +++ b/roncoo-pay-service/src/main/resources/WxCityNo.txt @@ -0,0 +1,3628 @@ +110000=中国,,北京市 +110101=中国,,北京市,东城区 +110102=中国,,北京市,西城区 +110105=中国,,北京市,朝阳区 +110106=中国,,北京市,丰台区 +110107=中国,,北京市,石景山区 +110108=中国,,北京市,海淀区 +110109=中国,,北京市,门头沟区 +110111=中国,,北京市,房山区 +110112=中国,,北京市,通州区 +110113=中国,,北京市,顺义区 +110114=中国,,北京市,昌平区 +110115=中国,,北京市,大兴区 +110116=中国,,北京市,怀柔区 +110117=中国,,北京市,平谷区 +110118=中国,,北京市,密云区 +110119=中国,,北京市,延庆区 +120000=中国,,天津市 +120101=中国,,天津市,和平区 +120102=中国,,天津市,河东区 +120103=中国,,天津市,河西区 +120104=中国,,天津市,南开区 +120105=中国,,天津市,河北区 +120106=中国,,天津市,红桥区 +120110=中国,,天津市,东丽区 +120111=中国,,天津市,西青区 +120112=中国,,天津市,津南区 +120113=中国,,天津市,北辰区 +120114=中国,,天津市,武清区 +120115=中国,,天津市,宝坻区 +120116=中国,,天津市,滨海新区 +120117=中国,,天津市,宁河区 +120118=中国,,天津市,静海区 +120119=中国,,天津市,蓟州区 +130000=中国,河北省 +130100=中国,河北省,石家庄市 +130102=中国,河北省,石家庄市,长安区 +130104=中国,河北省,石家庄市,桥西区 +130105=中国,河北省,石家庄市,新华区 +130107=中国,河北省,石家庄市,井陉矿区 +130108=中国,河北省,石家庄市,裕华区 +130109=中国,河北省,石家庄市,藁城区 +130110=中国,河北省,石家庄市,鹿泉区 +130111=中国,河北省,石家庄市,栾城区 +130121=中国,河北省,石家庄市,井陉县 +130123=中国,河北省,石家庄市,正定县 +130125=中国,河北省,石家庄市,行唐县 +130126=中国,河北省,石家庄市,灵寿县 +130127=中国,河北省,石家庄市,高邑县 +130128=中国,河北省,石家庄市,深泽县 +130129=中国,河北省,石家庄市,赞皇县 +130130=中国,河北省,石家庄市,无极县 +130131=中国,河北省,石家庄市,平山县 +130132=中国,河北省,石家庄市,元氏县 +130133=中国,河北省,石家庄市,赵县 +130183=中国,河北省,石家庄市,晋州市 +130184=中国,河北省,石家庄市,新乐市 +130200=中国,河北省,唐山市 +130202=中国,河北省,唐山市,路南区 +130203=中国,河北省,唐山市,路北区 +130204=中国,河北省,唐山市,古冶区 +130205=中国,河北省,唐山市,开平区 +130207=中国,河北省,唐山市,丰南区 +130208=中国,河北省,唐山市,丰润区 +130209=中国,河北省,唐山市,曹妃甸区 +130223=中国,河北省,唐山市,滦县 +130224=中国,河北省,唐山市,滦南县 +130225=中国,河北省,唐山市,乐亭县 +130227=中国,河北省,唐山市,迁西县 +130229=中国,河北省,唐山市,玉田县 +130281=中国,河北省,唐山市,遵化市 +130283=中国,河北省,唐山市,迁安市 +130300=中国,河北省,秦皇岛市 +130302=中国,河北省,秦皇岛市,海港区 +130303=中国,河北省,秦皇岛市,山海关区 +130304=中国,河北省,秦皇岛市,北戴河区 +130306=中国,河北省,秦皇岛市,抚宁区 +130321=中国,河北省,秦皇岛市,青龙满族自治县 +130322=中国,河北省,秦皇岛市,昌黎县 +130324=中国,河北省,秦皇岛市,卢龙县 +130400=中国,河北省,邯郸市 +130402=中国,河北省,邯郸市,邯山区 +130403=中国,河北省,邯郸市,丛台区 +130404=中国,河北省,邯郸市,复兴区 +130406=中国,河北省,邯郸市,峰峰矿区 +130407=中国,河北省,邯郸市,肥乡区 +130408=中国,河北省,邯郸市,永年区 +130423=中国,河北省,邯郸市,临漳县 +130424=中国,河北省,邯郸市,成安县 +130425=中国,河北省,邯郸市,大名县 +130426=中国,河北省,邯郸市,涉县 +130427=中国,河北省,邯郸市,磁县 +130430=中国,河北省,邯郸市,邱县 +130431=中国,河北省,邯郸市,鸡泽县 +130432=中国,河北省,邯郸市,广平县 +130433=中国,河北省,邯郸市,馆陶县 +130434=中国,河北省,邯郸市,魏县 +130435=中国,河北省,邯郸市,曲周县 +130481=中国,河北省,邯郸市,武安市 +130500=中国,河北省,邢台市 +130502=中国,河北省,邢台市,桥东区 +130503=中国,河北省,邢台市,桥西区 +130521=中国,河北省,邢台市,邢台县 +130522=中国,河北省,邢台市,临城县 +130523=中国,河北省,邢台市,内丘县 +130524=中国,河北省,邢台市,柏乡县 +130525=中国,河北省,邢台市,隆尧县 +130526=中国,河北省,邢台市,任县 +130527=中国,河北省,邢台市,南和县 +130528=中国,河北省,邢台市,宁晋县 +130529=中国,河北省,邢台市,巨鹿县 +130530=中国,河北省,邢台市,新河县 +130531=中国,河北省,邢台市,广宗县 +130532=中国,河北省,邢台市,平乡县 +130533=中国,河北省,邢台市,威县 +130534=中国,河北省,邢台市,清河县 +130535=中国,河北省,邢台市,临西县 +130581=中国,河北省,邢台市,南宫市 +130582=中国,河北省,邢台市,沙河市 +130600=中国,河北省,保定市 +130602=中国,河北省,保定市,竞秀区 +130606=中国,河北省,保定市,莲池区 +130607=中国,河北省,保定市,满城区 +130608=中国,河北省,保定市,清苑区 +130609=中国,河北省,保定市,徐水区 +130623=中国,河北省,保定市,涞水县 +130624=中国,河北省,保定市,阜平县 +130626=中国,河北省,保定市,定兴县 +130627=中国,河北省,保定市,唐县 +130628=中国,河北省,保定市,高阳县 +130629=中国,河北省,保定市,容城县 +130630=中国,河北省,保定市,涞源县 +130631=中国,河北省,保定市,望都县 +130632=中国,河北省,保定市,安新县 +130633=中国,河北省,保定市,易县 +130634=中国,河北省,保定市,曲阳县 +130635=中国,河北省,保定市,蠡县 +130636=中国,河北省,保定市,顺平县 +130637=中国,河北省,保定市,博野县 +130638=中国,河北省,保定市,雄县 +130681=中国,河北省,保定市,涿州市 +130683=中国,河北省,保定市,安国市 +130684=中国,河北省,保定市,高碑店市 +130700=中国,河北省,张家口市 +130702=中国,河北省,张家口市,桥东区 +130703=中国,河北省,张家口市,桥西区 +130705=中国,河北省,张家口市,宣化区 +130706=中国,河北省,张家口市,下花园区 +130708=中国,河北省,张家口市,万全区 +130709=中国,河北省,张家口市,崇礼区 +130722=中国,河北省,张家口市,张北县 +130723=中国,河北省,张家口市,康保县 +130724=中国,河北省,张家口市,沽源县 +130725=中国,河北省,张家口市,尚义县 +130726=中国,河北省,张家口市,蔚县 +130727=中国,河北省,张家口市,阳原县 +130728=中国,河北省,张家口市,怀安县 +130730=中国,河北省,张家口市,怀来县 +130731=中国,河北省,张家口市,涿鹿县 +130732=中国,河北省,张家口市,赤城县 +130800=中国,河北省,承德市 +130802=中国,河北省,承德市,双桥区 +130803=中国,河北省,承德市,双滦区 +130804=中国,河北省,承德市,鹰手营子矿区 +130821=中国,河北省,承德市,承德县 +130822=中国,河北省,承德市,兴隆县 +130824=中国,河北省,承德市,滦平县 +130825=中国,河北省,承德市,隆化县 +130826=中国,河北省,承德市,丰宁满族自治县 +130827=中国,河北省,承德市,宽城满族自治县 +130828=中国,河北省,承德市,围场满族蒙古族自治县 +130881=中国,河北省,承德市,平泉市 +130900=中国,河北省,沧州市 +130902=中国,河北省,沧州市,新华区 +130903=中国,河北省,沧州市,运河区 +130921=中国,河北省,沧州市,沧县 +130922=中国,河北省,沧州市,青县 +130923=中国,河北省,沧州市,东光县 +130924=中国,河北省,沧州市,海兴县 +130925=中国,河北省,沧州市,盐山县 +130926=中国,河北省,沧州市,肃宁县 +130927=中国,河北省,沧州市,南皮县 +130928=中国,河北省,沧州市,吴桥县 +130929=中国,河北省,沧州市,献县 +130930=中国,河北省,沧州市,孟村回族自治县 +130981=中国,河北省,沧州市,泊头市 +130982=中国,河北省,沧州市,任丘市 +130983=中国,河北省,沧州市,黄骅市 +130984=中国,河北省,沧州市,河间市 +131000=中国,河北省,廊坊市 +131002=中国,河北省,廊坊市,安次区 +131003=中国,河北省,廊坊市,广阳区 +131022=中国,河北省,廊坊市,固安县 +131023=中国,河北省,廊坊市,永清县 +131024=中国,河北省,廊坊市,香河县 +131025=中国,河北省,廊坊市,大城县 +131026=中国,河北省,廊坊市,文安县 +131028=中国,河北省,廊坊市,大厂回族自治县 +131081=中国,河北省,廊坊市,霸州市 +131082=中国,河北省,廊坊市,三河市 +131100=中国,河北省,衡水市 +131102=中国,河北省,衡水市,桃城区 +131103=中国,河北省,衡水市,冀州区 +131121=中国,河北省,衡水市,枣强县 +131122=中国,河北省,衡水市,武邑县 +131123=中国,河北省,衡水市,武强县 +131124=中国,河北省,衡水市,饶阳县 +131125=中国,河北省,衡水市,安平县 +131126=中国,河北省,衡水市,故城县 +131127=中国,河北省,衡水市,景县 +131128=中国,河北省,衡水市,阜城县 +131182=中国,河北省,衡水市,深州市 +139001=中国,河北省,定州市,定州市 +139002=中国,河北省,辛集市,辛集市 +140000=中国,山西省 +140100=中国,山西省,太原市 +140105=中国,山西省,太原市,小店区 +140106=中国,山西省,太原市,迎泽区 +140107=中国,山西省,太原市,杏花岭区 +140108=中国,山西省,太原市,尖草坪区 +140109=中国,山西省,太原市,万柏林区 +140110=中国,山西省,太原市,晋源区 +140121=中国,山西省,太原市,清徐县 +140122=中国,山西省,太原市,阳曲县 +140123=中国,山西省,太原市,娄烦县 +140181=中国,山西省,太原市,古交市 +140200=中国,山西省,大同市 +140202=中国,山西省,大同市,城区 +140203=中国,山西省,大同市,矿区 +140211=中国,山西省,大同市,南郊区 +140212=中国,山西省,大同市,新荣区 +140221=中国,山西省,大同市,阳高县 +140222=中国,山西省,大同市,天镇县 +140223=中国,山西省,大同市,广灵县 +140224=中国,山西省,大同市,灵丘县 +140225=中国,山西省,大同市,浑源县 +140226=中国,山西省,大同市,左云县 +140227=中国,山西省,大同市,大同县 +140300=中国,山西省,阳泉市 +140302=中国,山西省,阳泉市,城区 +140303=中国,山西省,阳泉市,矿区 +140311=中国,山西省,阳泉市,郊区 +140321=中国,山西省,阳泉市,平定县 +140322=中国,山西省,阳泉市,盂县 +140400=中国,山西省,长治市 +140402=中国,山西省,长治市,城区 +140411=中国,山西省,长治市,郊区 +140421=中国,山西省,长治市,长治县 +140423=中国,山西省,长治市,襄垣县 +140424=中国,山西省,长治市,屯留县 +140425=中国,山西省,长治市,平顺县 +140426=中国,山西省,长治市,黎城县 +140427=中国,山西省,长治市,壶关县 +140428=中国,山西省,长治市,长子县 +140429=中国,山西省,长治市,武乡县 +140430=中国,山西省,长治市,沁县 +140431=中国,山西省,长治市,沁源县 +140481=中国,山西省,长治市,潞城市 +140500=中国,山西省,晋城市 +140502=中国,山西省,晋城市,城区 +140521=中国,山西省,晋城市,沁水县 +140522=中国,山西省,晋城市,阳城县 +140524=中国,山西省,晋城市,陵川县 +140525=中国,山西省,晋城市,泽州县 +140581=中国,山西省,晋城市,高平市 +140600=中国,山西省,朔州市 +140602=中国,山西省,朔州市,朔城区 +140603=中国,山西省,朔州市,平鲁区 +140621=中国,山西省,朔州市,山阴县 +140622=中国,山西省,朔州市,应县 +140623=中国,山西省,朔州市,右玉县 +140624=中国,山西省,朔州市,怀仁县 +140700=中国,山西省,晋中市 +140702=中国,山西省,晋中市,榆次区 +140721=中国,山西省,晋中市,榆社县 +140722=中国,山西省,晋中市,左权县 +140723=中国,山西省,晋中市,和顺县 +140724=中国,山西省,晋中市,昔阳县 +140725=中国,山西省,晋中市,寿阳县 +140726=中国,山西省,晋中市,太谷县 +140727=中国,山西省,晋中市,祁县 +140728=中国,山西省,晋中市,平遥县 +140729=中国,山西省,晋中市,灵石县 +140781=中国,山西省,晋中市,介休市 +140800=中国,山西省,运城市 +140802=中国,山西省,运城市,盐湖区 +140821=中国,山西省,运城市,临猗县 +140822=中国,山西省,运城市,万荣县 +140823=中国,山西省,运城市,闻喜县 +140824=中国,山西省,运城市,稷山县 +140825=中国,山西省,运城市,新绛县 +140826=中国,山西省,运城市,绛县 +140827=中国,山西省,运城市,垣曲县 +140828=中国,山西省,运城市,夏县 +140829=中国,山西省,运城市,平陆县 +140830=中国,山西省,运城市,芮城县 +140881=中国,山西省,运城市,永济市 +140882=中国,山西省,运城市,河津市 +140900=中国,山西省,忻州市 +140902=中国,山西省,忻州市,忻府区 +140921=中国,山西省,忻州市,定襄县 +140922=中国,山西省,忻州市,五台县 +140923=中国,山西省,忻州市,代县 +140924=中国,山西省,忻州市,繁峙县 +140925=中国,山西省,忻州市,宁武县 +140926=中国,山西省,忻州市,静乐县 +140927=中国,山西省,忻州市,神池县 +140928=中国,山西省,忻州市,五寨县 +140929=中国,山西省,忻州市,岢岚县 +140930=中国,山西省,忻州市,河曲县 +140931=中国,山西省,忻州市,保德县 +140932=中国,山西省,忻州市,偏关县 +140981=中国,山西省,忻州市,原平市 +141000=中国,山西省,临汾市 +141002=中国,山西省,临汾市,尧都区 +141021=中国,山西省,临汾市,曲沃县 +141022=中国,山西省,临汾市,翼城县 +141023=中国,山西省,临汾市,襄汾县 +141024=中国,山西省,临汾市,洪洞县 +141025=中国,山西省,临汾市,古县 +141026=中国,山西省,临汾市,安泽县 +141027=中国,山西省,临汾市,浮山县 +141028=中国,山西省,临汾市,吉县 +141029=中国,山西省,临汾市,乡宁县 +141030=中国,山西省,临汾市,大宁县 +141031=中国,山西省,临汾市,隰县 +141032=中国,山西省,临汾市,永和县 +141033=中国,山西省,临汾市,蒲县 +141034=中国,山西省,临汾市,汾西县 +141081=中国,山西省,临汾市,侯马市 +141082=中国,山西省,临汾市,霍州市 +141100=中国,山西省,吕梁市 +141102=中国,山西省,吕梁市,离石区 +141121=中国,山西省,吕梁市,文水县 +141122=中国,山西省,吕梁市,交城县 +141123=中国,山西省,吕梁市,兴县 +141124=中国,山西省,吕梁市,临县 +141125=中国,山西省,吕梁市,柳林县 +141126=中国,山西省,吕梁市,石楼县 +141127=中国,山西省,吕梁市,岚县 +141128=中国,山西省,吕梁市,方山县 +141129=中国,山西省,吕梁市,中阳县 +141130=中国,山西省,吕梁市,交口县 +141181=中国,山西省,吕梁市,孝义市 +141182=中国,山西省,吕梁市,汾阳市 +150000=中国,内蒙古自治区 +150100=中国,内蒙古自治区,呼和浩特市 +150102=中国,内蒙古自治区,呼和浩特市,新城区 +150103=中国,内蒙古自治区,呼和浩特市,回民区 +150104=中国,内蒙古自治区,呼和浩特市,玉泉区 +150105=中国,内蒙古自治区,呼和浩特市,赛罕区 +150121=中国,内蒙古自治区,呼和浩特市,土默特左旗 +150122=中国,内蒙古自治区,呼和浩特市,托克托县 +150123=中国,内蒙古自治区,呼和浩特市,和林格尔县 +150124=中国,内蒙古自治区,呼和浩特市,清水河县 +150125=中国,内蒙古自治区,呼和浩特市,武川县 +150200=中国,内蒙古自治区,包头市 +150202=中国,内蒙古自治区,包头市,东河区 +150203=中国,内蒙古自治区,包头市,昆都仑区 +150204=中国,内蒙古自治区,包头市,青山区 +150205=中国,内蒙古自治区,包头市,石拐区 +150206=中国,内蒙古自治区,包头市,白云鄂博矿区 +150207=中国,内蒙古自治区,包头市,九原区 +150221=中国,内蒙古自治区,包头市,土默特右旗 +150222=中国,内蒙古自治区,包头市,固阳县 +150223=中国,内蒙古自治区,包头市,达尔罕茂明安联合旗 +150300=中国,内蒙古自治区,乌海市 +150302=中国,内蒙古自治区,乌海市,海勃湾区 +150303=中国,内蒙古自治区,乌海市,海南区 +150304=中国,内蒙古自治区,乌海市,乌达区 +150400=中国,内蒙古自治区,赤峰市 +150402=中国,内蒙古自治区,赤峰市,红山区 +150403=中国,内蒙古自治区,赤峰市,元宝山区 +150404=中国,内蒙古自治区,赤峰市,松山区 +150421=中国,内蒙古自治区,赤峰市,阿鲁科尔沁旗 +150422=中国,内蒙古自治区,赤峰市,巴林左旗 +150423=中国,内蒙古自治区,赤峰市,巴林右旗 +150424=中国,内蒙古自治区,赤峰市,林西县 +150425=中国,内蒙古自治区,赤峰市,克什克腾旗 +150426=中国,内蒙古自治区,赤峰市,翁牛特旗 +150428=中国,内蒙古自治区,赤峰市,喀喇沁旗 +150429=中国,内蒙古自治区,赤峰市,宁城县 +150430=中国,内蒙古自治区,赤峰市,敖汉旗 +150500=中国,内蒙古自治区,通辽市 +150502=中国,内蒙古自治区,通辽市,科尔沁区 +150521=中国,内蒙古自治区,通辽市,科尔沁左翼中旗 +150522=中国,内蒙古自治区,通辽市,科尔沁左翼后旗 +150523=中国,内蒙古自治区,通辽市,开鲁县 +150524=中国,内蒙古自治区,通辽市,库伦旗 +150525=中国,内蒙古自治区,通辽市,奈曼旗 +150526=中国,内蒙古自治区,通辽市,扎鲁特旗 +150581=中国,内蒙古自治区,通辽市,霍林郭勒市 +150600=中国,内蒙古自治区,鄂尔多斯市 +150602=中国,内蒙古自治区,鄂尔多斯市,东胜区 +150603=中国,内蒙古自治区,鄂尔多斯市,康巴什区 +150621=中国,内蒙古自治区,鄂尔多斯市,达拉特旗 +150622=中国,内蒙古自治区,鄂尔多斯市,准格尔旗 +150623=中国,内蒙古自治区,鄂尔多斯市,鄂托克前旗 +150624=中国,内蒙古自治区,鄂尔多斯市,鄂托克旗 +150625=中国,内蒙古自治区,鄂尔多斯市,杭锦旗 +150626=中国,内蒙古自治区,鄂尔多斯市,乌审旗 +150627=中国,内蒙古自治区,鄂尔多斯市,伊金霍洛旗 +150700=中国,内蒙古自治区,呼伦贝尔市 +150702=中国,内蒙古自治区,呼伦贝尔市,海拉尔区 +150703=中国,内蒙古自治区,呼伦贝尔市,扎赉诺尔区 +150721=中国,内蒙古自治区,呼伦贝尔市,阿荣旗 +150722=中国,内蒙古自治区,呼伦贝尔市,莫力达瓦达斡尔族自治旗 +150723=中国,内蒙古自治区,呼伦贝尔市,鄂伦春自治旗 +150724=中国,内蒙古自治区,呼伦贝尔市,鄂温克族自治旗 +150725=中国,内蒙古自治区,呼伦贝尔市,陈巴尔虎旗 +150726=中国,内蒙古自治区,呼伦贝尔市,新巴尔虎左旗 +150727=中国,内蒙古自治区,呼伦贝尔市,新巴尔虎右旗 +150781=中国,内蒙古自治区,呼伦贝尔市,满洲里市 +150782=中国,内蒙古自治区,呼伦贝尔市,牙克石市 +150783=中国,内蒙古自治区,呼伦贝尔市,扎兰屯市 +150784=中国,内蒙古自治区,呼伦贝尔市,额尔古纳市 +150785=中国,内蒙古自治区,呼伦贝尔市,根河市 +150800=中国,内蒙古自治区,巴彦淖尔市 +150802=中国,内蒙古自治区,巴彦淖尔市,临河区 +150821=中国,内蒙古自治区,巴彦淖尔市,五原县 +150822=中国,内蒙古自治区,巴彦淖尔市,磴口县 +150823=中国,内蒙古自治区,巴彦淖尔市,乌拉特前旗 +150824=中国,内蒙古自治区,巴彦淖尔市,乌拉特中旗 +150825=中国,内蒙古自治区,巴彦淖尔市,乌拉特后旗 +150826=中国,内蒙古自治区,巴彦淖尔市,杭锦后旗 +150900=中国,内蒙古自治区,乌兰察布市 +150902=中国,内蒙古自治区,乌兰察布市,集宁区 +150921=中国,内蒙古自治区,乌兰察布市,卓资县 +150922=中国,内蒙古自治区,乌兰察布市,化德县 +150923=中国,内蒙古自治区,乌兰察布市,商都县 +150924=中国,内蒙古自治区,乌兰察布市,兴和县 +150925=中国,内蒙古自治区,乌兰察布市,凉城县 +150926=中国,内蒙古自治区,乌兰察布市,察哈尔右翼前旗 +150927=中国,内蒙古自治区,乌兰察布市,察哈尔右翼中旗 +150928=中国,内蒙古自治区,乌兰察布市,察哈尔右翼后旗 +150929=中国,内蒙古自治区,乌兰察布市,四子王旗 +150981=中国,内蒙古自治区,乌兰察布市,丰镇市 +152200=中国,内蒙古自治区,兴安盟 +152201=中国,内蒙古自治区,兴安盟,乌兰浩特市 +152202=中国,内蒙古自治区,兴安盟,阿尔山市 +152221=中国,内蒙古自治区,兴安盟,科尔沁右翼前旗 +152222=中国,内蒙古自治区,兴安盟,科尔沁右翼中旗 +152223=中国,内蒙古自治区,兴安盟,扎赉特旗 +152224=中国,内蒙古自治区,兴安盟,突泉县 +152500=中国,内蒙古自治区,锡林郭勒盟 +152501=中国,内蒙古自治区,锡林郭勒盟,二连浩特市 +152502=中国,内蒙古自治区,锡林郭勒盟,锡林浩特市 +152522=中国,内蒙古自治区,锡林郭勒盟,阿巴嘎旗 +152523=中国,内蒙古自治区,锡林郭勒盟,苏尼特左旗 +152524=中国,内蒙古自治区,锡林郭勒盟,苏尼特右旗 +152525=中国,内蒙古自治区,锡林郭勒盟,东乌珠穆沁旗 +152526=中国,内蒙古自治区,锡林郭勒盟,西乌珠穆沁旗 +152527=中国,内蒙古自治区,锡林郭勒盟,太仆寺旗 +152528=中国,内蒙古自治区,锡林郭勒盟,镶黄旗 +152529=中国,内蒙古自治区,锡林郭勒盟,正镶白旗 +152530=中国,内蒙古自治区,锡林郭勒盟,正蓝旗 +152531=中国,内蒙古自治区,锡林郭勒盟,多伦县 +152900=中国,内蒙古自治区,阿拉善盟 +152921=中国,内蒙古自治区,阿拉善盟,阿拉善左旗 +152922=中国,内蒙古自治区,阿拉善盟,阿拉善右旗 +152923=中国,内蒙古自治区,阿拉善盟,额济纳旗 +210000=中国,辽宁省 +210100=中国,辽宁省,沈阳市 +210102=中国,辽宁省,沈阳市,和平区 +210103=中国,辽宁省,沈阳市,沈河区 +210104=中国,辽宁省,沈阳市,大东区 +210105=中国,辽宁省,沈阳市,皇姑区 +210106=中国,辽宁省,沈阳市,铁西区 +210111=中国,辽宁省,沈阳市,苏家屯区 +210112=中国,辽宁省,沈阳市,浑南区 +210113=中国,辽宁省,沈阳市,沈北新区 +210114=中国,辽宁省,沈阳市,于洪区 +210115=中国,辽宁省,沈阳市,辽中区 +210123=中国,辽宁省,沈阳市,康平县 +210124=中国,辽宁省,沈阳市,法库县 +210181=中国,辽宁省,沈阳市,新民市 +210200=中国,辽宁省,大连市 +210202=中国,辽宁省,大连市,中山区 +210203=中国,辽宁省,大连市,西岗区 +210204=中国,辽宁省,大连市,沙河口区 +210211=中国,辽宁省,大连市,甘井子区 +210212=中国,辽宁省,大连市,旅顺口区 +210213=中国,辽宁省,大连市,金州区 +210214=中国,辽宁省,大连市,普兰店区 +210224=中国,辽宁省,大连市,长海县 +210281=中国,辽宁省,大连市,瓦房店市 +210283=中国,辽宁省,大连市,庄河市 +210300=中国,辽宁省,鞍山市 +210302=中国,辽宁省,鞍山市,铁东区 +210303=中国,辽宁省,鞍山市,铁西区 +210304=中国,辽宁省,鞍山市,立山区 +210311=中国,辽宁省,鞍山市,千山区 +210321=中国,辽宁省,鞍山市,台安县 +210323=中国,辽宁省,鞍山市,岫岩满族自治县 +210381=中国,辽宁省,鞍山市,海城市 +210400=中国,辽宁省,抚顺市 +210402=中国,辽宁省,抚顺市,新抚区 +210403=中国,辽宁省,抚顺市,东洲区 +210404=中国,辽宁省,抚顺市,望花区 +210411=中国,辽宁省,抚顺市,顺城区 +210421=中国,辽宁省,抚顺市,抚顺县 +210422=中国,辽宁省,抚顺市,新宾满族自治县 +210423=中国,辽宁省,抚顺市,清原满族自治县 +210500=中国,辽宁省,本溪市 +210502=中国,辽宁省,本溪市,平山区 +210503=中国,辽宁省,本溪市,溪湖区 +210504=中国,辽宁省,本溪市,明山区 +210505=中国,辽宁省,本溪市,南芬区 +210521=中国,辽宁省,本溪市,本溪满族自治县 +210522=中国,辽宁省,本溪市,桓仁满族自治县 +210600=中国,辽宁省,丹东市 +210602=中国,辽宁省,丹东市,元宝区 +210603=中国,辽宁省,丹东市,振兴区 +210604=中国,辽宁省,丹东市,振安区 +210624=中国,辽宁省,丹东市,宽甸满族自治县 +210681=中国,辽宁省,丹东市,东港市 +210682=中国,辽宁省,丹东市,凤城市 +210700=中国,辽宁省,锦州市 +210702=中国,辽宁省,锦州市,古塔区 +210703=中国,辽宁省,锦州市,凌河区 +210711=中国,辽宁省,锦州市,太和区 +210726=中国,辽宁省,锦州市,黑山县 +210727=中国,辽宁省,锦州市,义县 +210781=中国,辽宁省,锦州市,凌海市 +210782=中国,辽宁省,锦州市,北镇市 +210800=中国,辽宁省,营口市 +210802=中国,辽宁省,营口市,站前区 +210803=中国,辽宁省,营口市,西市区 +210804=中国,辽宁省,营口市,鲅鱼圈区 +210811=中国,辽宁省,营口市,老边区 +210881=中国,辽宁省,营口市,盖州市 +210882=中国,辽宁省,营口市,大石桥市 +210900=中国,辽宁省,阜新市 +210902=中国,辽宁省,阜新市,海州区 +210903=中国,辽宁省,阜新市,新邱区 +210904=中国,辽宁省,阜新市,太平区 +210905=中国,辽宁省,阜新市,清河门区 +210911=中国,辽宁省,阜新市,细河区 +210921=中国,辽宁省,阜新市,阜新蒙古族自治县 +210922=中国,辽宁省,阜新市,彰武县 +211000=中国,辽宁省,辽阳市 +211002=中国,辽宁省,辽阳市,白塔区 +211003=中国,辽宁省,辽阳市,文圣区 +211004=中国,辽宁省,辽阳市,宏伟区 +211005=中国,辽宁省,辽阳市,弓长岭区 +211011=中国,辽宁省,辽阳市,太子河区 +211021=中国,辽宁省,辽阳市,辽阳县 +211081=中国,辽宁省,辽阳市,灯塔市 +211100=中国,辽宁省,盘锦市 +211102=中国,辽宁省,盘锦市,双台子区 +211103=中国,辽宁省,盘锦市,兴隆台区 +211104=中国,辽宁省,盘锦市,大洼区 +211122=中国,辽宁省,盘锦市,盘山县 +211200=中国,辽宁省,铁岭市 +211202=中国,辽宁省,铁岭市,银州区 +211204=中国,辽宁省,铁岭市,清河区 +211221=中国,辽宁省,铁岭市,铁岭县 +211223=中国,辽宁省,铁岭市,西丰县 +211224=中国,辽宁省,铁岭市,昌图县 +211281=中国,辽宁省,铁岭市,调兵山市 +211282=中国,辽宁省,铁岭市,开原市 +211300=中国,辽宁省,朝阳市 +211302=中国,辽宁省,朝阳市,双塔区 +211303=中国,辽宁省,朝阳市,龙城区 +211321=中国,辽宁省,朝阳市,朝阳县 +211322=中国,辽宁省,朝阳市,建平县 +211324=中国,辽宁省,朝阳市,喀喇沁左翼蒙古族自治县 +211381=中国,辽宁省,朝阳市,北票市 +211382=中国,辽宁省,朝阳市,凌源市 +211400=中国,辽宁省,葫芦岛市 +211402=中国,辽宁省,葫芦岛市,连山区 +211403=中国,辽宁省,葫芦岛市,龙港区 +211404=中国,辽宁省,葫芦岛市,南票区 +211421=中国,辽宁省,葫芦岛市,绥中县 +211422=中国,辽宁省,葫芦岛市,建昌县 +211481=中国,辽宁省,葫芦岛市,兴城市 +220000=中国,吉林省 +220100=中国,吉林省,长春市 +220102=中国,吉林省,长春市,南关区 +220103=中国,吉林省,长春市,宽城区 +220104=中国,吉林省,长春市,朝阳区 +220105=中国,吉林省,长春市,二道区 +220106=中国,吉林省,长春市,绿园区 +220112=中国,吉林省,长春市,双阳区 +220113=中国,吉林省,长春市,九台区 +220122=中国,吉林省,长春市,农安县 +220182=中国,吉林省,长春市,榆树市 +220183=中国,吉林省,长春市,德惠市 +220200=中国,吉林省,吉林市 +220202=中国,吉林省,吉林市,昌邑区 +220203=中国,吉林省,吉林市,龙潭区 +220204=中国,吉林省,吉林市,船营区 +220211=中国,吉林省,吉林市,丰满区 +220221=中国,吉林省,吉林市,永吉县 +220281=中国,吉林省,吉林市,蛟河市 +220282=中国,吉林省,吉林市,桦甸市 +220283=中国,吉林省,吉林市,舒兰市 +220284=中国,吉林省,吉林市,磐石市 +220300=中国,吉林省,四平市 +220302=中国,吉林省,四平市,铁西区 +220303=中国,吉林省,四平市,铁东区 +220322=中国,吉林省,四平市,梨树县 +220323=中国,吉林省,四平市,伊通满族自治县 +220381=中国,吉林省,四平市,公主岭市 +220382=中国,吉林省,四平市,双辽市 +220400=中国,吉林省,辽源市 +220402=中国,吉林省,辽源市,龙山区 +220403=中国,吉林省,辽源市,西安区 +220421=中国,吉林省,辽源市,东丰县 +220422=中国,吉林省,辽源市,东辽县 +220500=中国,吉林省,通化市 +220502=中国,吉林省,通化市,东昌区 +220503=中国,吉林省,通化市,二道江区 +220521=中国,吉林省,通化市,通化县 +220523=中国,吉林省,通化市,辉南县 +220524=中国,吉林省,通化市,柳河县 +220581=中国,吉林省,通化市,梅河口市 +220582=中国,吉林省,通化市,集安市 +220600=中国,吉林省,白山市 +220602=中国,吉林省,白山市,浑江区 +220605=中国,吉林省,白山市,江源区 +220621=中国,吉林省,白山市,抚松县 +220622=中国,吉林省,白山市,靖宇县 +220623=中国,吉林省,白山市,长白朝鲜族自治县 +220681=中国,吉林省,白山市,临江市 +220700=中国,吉林省,松原市 +220702=中国,吉林省,松原市,宁江区 +220721=中国,吉林省,松原市,前郭尔罗斯蒙古族自治县 +220722=中国,吉林省,松原市,长岭县 +220723=中国,吉林省,松原市,乾安县 +220781=中国,吉林省,松原市,扶余市 +220800=中国,吉林省,白城市 +220802=中国,吉林省,白城市,洮北区 +220821=中国,吉林省,白城市,镇赉县 +220822=中国,吉林省,白城市,通榆县 +220881=中国,吉林省,白城市,洮南市 +220882=中国,吉林省,白城市,大安市 +222400=中国,吉林省,延边朝鲜族自治州 +222401=中国,吉林省,延边朝鲜族自治州,延吉市 +222402=中国,吉林省,延边朝鲜族自治州,图们市 +222403=中国,吉林省,延边朝鲜族自治州,敦化市 +222404=中国,吉林省,延边朝鲜族自治州,珲春市 +222405=中国,吉林省,延边朝鲜族自治州,龙井市 +222406=中国,吉林省,延边朝鲜族自治州,和龙市 +222424=中国,吉林省,延边朝鲜族自治州,汪清县 +222426=中国,吉林省,延边朝鲜族自治州,安图县 +230000=中国,黑龙江省 +230100=中国,黑龙江省,哈尔滨市 +230102=中国,黑龙江省,哈尔滨市,道里区 +230103=中国,黑龙江省,哈尔滨市,南岗区 +230104=中国,黑龙江省,哈尔滨市,道外区 +230108=中国,黑龙江省,哈尔滨市,平房区 +230109=中国,黑龙江省,哈尔滨市,松北区 +230110=中国,黑龙江省,哈尔滨市,香坊区 +230111=中国,黑龙江省,哈尔滨市,呼兰区 +230112=中国,黑龙江省,哈尔滨市,阿城区 +230113=中国,黑龙江省,哈尔滨市,双城区 +230123=中国,黑龙江省,哈尔滨市,依兰县 +230124=中国,黑龙江省,哈尔滨市,方正县 +230125=中国,黑龙江省,哈尔滨市,宾县 +230126=中国,黑龙江省,哈尔滨市,巴彦县 +230127=中国,黑龙江省,哈尔滨市,木兰县 +230128=中国,黑龙江省,哈尔滨市,通河县 +230129=中国,黑龙江省,哈尔滨市,延寿县 +230183=中国,黑龙江省,哈尔滨市,尚志市 +230184=中国,黑龙江省,哈尔滨市,五常市 +230200=中国,黑龙江省,齐齐哈尔市 +230202=中国,黑龙江省,齐齐哈尔市,龙沙区 +230203=中国,黑龙江省,齐齐哈尔市,建华区 +230204=中国,黑龙江省,齐齐哈尔市,铁锋区 +230205=中国,黑龙江省,齐齐哈尔市,昂昂溪区 +230206=中国,黑龙江省,齐齐哈尔市,富拉尔基区 +230207=中国,黑龙江省,齐齐哈尔市,碾子山区 +230208=中国,黑龙江省,齐齐哈尔市,梅里斯达斡尔族区 +230221=中国,黑龙江省,齐齐哈尔市,龙江县 +230223=中国,黑龙江省,齐齐哈尔市,依安县 +230224=中国,黑龙江省,齐齐哈尔市,泰来县 +230225=中国,黑龙江省,齐齐哈尔市,甘南县 +230227=中国,黑龙江省,齐齐哈尔市,富裕县 +230229=中国,黑龙江省,齐齐哈尔市,克山县 +230230=中国,黑龙江省,齐齐哈尔市,克东县 +230231=中国,黑龙江省,齐齐哈尔市,拜泉县 +230281=中国,黑龙江省,齐齐哈尔市,讷河市 +230300=中国,黑龙江省,鸡西市 +230302=中国,黑龙江省,鸡西市,鸡冠区 +230303=中国,黑龙江省,鸡西市,恒山区 +230304=中国,黑龙江省,鸡西市,滴道区 +230305=中国,黑龙江省,鸡西市,梨树区 +230306=中国,黑龙江省,鸡西市,城子河区 +230307=中国,黑龙江省,鸡西市,麻山区 +230321=中国,黑龙江省,鸡西市,鸡东县 +230381=中国,黑龙江省,鸡西市,虎林市 +230382=中国,黑龙江省,鸡西市,密山市 +230400=中国,黑龙江省,鹤岗市 +230402=中国,黑龙江省,鹤岗市,向阳区 +230403=中国,黑龙江省,鹤岗市,工农区 +230404=中国,黑龙江省,鹤岗市,南山区 +230405=中国,黑龙江省,鹤岗市,兴安区 +230406=中国,黑龙江省,鹤岗市,东山区 +230407=中国,黑龙江省,鹤岗市,兴山区 +230421=中国,黑龙江省,鹤岗市,萝北县 +230422=中国,黑龙江省,鹤岗市,绥滨县 +230500=中国,黑龙江省,双鸭山市 +230502=中国,黑龙江省,双鸭山市,尖山区 +230503=中国,黑龙江省,双鸭山市,岭东区 +230505=中国,黑龙江省,双鸭山市,四方台区 +230506=中国,黑龙江省,双鸭山市,宝山区 +230521=中国,黑龙江省,双鸭山市,集贤县 +230522=中国,黑龙江省,双鸭山市,友谊县 +230523=中国,黑龙江省,双鸭山市,宝清县 +230524=中国,黑龙江省,双鸭山市,饶河县 +230600=中国,黑龙江省,大庆市 +230602=中国,黑龙江省,大庆市,萨尔图区 +230603=中国,黑龙江省,大庆市,龙凤区 +230604=中国,黑龙江省,大庆市,让胡路区 +230605=中国,黑龙江省,大庆市,红岗区 +230606=中国,黑龙江省,大庆市,大同区 +230621=中国,黑龙江省,大庆市,肇州县 +230622=中国,黑龙江省,大庆市,肇源县 +230623=中国,黑龙江省,大庆市,林甸县 +230624=中国,黑龙江省,大庆市,杜尔伯特蒙古族自治县 +230700=中国,黑龙江省,伊春市 +230702=中国,黑龙江省,伊春市,伊春区 +230703=中国,黑龙江省,伊春市,南岔区 +230704=中国,黑龙江省,伊春市,友好区 +230705=中国,黑龙江省,伊春市,西林区 +230706=中国,黑龙江省,伊春市,翠峦区 +230707=中国,黑龙江省,伊春市,新青区 +230708=中国,黑龙江省,伊春市,美溪区 +230709=中国,黑龙江省,伊春市,金山屯区 +230710=中国,黑龙江省,伊春市,五营区 +230711=中国,黑龙江省,伊春市,乌马河区 +230712=中国,黑龙江省,伊春市,汤旺河区 +230713=中国,黑龙江省,伊春市,带岭区 +230714=中国,黑龙江省,伊春市,乌伊岭区 +230715=中国,黑龙江省,伊春市,红星区 +230716=中国,黑龙江省,伊春市,上甘岭区 +230722=中国,黑龙江省,伊春市,嘉荫县 +230781=中国,黑龙江省,伊春市,铁力市 +230800=中国,黑龙江省,佳木斯市 +230803=中国,黑龙江省,佳木斯市,向阳区 +230804=中国,黑龙江省,佳木斯市,前进区 +230805=中国,黑龙江省,佳木斯市,东风区 +230811=中国,黑龙江省,佳木斯市,郊区 +230822=中国,黑龙江省,佳木斯市,桦南县 +230826=中国,黑龙江省,佳木斯市,桦川县 +230828=中国,黑龙江省,佳木斯市,汤原县 +230881=中国,黑龙江省,佳木斯市,同江市 +230882=中国,黑龙江省,佳木斯市,富锦市 +230883=中国,黑龙江省,佳木斯市,抚远市 +230900=中国,黑龙江省,七台河市 +230902=中国,黑龙江省,七台河市,新兴区 +230903=中国,黑龙江省,七台河市,桃山区 +230904=中国,黑龙江省,七台河市,茄子河区 +230921=中国,黑龙江省,七台河市,勃利县 +231000=中国,黑龙江省,牡丹江市 +231002=中国,黑龙江省,牡丹江市,东安区 +231003=中国,黑龙江省,牡丹江市,阳明区 +231004=中国,黑龙江省,牡丹江市,爱民区 +231005=中国,黑龙江省,牡丹江市,西安区 +231025=中国,黑龙江省,牡丹江市,林口县 +231081=中国,黑龙江省,牡丹江市,绥芬河市 +231083=中国,黑龙江省,牡丹江市,海林市 +231084=中国,黑龙江省,牡丹江市,宁安市 +231085=中国,黑龙江省,牡丹江市,穆棱市 +231086=中国,黑龙江省,牡丹江市,东宁市 +231100=中国,黑龙江省,黑河市 +231102=中国,黑龙江省,黑河市,爱辉区 +231121=中国,黑龙江省,黑河市,嫩江县 +231123=中国,黑龙江省,黑河市,逊克县 +231124=中国,黑龙江省,黑河市,孙吴县 +231181=中国,黑龙江省,黑河市,北安市 +231182=中国,黑龙江省,黑河市,五大连池市 +231200=中国,黑龙江省,绥化市 +231202=中国,黑龙江省,绥化市,北林区 +231221=中国,黑龙江省,绥化市,望奎县 +231222=中国,黑龙江省,绥化市,兰西县 +231223=中国,黑龙江省,绥化市,青冈县 +231224=中国,黑龙江省,绥化市,庆安县 +231225=中国,黑龙江省,绥化市,明水县 +231226=中国,黑龙江省,绥化市,绥棱县 +231281=中国,黑龙江省,绥化市,安达市 +231282=中国,黑龙江省,绥化市,肇东市 +231283=中国,黑龙江省,绥化市,海伦市 +232700=中国,黑龙江省,大兴安岭地区 +232701=中国,黑龙江省,大兴安岭地区,加格达奇区 +232721=中国,黑龙江省,大兴安岭地区,呼玛县 +232722=中国,黑龙江省,大兴安岭地区,塔河县 +232723=中国,黑龙江省,大兴安岭地区,漠河县 +310000=中国,,上海市 +310101=中国,,上海市,黄浦区 +310104=中国,,上海市,徐汇区 +310105=中国,,上海市,长宁区 +310106=中国,,上海市,静安区 +310107=中国,,上海市,普陀区 +310109=中国,,上海市,虹口区 +310110=中国,,上海市,杨浦区 +310112=中国,,上海市,闵行区 +310113=中国,,上海市,宝山区 +310114=中国,,上海市,嘉定区 +310115=中国,,上海市,浦东新区 +310116=中国,,上海市,金山区 +310117=中国,,上海市,松江区 +310118=中国,,上海市,青浦区 +310120=中国,,上海市,奉贤区 +310151=中国,,上海市,崇明区 +320000=中国,江苏省 +320100=中国,江苏省,南京市 +320102=中国,江苏省,南京市,玄武区 +320104=中国,江苏省,南京市,秦淮区 +320105=中国,江苏省,南京市,建邺区 +320106=中国,江苏省,南京市,鼓楼区 +320111=中国,江苏省,南京市,浦口区 +320113=中国,江苏省,南京市,栖霞区 +320114=中国,江苏省,南京市,雨花台区 +320115=中国,江苏省,南京市,江宁区 +320116=中国,江苏省,南京市,六合区 +320117=中国,江苏省,南京市,溧水区 +320118=中国,江苏省,南京市,高淳区 +320200=中国,江苏省,无锡市 +320205=中国,江苏省,无锡市,锡山区 +320206=中国,江苏省,无锡市,惠山区 +320211=中国,江苏省,无锡市,滨湖区 +320213=中国,江苏省,无锡市,梁溪区 +320214=中国,江苏省,无锡市,新吴区 +320281=中国,江苏省,无锡市,江阴市 +320282=中国,江苏省,无锡市,宜兴市 +320300=中国,江苏省,徐州市 +320302=中国,江苏省,徐州市,鼓楼区 +320303=中国,江苏省,徐州市,云龙区 +320305=中国,江苏省,徐州市,贾汪区 +320311=中国,江苏省,徐州市,泉山区 +320312=中国,江苏省,徐州市,铜山区 +320321=中国,江苏省,徐州市,丰县 +320322=中国,江苏省,徐州市,沛县 +320324=中国,江苏省,徐州市,睢宁县 +320381=中国,江苏省,徐州市,新沂市 +320382=中国,江苏省,徐州市,邳州市 +320400=中国,江苏省,常州市 +320402=中国,江苏省,常州市,天宁区 +320404=中国,江苏省,常州市,钟楼区 +320411=中国,江苏省,常州市,新北区 +320412=中国,江苏省,常州市,武进区 +320413=中国,江苏省,常州市,金坛区 +320481=中国,江苏省,常州市,溧阳市 +320500=中国,江苏省,苏州市 +320505=中国,江苏省,苏州市,虎丘区 +320506=中国,江苏省,苏州市,吴中区 +320507=中国,江苏省,苏州市,相城区 +320508=中国,江苏省,苏州市,姑苏区 +320509=中国,江苏省,苏州市,吴江区 +320581=中国,江苏省,苏州市,常熟市 +320582=中国,江苏省,苏州市,张家港市 +320583=中国,江苏省,苏州市,昆山市 +320585=中国,江苏省,苏州市,太仓市 +320600=中国,江苏省,南通市 +320602=中国,江苏省,南通市,崇川区 +320611=中国,江苏省,南通市,港闸区 +320612=中国,江苏省,南通市,通州区 +320621=中国,江苏省,南通市,海安县 +320623=中国,江苏省,南通市,如东县 +320681=中国,江苏省,南通市,启东市 +320682=中国,江苏省,南通市,如皋市 +320684=中国,江苏省,南通市,海门市 +320700=中国,江苏省,连云港市 +320703=中国,江苏省,连云港市,连云区 +320706=中国,江苏省,连云港市,海州区 +320707=中国,江苏省,连云港市,赣榆区 +320722=中国,江苏省,连云港市,东海县 +320723=中国,江苏省,连云港市,灌云县 +320724=中国,江苏省,连云港市,灌南县 +320800=中国,江苏省,淮安市 +320803=中国,江苏省,淮安市,淮安区 +320804=中国,江苏省,淮安市,淮阴区 +320812=中国,江苏省,淮安市,清江浦区 +320813=中国,江苏省,淮安市,洪泽区 +320826=中国,江苏省,淮安市,涟水县 +320830=中国,江苏省,淮安市,盱眙县 +320831=中国,江苏省,淮安市,金湖县 +320900=中国,江苏省,盐城市 +320902=中国,江苏省,盐城市,亭湖区 +320903=中国,江苏省,盐城市,盐都区 +320904=中国,江苏省,盐城市,大丰区 +320921=中国,江苏省,盐城市,响水县 +320922=中国,江苏省,盐城市,滨海县 +320923=中国,江苏省,盐城市,阜宁县 +320924=中国,江苏省,盐城市,射阳县 +320925=中国,江苏省,盐城市,建湖县 +320981=中国,江苏省,盐城市,东台市 +321000=中国,江苏省,扬州市 +321002=中国,江苏省,扬州市,广陵区 +321003=中国,江苏省,扬州市,邗江区 +321012=中国,江苏省,扬州市,江都区 +321023=中国,江苏省,扬州市,宝应县 +321081=中国,江苏省,扬州市,仪征市 +321084=中国,江苏省,扬州市,高邮市 +321100=中国,江苏省,镇江市 +321102=中国,江苏省,镇江市,京口区 +321111=中国,江苏省,镇江市,润州区 +321112=中国,江苏省,镇江市,丹徒区 +321181=中国,江苏省,镇江市,丹阳市 +321182=中国,江苏省,镇江市,扬中市 +321183=中国,江苏省,镇江市,句容市 +321200=中国,江苏省,泰州市 +321202=中国,江苏省,泰州市,海陵区 +321203=中国,江苏省,泰州市,高港区 +321204=中国,江苏省,泰州市,姜堰区 +321281=中国,江苏省,泰州市,兴化市 +321282=中国,江苏省,泰州市,靖江市 +321283=中国,江苏省,泰州市,泰兴市 +321300=中国,江苏省,宿迁市 +321302=中国,江苏省,宿迁市,宿城区 +321311=中国,江苏省,宿迁市,宿豫区 +321322=中国,江苏省,宿迁市,沭阳县 +321323=中国,江苏省,宿迁市,泗阳县 +321324=中国,江苏省,宿迁市,泗洪县 +330000=中国,浙江省 +330100=中国,浙江省,杭州市 +330102=中国,浙江省,杭州市,上城区 +330103=中国,浙江省,杭州市,下城区 +330104=中国,浙江省,杭州市,江干区 +330105=中国,浙江省,杭州市,拱墅区 +330106=中国,浙江省,杭州市,西湖区 +330108=中国,浙江省,杭州市,滨江区 +330109=中国,浙江省,杭州市,萧山区 +330110=中国,浙江省,杭州市,余杭区 +330111=中国,浙江省,杭州市,富阳区 +330122=中国,浙江省,杭州市,桐庐县 +330127=中国,浙江省,杭州市,淳安县 +330182=中国,浙江省,杭州市,建德市 +330185=中国,浙江省,杭州市,临安市 +330200=中国,浙江省,宁波市 +330203=中国,浙江省,宁波市,海曙区 +330205=中国,浙江省,宁波市,江北区 +330206=中国,浙江省,宁波市,北仑区 +330211=中国,浙江省,宁波市,镇海区 +330212=中国,浙江省,宁波市,鄞州区 +330213=中国,浙江省,宁波市,奉化区 +330225=中国,浙江省,宁波市,象山县 +330226=中国,浙江省,宁波市,宁海县 +330281=中国,浙江省,宁波市,余姚市 +330282=中国,浙江省,宁波市,慈溪市 +330300=中国,浙江省,温州市 +330302=中国,浙江省,温州市,鹿城区 +330303=中国,浙江省,温州市,龙湾区 +330304=中国,浙江省,温州市,瓯海区 +330305=中国,浙江省,温州市,洞头区 +330324=中国,浙江省,温州市,永嘉县 +330326=中国,浙江省,温州市,平阳县 +330327=中国,浙江省,温州市,苍南县 +330328=中国,浙江省,温州市,文成县 +330329=中国,浙江省,温州市,泰顺县 +330381=中国,浙江省,温州市,瑞安市 +330382=中国,浙江省,温州市,乐清市 +330400=中国,浙江省,嘉兴市 +330402=中国,浙江省,嘉兴市,南湖区 +330411=中国,浙江省,嘉兴市,秀洲区 +330421=中国,浙江省,嘉兴市,嘉善县 +330424=中国,浙江省,嘉兴市,海盐县 +330481=中国,浙江省,嘉兴市,海宁市 +330482=中国,浙江省,嘉兴市,平湖市 +330483=中国,浙江省,嘉兴市,桐乡市 +330500=中国,浙江省,湖州市 +330502=中国,浙江省,湖州市,吴兴区 +330503=中国,浙江省,湖州市,南浔区 +330521=中国,浙江省,湖州市,德清县 +330522=中国,浙江省,湖州市,长兴县 +330523=中国,浙江省,湖州市,安吉县 +330600=中国,浙江省,绍兴市 +330602=中国,浙江省,绍兴市,越城区 +330603=中国,浙江省,绍兴市,柯桥区 +330604=中国,浙江省,绍兴市,上虞区 +330624=中国,浙江省,绍兴市,新昌县 +330681=中国,浙江省,绍兴市,诸暨市 +330683=中国,浙江省,绍兴市,嵊州市 +330700=中国,浙江省,金华市 +330702=中国,浙江省,金华市,婺城区 +330703=中国,浙江省,金华市,金东区 +330723=中国,浙江省,金华市,武义县 +330726=中国,浙江省,金华市,浦江县 +330727=中国,浙江省,金华市,磐安县 +330781=中国,浙江省,金华市,兰溪市 +330782=中国,浙江省,金华市,义乌市 +330783=中国,浙江省,金华市,东阳市 +330784=中国,浙江省,金华市,永康市 +330800=中国,浙江省,衢州市 +330802=中国,浙江省,衢州市,柯城区 +330803=中国,浙江省,衢州市,衢江区 +330822=中国,浙江省,衢州市,常山县 +330824=中国,浙江省,衢州市,开化县 +330825=中国,浙江省,衢州市,龙游县 +330881=中国,浙江省,衢州市,江山市 +330900=中国,浙江省,舟山市 +330902=中国,浙江省,舟山市,定海区 +330903=中国,浙江省,舟山市,普陀区 +330921=中国,浙江省,舟山市,岱山县 +330922=中国,浙江省,舟山市,嵊泗县 +331000=中国,浙江省,台州市 +331002=中国,浙江省,台州市,椒江区 +331003=中国,浙江省,台州市,黄岩区 +331004=中国,浙江省,台州市,路桥区 +331022=中国,浙江省,台州市,三门县 +331023=中国,浙江省,台州市,天台县 +331024=中国,浙江省,台州市,仙居县 +331081=中国,浙江省,台州市,温岭市 +331082=中国,浙江省,台州市,临海市 +331083=中国,浙江省,台州市,玉环市 +331100=中国,浙江省,丽水市 +331102=中国,浙江省,丽水市,莲都区 +331121=中国,浙江省,丽水市,青田县 +331122=中国,浙江省,丽水市,缙云县 +331123=中国,浙江省,丽水市,遂昌县 +331124=中国,浙江省,丽水市,松阳县 +331125=中国,浙江省,丽水市,云和县 +331126=中国,浙江省,丽水市,庆元县 +331127=中国,浙江省,丽水市,景宁畲族自治县 +331181=中国,浙江省,丽水市,龙泉市 +340000=中国,安徽省 +340100=中国,安徽省,合肥市 +340102=中国,安徽省,合肥市,瑶海区 +340103=中国,安徽省,合肥市,庐阳区 +340104=中国,安徽省,合肥市,蜀山区 +340111=中国,安徽省,合肥市,包河区 +340121=中国,安徽省,合肥市,长丰县 +340122=中国,安徽省,合肥市,肥东县 +340123=中国,安徽省,合肥市,肥西县 +340124=中国,安徽省,合肥市,庐江县 +340181=中国,安徽省,合肥市,巢湖市 +340200=中国,安徽省,芜湖市 +340202=中国,安徽省,芜湖市,镜湖区 +340203=中国,安徽省,芜湖市,弋江区 +340207=中国,安徽省,芜湖市,鸠江区 +340208=中国,安徽省,芜湖市,三山区 +340221=中国,安徽省,芜湖市,芜湖县 +340222=中国,安徽省,芜湖市,繁昌县 +340223=中国,安徽省,芜湖市,南陵县 +340225=中国,安徽省,芜湖市,无为县 +340300=中国,安徽省,蚌埠市 +340302=中国,安徽省,蚌埠市,龙子湖区 +340303=中国,安徽省,蚌埠市,蚌山区 +340304=中国,安徽省,蚌埠市,禹会区 +340311=中国,安徽省,蚌埠市,淮上区 +340321=中国,安徽省,蚌埠市,怀远县 +340322=中国,安徽省,蚌埠市,五河县 +340323=中国,安徽省,蚌埠市,固镇县 +340400=中国,安徽省,淮南市 +340402=中国,安徽省,淮南市,大通区 +340403=中国,安徽省,淮南市,田家庵区 +340404=中国,安徽省,淮南市,谢家集区 +340405=中国,安徽省,淮南市,八公山区 +340406=中国,安徽省,淮南市,潘集区 +340421=中国,安徽省,淮南市,凤台县 +340422=中国,安徽省,淮南市,寿县 +340500=中国,安徽省,马鞍山市 +340503=中国,安徽省,马鞍山市,花山区 +340504=中国,安徽省,马鞍山市,雨山区 +340506=中国,安徽省,马鞍山市,博望区 +340521=中国,安徽省,马鞍山市,当涂县 +340522=中国,安徽省,马鞍山市,含山县 +340523=中国,安徽省,马鞍山市,和县 +340600=中国,安徽省,淮北市 +340602=中国,安徽省,淮北市,杜集区 +340603=中国,安徽省,淮北市,相山区 +340604=中国,安徽省,淮北市,烈山区 +340621=中国,安徽省,淮北市,濉溪县 +340700=中国,安徽省,铜陵市 +340705=中国,安徽省,铜陵市,铜官区 +340706=中国,安徽省,铜陵市,义安区 +340711=中国,安徽省,铜陵市,郊区 +340722=中国,安徽省,铜陵市,枞阳县 +340800=中国,安徽省,安庆市 +340802=中国,安徽省,安庆市,迎江区 +340803=中国,安徽省,安庆市,大观区 +340811=中国,安徽省,安庆市,宜秀区 +340822=中国,安徽省,安庆市,怀宁县 +340824=中国,安徽省,安庆市,潜山县 +340825=中国,安徽省,安庆市,太湖县 +340826=中国,安徽省,安庆市,宿松县 +340827=中国,安徽省,安庆市,望江县 +340828=中国,安徽省,安庆市,岳西县 +340881=中国,安徽省,安庆市,桐城市 +341000=中国,安徽省,黄山市 +341002=中国,安徽省,黄山市,屯溪区 +341003=中国,安徽省,黄山市,黄山区 +341004=中国,安徽省,黄山市,徽州区 +341021=中国,安徽省,黄山市,歙县 +341022=中国,安徽省,黄山市,休宁县 +341023=中国,安徽省,黄山市,黟县 +341024=中国,安徽省,黄山市,祁门县 +341100=中国,安徽省,滁州市 +341102=中国,安徽省,滁州市,琅琊区 +341103=中国,安徽省,滁州市,南谯区 +341122=中国,安徽省,滁州市,来安县 +341124=中国,安徽省,滁州市,全椒县 +341125=中国,安徽省,滁州市,定远县 +341126=中国,安徽省,滁州市,凤阳县 +341181=中国,安徽省,滁州市,天长市 +341182=中国,安徽省,滁州市,明光市 +341200=中国,安徽省,阜阳市 +341202=中国,安徽省,阜阳市,颍州区 +341203=中国,安徽省,阜阳市,颍东区 +341204=中国,安徽省,阜阳市,颍泉区 +341221=中国,安徽省,阜阳市,临泉县 +341222=中国,安徽省,阜阳市,太和县 +341225=中国,安徽省,阜阳市,阜南县 +341226=中国,安徽省,阜阳市,颍上县 +341282=中国,安徽省,阜阳市,界首市 +341300=中国,安徽省,宿州市 +341302=中国,安徽省,宿州市,埇桥区 +341321=中国,安徽省,宿州市,砀山县 +341322=中国,安徽省,宿州市,萧县 +341323=中国,安徽省,宿州市,灵璧县 +341324=中国,安徽省,宿州市,泗县 +341500=中国,安徽省,六安市 +341502=中国,安徽省,六安市,金安区 +341503=中国,安徽省,六安市,裕安区 +341504=中国,安徽省,六安市,叶集区 +341522=中国,安徽省,六安市,霍邱县 +341523=中国,安徽省,六安市,舒城县 +341524=中国,安徽省,六安市,金寨县 +341525=中国,安徽省,六安市,霍山县 +341600=中国,安徽省,亳州市 +341602=中国,安徽省,亳州市,谯城区 +341621=中国,安徽省,亳州市,涡阳县 +341622=中国,安徽省,亳州市,蒙城县 +341623=中国,安徽省,亳州市,利辛县 +341700=中国,安徽省,池州市 +341702=中国,安徽省,池州市,贵池区 +341721=中国,安徽省,池州市,东至县 +341722=中国,安徽省,池州市,石台县 +341723=中国,安徽省,池州市,青阳县 +341800=中国,安徽省,宣城市 +341802=中国,安徽省,宣城市,宣州区 +341821=中国,安徽省,宣城市,郎溪县 +341822=中国,安徽省,宣城市,广德县 +341823=中国,安徽省,宣城市,泾县 +341824=中国,安徽省,宣城市,绩溪县 +341825=中国,安徽省,宣城市,旌德县 +341881=中国,安徽省,宣城市,宁国市 +350000=中国,福建省 +350100=中国,福建省,福州市 +350102=中国,福建省,福州市,鼓楼区 +350103=中国,福建省,福州市,台江区 +350104=中国,福建省,福州市,仓山区 +350105=中国,福建省,福州市,马尾区 +350111=中国,福建省,福州市,晋安区 +350121=中国,福建省,福州市,闽侯县 +350122=中国,福建省,福州市,连江县 +350123=中国,福建省,福州市,罗源县 +350124=中国,福建省,福州市,闽清县 +350125=中国,福建省,福州市,永泰县 +350128=中国,福建省,福州市,平潭县 +350181=中国,福建省,福州市,福清市 +350182=中国,福建省,福州市,长乐市 +350200=中国,福建省,厦门市 +350203=中国,福建省,厦门市,思明区 +350205=中国,福建省,厦门市,海沧区 +350206=中国,福建省,厦门市,湖里区 +350211=中国,福建省,厦门市,集美区 +350212=中国,福建省,厦门市,同安区 +350213=中国,福建省,厦门市,翔安区 +350300=中国,福建省,莆田市 +350302=中国,福建省,莆田市,城厢区 +350303=中国,福建省,莆田市,涵江区 +350304=中国,福建省,莆田市,荔城区 +350305=中国,福建省,莆田市,秀屿区 +350322=中国,福建省,莆田市,仙游县 +350400=中国,福建省,三明市 +350402=中国,福建省,三明市,梅列区 +350403=中国,福建省,三明市,三元区 +350421=中国,福建省,三明市,明溪县 +350423=中国,福建省,三明市,清流县 +350424=中国,福建省,三明市,宁化县 +350425=中国,福建省,三明市,大田县 +350426=中国,福建省,三明市,尤溪县 +350427=中国,福建省,三明市,沙县 +350428=中国,福建省,三明市,将乐县 +350429=中国,福建省,三明市,泰宁县 +350430=中国,福建省,三明市,建宁县 +350481=中国,福建省,三明市,永安市 +350500=中国,福建省,泉州市 +350502=中国,福建省,泉州市,鲤城区 +350503=中国,福建省,泉州市,丰泽区 +350504=中国,福建省,泉州市,洛江区 +350505=中国,福建省,泉州市,泉港区 +350521=中国,福建省,泉州市,惠安县 +350524=中国,福建省,泉州市,安溪县 +350525=中国,福建省,泉州市,永春县 +350526=中国,福建省,泉州市,德化县 +350527=中国,福建省,泉州市,金门县 +350581=中国,福建省,泉州市,石狮市 +350582=中国,福建省,泉州市,晋江市 +350583=中国,福建省,泉州市,南安市 +350600=中国,福建省,漳州市 +350602=中国,福建省,漳州市,芗城区 +350603=中国,福建省,漳州市,龙文区 +350622=中国,福建省,漳州市,云霄县 +350623=中国,福建省,漳州市,漳浦县 +350624=中国,福建省,漳州市,诏安县 +350625=中国,福建省,漳州市,长泰县 +350626=中国,福建省,漳州市,东山县 +350627=中国,福建省,漳州市,南靖县 +350628=中国,福建省,漳州市,平和县 +350629=中国,福建省,漳州市,华安县 +350681=中国,福建省,漳州市,龙海市 +350700=中国,福建省,南平市 +350702=中国,福建省,南平市,延平区 +350703=中国,福建省,南平市,建阳区 +350721=中国,福建省,南平市,顺昌县 +350722=中国,福建省,南平市,浦城县 +350723=中国,福建省,南平市,光泽县 +350724=中国,福建省,南平市,松溪县 +350725=中国,福建省,南平市,政和县 +350781=中国,福建省,南平市,邵武市 +350782=中国,福建省,南平市,武夷山市 +350783=中国,福建省,南平市,建瓯市 +350800=中国,福建省,龙岩市 +350802=中国,福建省,龙岩市,新罗区 +350803=中国,福建省,龙岩市,永定区 +350821=中国,福建省,龙岩市,长汀县 +350823=中国,福建省,龙岩市,上杭县 +350824=中国,福建省,龙岩市,武平县 +350825=中国,福建省,龙岩市,连城县 +350881=中国,福建省,龙岩市,漳平市 +350900=中国,福建省,宁德市 +350902=中国,福建省,宁德市,蕉城区 +350921=中国,福建省,宁德市,霞浦县 +350922=中国,福建省,宁德市,古田县 +350923=中国,福建省,宁德市,屏南县 +350924=中国,福建省,宁德市,寿宁县 +350925=中国,福建省,宁德市,周宁县 +350926=中国,福建省,宁德市,柘荣县 +350981=中国,福建省,宁德市,福安市 +350982=中国,福建省,宁德市,福鼎市 +360000=中国,江西省 +360100=中国,江西省,南昌市 +360102=中国,江西省,南昌市,东湖区 +360103=中国,江西省,南昌市,西湖区 +360104=中国,江西省,南昌市,青云谱区 +360105=中国,江西省,南昌市,湾里区 +360111=中国,江西省,南昌市,青山湖区 +360112=中国,江西省,南昌市,新建区 +360121=中国,江西省,南昌市,南昌县 +360123=中国,江西省,南昌市,安义县 +360124=中国,江西省,南昌市,进贤县 +360200=中国,江西省,景德镇市 +360202=中国,江西省,景德镇市,昌江区 +360203=中国,江西省,景德镇市,珠山区 +360222=中国,江西省,景德镇市,浮梁县 +360281=中国,江西省,景德镇市,乐平市 +360300=中国,江西省,萍乡市 +360302=中国,江西省,萍乡市,安源区 +360313=中国,江西省,萍乡市,湘东区 +360321=中国,江西省,萍乡市,莲花县 +360322=中国,江西省,萍乡市,上栗县 +360323=中国,江西省,萍乡市,芦溪县 +360400=中国,江西省,九江市 +360402=中国,江西省,九江市,濂溪区 +360403=中国,江西省,九江市,浔阳区 +360421=中国,江西省,九江市,九江县 +360423=中国,江西省,九江市,武宁县 +360424=中国,江西省,九江市,修水县 +360425=中国,江西省,九江市,永修县 +360426=中国,江西省,九江市,德安县 +360428=中国,江西省,九江市,都昌县 +360429=中国,江西省,九江市,湖口县 +360430=中国,江西省,九江市,彭泽县 +360481=中国,江西省,九江市,瑞昌市 +360482=中国,江西省,九江市,共青城市 +360483=中国,江西省,九江市,庐山市 +360500=中国,江西省,新余市 +360502=中国,江西省,新余市,渝水区 +360521=中国,江西省,新余市,分宜县 +360600=中国,江西省,鹰潭市 +360602=中国,江西省,鹰潭市,月湖区 +360622=中国,江西省,鹰潭市,余江县 +360681=中国,江西省,鹰潭市,贵溪市 +360700=中国,江西省,赣州市 +360702=中国,江西省,赣州市,章贡区 +360703=中国,江西省,赣州市,南康区 +360704=中国,江西省,赣州市,赣县区 +360722=中国,江西省,赣州市,信丰县 +360723=中国,江西省,赣州市,大余县 +360724=中国,江西省,赣州市,上犹县 +360725=中国,江西省,赣州市,崇义县 +360726=中国,江西省,赣州市,安远县 +360727=中国,江西省,赣州市,龙南县 +360728=中国,江西省,赣州市,定南县 +360729=中国,江西省,赣州市,全南县 +360730=中国,江西省,赣州市,宁都县 +360731=中国,江西省,赣州市,于都县 +360732=中国,江西省,赣州市,兴国县 +360733=中国,江西省,赣州市,会昌县 +360734=中国,江西省,赣州市,寻乌县 +360735=中国,江西省,赣州市,石城县 +360781=中国,江西省,赣州市,瑞金市 +360800=中国,江西省,吉安市 +360802=中国,江西省,吉安市,吉州区 +360803=中国,江西省,吉安市,青原区 +360821=中国,江西省,吉安市,吉安县 +360822=中国,江西省,吉安市,吉水县 +360823=中国,江西省,吉安市,峡江县 +360824=中国,江西省,吉安市,新干县 +360825=中国,江西省,吉安市,永丰县 +360826=中国,江西省,吉安市,泰和县 +360827=中国,江西省,吉安市,遂川县 +360828=中国,江西省,吉安市,万安县 +360829=中国,江西省,吉安市,安福县 +360830=中国,江西省,吉安市,永新县 +360881=中国,江西省,吉安市,井冈山市 +360900=中国,江西省,宜春市 +360902=中国,江西省,宜春市,袁州区 +360921=中国,江西省,宜春市,奉新县 +360922=中国,江西省,宜春市,万载县 +360923=中国,江西省,宜春市,上高县 +360924=中国,江西省,宜春市,宜丰县 +360925=中国,江西省,宜春市,靖安县 +360926=中国,江西省,宜春市,铜鼓县 +360981=中国,江西省,宜春市,丰城市 +360982=中国,江西省,宜春市,樟树市 +360983=中国,江西省,宜春市,高安市 +361000=中国,江西省,抚州市 +361002=中国,江西省,抚州市,临川区 +361003=中国,江西省,抚州市,东乡区 +361021=中国,江西省,抚州市,南城县 +361022=中国,江西省,抚州市,黎川县 +361023=中国,江西省,抚州市,南丰县 +361024=中国,江西省,抚州市,崇仁县 +361025=中国,江西省,抚州市,乐安县 +361026=中国,江西省,抚州市,宜黄县 +361027=中国,江西省,抚州市,金溪县 +361028=中国,江西省,抚州市,资溪县 +361030=中国,江西省,抚州市,广昌县 +361100=中国,江西省,上饶市 +361102=中国,江西省,上饶市,信州区 +361103=中国,江西省,上饶市,广丰区 +361121=中国,江西省,上饶市,上饶县 +361123=中国,江西省,上饶市,玉山县 +361124=中国,江西省,上饶市,铅山县 +361125=中国,江西省,上饶市,横峰县 +361126=中国,江西省,上饶市,弋阳县 +361127=中国,江西省,上饶市,余干县 +361128=中国,江西省,上饶市,鄱阳县 +361129=中国,江西省,上饶市,万年县 +361130=中国,江西省,上饶市,婺源县 +361181=中国,江西省,上饶市,德兴市 +370000=中国,山东省 +370100=中国,山东省,济南市 +370102=中国,山东省,济南市,历下区 +370103=中国,山东省,济南市,市中区 +370104=中国,山东省,济南市,槐荫区 +370105=中国,山东省,济南市,天桥区 +370112=中国,山东省,济南市,历城区 +370113=中国,山东省,济南市,长清区 +370114=中国,山东省,济南市,章丘区 +370124=中国,山东省,济南市,平阴县 +370125=中国,山东省,济南市,济阳县 +370126=中国,山东省,济南市,商河县 +370200=中国,山东省,青岛市 +370202=中国,山东省,青岛市,市南区 +370203=中国,山东省,青岛市,市北区 +370211=中国,山东省,青岛市,黄岛区 +370212=中国,山东省,青岛市,崂山区 +370213=中国,山东省,青岛市,李沧区 +370214=中国,山东省,青岛市,城阳区 +370281=中国,山东省,青岛市,胶州市 +370282=中国,山东省,青岛市,即墨市 +370283=中国,山东省,青岛市,平度市 +370285=中国,山东省,青岛市,莱西市 +370300=中国,山东省,淄博市 +370302=中国,山东省,淄博市,淄川区 +370303=中国,山东省,淄博市,张店区 +370304=中国,山东省,淄博市,博山区 +370305=中国,山东省,淄博市,临淄区 +370306=中国,山东省,淄博市,周村区 +370321=中国,山东省,淄博市,桓台县 +370322=中国,山东省,淄博市,高青县 +370323=中国,山东省,淄博市,沂源县 +370400=中国,山东省,枣庄市 +370402=中国,山东省,枣庄市,市中区 +370403=中国,山东省,枣庄市,薛城区 +370404=中国,山东省,枣庄市,峄城区 +370405=中国,山东省,枣庄市,台儿庄区 +370406=中国,山东省,枣庄市,山亭区 +370481=中国,山东省,枣庄市,滕州市 +370500=中国,山东省,东营市 +370502=中国,山东省,东营市,东营区 +370503=中国,山东省,东营市,河口区 +370505=中国,山东省,东营市,垦利区 +370522=中国,山东省,东营市,利津县 +370523=中国,山东省,东营市,广饶县 +370600=中国,山东省,烟台市 +370602=中国,山东省,烟台市,芝罘区 +370611=中国,山东省,烟台市,福山区 +370612=中国,山东省,烟台市,牟平区 +370613=中国,山东省,烟台市,莱山区 +370634=中国,山东省,烟台市,长岛县 +370681=中国,山东省,烟台市,龙口市 +370682=中国,山东省,烟台市,莱阳市 +370683=中国,山东省,烟台市,莱州市 +370684=中国,山东省,烟台市,蓬莱市 +370685=中国,山东省,烟台市,招远市 +370686=中国,山东省,烟台市,栖霞市 +370687=中国,山东省,烟台市,海阳市 +370700=中国,山东省,潍坊市 +370702=中国,山东省,潍坊市,潍城区 +370703=中国,山东省,潍坊市,寒亭区 +370704=中国,山东省,潍坊市,坊子区 +370705=中国,山东省,潍坊市,奎文区 +370724=中国,山东省,潍坊市,临朐县 +370725=中国,山东省,潍坊市,昌乐县 +370781=中国,山东省,潍坊市,青州市 +370782=中国,山东省,潍坊市,诸城市 +370783=中国,山东省,潍坊市,寿光市 +370784=中国,山东省,潍坊市,安丘市 +370785=中国,山东省,潍坊市,高密市 +370786=中国,山东省,潍坊市,昌邑市 +370800=中国,山东省,济宁市 +370811=中国,山东省,济宁市,任城区 +370812=中国,山东省,济宁市,兖州区 +370826=中国,山东省,济宁市,微山县 +370827=中国,山东省,济宁市,鱼台县 +370828=中国,山东省,济宁市,金乡县 +370829=中国,山东省,济宁市,嘉祥县 +370830=中国,山东省,济宁市,汶上县 +370831=中国,山东省,济宁市,泗水县 +370832=中国,山东省,济宁市,梁山县 +370881=中国,山东省,济宁市,曲阜市 +370883=中国,山东省,济宁市,邹城市 +370900=中国,山东省,泰安市 +370902=中国,山东省,泰安市,泰山区 +370911=中国,山东省,泰安市,岱岳区 +370921=中国,山东省,泰安市,宁阳县 +370923=中国,山东省,泰安市,东平县 +370982=中国,山东省,泰安市,新泰市 +370983=中国,山东省,泰安市,肥城市 +371000=中国,山东省,威海市 +371002=中国,山东省,威海市,环翠区 +371003=中国,山东省,威海市,文登区 +371082=中国,山东省,威海市,荣成市 +371083=中国,山东省,威海市,乳山市 +371100=中国,山东省,日照市 +371102=中国,山东省,日照市,东港区 +371103=中国,山东省,日照市,岚山区 +371121=中国,山东省,日照市,五莲县 +371122=中国,山东省,日照市,莒县 +371200=中国,山东省,莱芜市 +371202=中国,山东省,莱芜市,莱城区 +371203=中国,山东省,莱芜市,钢城区 +371300=中国,山东省,临沂市 +371302=中国,山东省,临沂市,兰山区 +371311=中国,山东省,临沂市,罗庄区 +371312=中国,山东省,临沂市,河东区 +371321=中国,山东省,临沂市,沂南县 +371322=中国,山东省,临沂市,郯城县 +371323=中国,山东省,临沂市,沂水县 +371324=中国,山东省,临沂市,兰陵县 +371325=中国,山东省,临沂市,费县 +371326=中国,山东省,临沂市,平邑县 +371327=中国,山东省,临沂市,莒南县 +371328=中国,山东省,临沂市,蒙阴县 +371329=中国,山东省,临沂市,临沭县 +371400=中国,山东省,德州市 +371402=中国,山东省,德州市,德城区 +371403=中国,山东省,德州市,陵城区 +371422=中国,山东省,德州市,宁津县 +371423=中国,山东省,德州市,庆云县 +371424=中国,山东省,德州市,临邑县 +371425=中国,山东省,德州市,齐河县 +371426=中国,山东省,德州市,平原县 +371427=中国,山东省,德州市,夏津县 +371428=中国,山东省,德州市,武城县 +371481=中国,山东省,德州市,乐陵市 +371482=中国,山东省,德州市,禹城市 +371500=中国,山东省,聊城市 +371502=中国,山东省,聊城市,东昌府区 +371521=中国,山东省,聊城市,阳谷县 +371522=中国,山东省,聊城市,莘县 +371523=中国,山东省,聊城市,茌平县 +371524=中国,山东省,聊城市,东阿县 +371525=中国,山东省,聊城市,冠县 +371526=中国,山东省,聊城市,高唐县 +371581=中国,山东省,聊城市,临清市 +371600=中国,山东省,滨州市 +371602=中国,山东省,滨州市,滨城区 +371603=中国,山东省,滨州市,沾化区 +371621=中国,山东省,滨州市,惠民县 +371622=中国,山东省,滨州市,阳信县 +371623=中国,山东省,滨州市,无棣县 +371625=中国,山东省,滨州市,博兴县 +371626=中国,山东省,滨州市,邹平县 +371700=中国,山东省,菏泽市 +371702=中国,山东省,菏泽市,牡丹区 +371703=中国,山东省,菏泽市,定陶区 +371721=中国,山东省,菏泽市,曹县 +371722=中国,山东省,菏泽市,单县 +371723=中国,山东省,菏泽市,成武县 +371724=中国,山东省,菏泽市,巨野县 +371725=中国,山东省,菏泽市,郓城县 +371726=中国,山东省,菏泽市,鄄城县 +371728=中国,山东省,菏泽市,东明县 +410000=中国,河南省 +410100=中国,河南省,郑州市 +410102=中国,河南省,郑州市,中原区 +410103=中国,河南省,郑州市,二七区 +410104=中国,河南省,郑州市,管城回族区 +410105=中国,河南省,郑州市,金水区 +410106=中国,河南省,郑州市,上街区 +410108=中国,河南省,郑州市,惠济区 +410122=中国,河南省,郑州市,中牟县 +410181=中国,河南省,郑州市,巩义市 +410182=中国,河南省,郑州市,荥阳市 +410183=中国,河南省,郑州市,新密市 +410184=中国,河南省,郑州市,新郑市 +410185=中国,河南省,郑州市,登封市 +410200=中国,河南省,开封市 +410202=中国,河南省,开封市,龙亭区 +410203=中国,河南省,开封市,顺河回族区 +410204=中国,河南省,开封市,鼓楼区 +410205=中国,河南省,开封市,禹王台区 +410212=中国,河南省,开封市,祥符区 +410221=中国,河南省,开封市,杞县 +410222=中国,河南省,开封市,通许县 +410223=中国,河南省,开封市,尉氏县 +410225=中国,河南省,开封市,兰考县 +410300=中国,河南省,洛阳市 +410302=中国,河南省,洛阳市,老城区 +410303=中国,河南省,洛阳市,西工区 +410304=中国,河南省,洛阳市,瀍河回族区 +410305=中国,河南省,洛阳市,涧西区 +410306=中国,河南省,洛阳市,吉利区 +410311=中国,河南省,洛阳市,洛龙区 +410322=中国,河南省,洛阳市,孟津县 +410323=中国,河南省,洛阳市,新安县 +410324=中国,河南省,洛阳市,栾川县 +410325=中国,河南省,洛阳市,嵩县 +410326=中国,河南省,洛阳市,汝阳县 +410327=中国,河南省,洛阳市,宜阳县 +410328=中国,河南省,洛阳市,洛宁县 +410329=中国,河南省,洛阳市,伊川县 +410381=中国,河南省,洛阳市,偃师市 +410400=中国,河南省,平顶山市 +410402=中国,河南省,平顶山市,新华区 +410403=中国,河南省,平顶山市,卫东区 +410404=中国,河南省,平顶山市,石龙区 +410411=中国,河南省,平顶山市,湛河区 +410421=中国,河南省,平顶山市,宝丰县 +410422=中国,河南省,平顶山市,叶县 +410423=中国,河南省,平顶山市,鲁山县 +410425=中国,河南省,平顶山市,郏县 +410481=中国,河南省,平顶山市,舞钢市 +410482=中国,河南省,平顶山市,汝州市 +410500=中国,河南省,安阳市 +410502=中国,河南省,安阳市,文峰区 +410503=中国,河南省,安阳市,北关区 +410505=中国,河南省,安阳市,殷都区 +410506=中国,河南省,安阳市,龙安区 +410522=中国,河南省,安阳市,安阳县 +410523=中国,河南省,安阳市,汤阴县 +410526=中国,河南省,安阳市,滑县 +410527=中国,河南省,安阳市,内黄县 +410581=中国,河南省,安阳市,林州市 +410600=中国,河南省,鹤壁市 +410602=中国,河南省,鹤壁市,鹤山区 +410603=中国,河南省,鹤壁市,山城区 +410611=中国,河南省,鹤壁市,淇滨区 +410621=中国,河南省,鹤壁市,浚县 +410622=中国,河南省,鹤壁市,淇县 +410700=中国,河南省,新乡市 +410702=中国,河南省,新乡市,红旗区 +410703=中国,河南省,新乡市,卫滨区 +410704=中国,河南省,新乡市,凤泉区 +410711=中国,河南省,新乡市,牧野区 +410721=中国,河南省,新乡市,新乡县 +410724=中国,河南省,新乡市,获嘉县 +410725=中国,河南省,新乡市,原阳县 +410726=中国,河南省,新乡市,延津县 +410727=中国,河南省,新乡市,封丘县 +410728=中国,河南省,新乡市,长垣县 +410781=中国,河南省,新乡市,卫辉市 +410782=中国,河南省,新乡市,辉县市 +410800=中国,河南省,焦作市 +410802=中国,河南省,焦作市,解放区 +410803=中国,河南省,焦作市,中站区 +410804=中国,河南省,焦作市,马村区 +410811=中国,河南省,焦作市,山阳区 +410821=中国,河南省,焦作市,修武县 +410822=中国,河南省,焦作市,博爱县 +410823=中国,河南省,焦作市,武陟县 +410825=中国,河南省,焦作市,温县 +410882=中国,河南省,焦作市,沁阳市 +410883=中国,河南省,焦作市,孟州市 +410900=中国,河南省,濮阳市 +410902=中国,河南省,濮阳市,华龙区 +410922=中国,河南省,濮阳市,清丰县 +410923=中国,河南省,濮阳市,南乐县 +410926=中国,河南省,濮阳市,范县 +410927=中国,河南省,濮阳市,台前县 +410928=中国,河南省,濮阳市,濮阳县 +411000=中国,河南省,许昌市 +411002=中国,河南省,许昌市,魏都区 +411003=中国,河南省,许昌市,建安区 +411024=中国,河南省,许昌市,鄢陵县 +411025=中国,河南省,许昌市,襄城县 +411081=中国,河南省,许昌市,禹州市 +411082=中国,河南省,许昌市,长葛市 +411100=中国,河南省,漯河市 +411102=中国,河南省,漯河市,源汇区 +411103=中国,河南省,漯河市,郾城区 +411104=中国,河南省,漯河市,召陵区 +411121=中国,河南省,漯河市,舞阳县 +411122=中国,河南省,漯河市,临颍县 +411200=中国,河南省,三门峡市 +411202=中国,河南省,三门峡市,湖滨区 +411203=中国,河南省,三门峡市,陕州区 +411221=中国,河南省,三门峡市,渑池县 +411224=中国,河南省,三门峡市,卢氏县 +411281=中国,河南省,三门峡市,义马市 +411282=中国,河南省,三门峡市,灵宝市 +411300=中国,河南省,南阳市 +411302=中国,河南省,南阳市,宛城区 +411303=中国,河南省,南阳市,卧龙区 +411321=中国,河南省,南阳市,南召县 +411322=中国,河南省,南阳市,方城县 +411323=中国,河南省,南阳市,西峡县 +411324=中国,河南省,南阳市,镇平县 +411325=中国,河南省,南阳市,内乡县 +411326=中国,河南省,南阳市,淅川县 +411327=中国,河南省,南阳市,社旗县 +411328=中国,河南省,南阳市,唐河县 +411329=中国,河南省,南阳市,新野县 +411330=中国,河南省,南阳市,桐柏县 +411381=中国,河南省,南阳市,邓州市 +411400=中国,河南省,商丘市 +411402=中国,河南省,商丘市,梁园区 +411403=中国,河南省,商丘市,睢阳区 +411421=中国,河南省,商丘市,民权县 +411422=中国,河南省,商丘市,睢县 +411423=中国,河南省,商丘市,宁陵县 +411424=中国,河南省,商丘市,柘城县 +411425=中国,河南省,商丘市,虞城县 +411426=中国,河南省,商丘市,夏邑县 +411481=中国,河南省,商丘市,永城市 +411500=中国,河南省,信阳市 +411502=中国,河南省,信阳市,浉河区 +411503=中国,河南省,信阳市,平桥区 +411521=中国,河南省,信阳市,罗山县 +411522=中国,河南省,信阳市,光山县 +411523=中国,河南省,信阳市,新县 +411524=中国,河南省,信阳市,商城县 +411525=中国,河南省,信阳市,固始县 +411526=中国,河南省,信阳市,潢川县 +411527=中国,河南省,信阳市,淮滨县 +411528=中国,河南省,信阳市,息县 +411600=中国,河南省,周口市 +411602=中国,河南省,周口市,川汇区 +411621=中国,河南省,周口市,扶沟县 +411622=中国,河南省,周口市,西华县 +411623=中国,河南省,周口市,商水县 +411624=中国,河南省,周口市,沈丘县 +411625=中国,河南省,周口市,郸城县 +411626=中国,河南省,周口市,淮阳县 +411627=中国,河南省,周口市,太康县 +411628=中国,河南省,周口市,鹿邑县 +411681=中国,河南省,周口市,项城市 +411700=中国,河南省,驻马店市 +411702=中国,河南省,驻马店市,驿城区 +411721=中国,河南省,驻马店市,西平县 +411722=中国,河南省,驻马店市,上蔡县 +411723=中国,河南省,驻马店市,平舆县 +411724=中国,河南省,驻马店市,正阳县 +411725=中国,河南省,驻马店市,确山县 +411726=中国,河南省,驻马店市,泌阳县 +411727=中国,河南省,驻马店市,汝南县 +411728=中国,河南省,驻马店市,遂平县 +411729=中国,河南省,驻马店市,新蔡县 +419001=中国,河南省,济源市,济源市 +420000=中国,湖北省 +420100=中国,湖北省,武汉市 +420102=中国,湖北省,武汉市,江岸区 +420103=中国,湖北省,武汉市,江汉区 +420104=中国,湖北省,武汉市,硚口区 +420105=中国,湖北省,武汉市,汉阳区 +420106=中国,湖北省,武汉市,武昌区 +420107=中国,湖北省,武汉市,青山区 +420111=中国,湖北省,武汉市,洪山区 +420112=中国,湖北省,武汉市,东西湖区 +420113=中国,湖北省,武汉市,汉南区 +420114=中国,湖北省,武汉市,蔡甸区 +420115=中国,湖北省,武汉市,江夏区 +420116=中国,湖北省,武汉市,黄陂区 +420117=中国,湖北省,武汉市,新洲区 +420200=中国,湖北省,黄石市 +420202=中国,湖北省,黄石市,黄石港区 +420203=中国,湖北省,黄石市,西塞山区 +420204=中国,湖北省,黄石市,下陆区 +420205=中国,湖北省,黄石市,铁山区 +420222=中国,湖北省,黄石市,阳新县 +420281=中国,湖北省,黄石市,大冶市 +420300=中国,湖北省,十堰市 +420302=中国,湖北省,十堰市,茅箭区 +420303=中国,湖北省,十堰市,张湾区 +420304=中国,湖北省,十堰市,郧阳区 +420322=中国,湖北省,十堰市,郧西县 +420323=中国,湖北省,十堰市,竹山县 +420324=中国,湖北省,十堰市,竹溪县 +420325=中国,湖北省,十堰市,房县 +420381=中国,湖北省,十堰市,丹江口市 +420500=中国,湖北省,宜昌市 +420502=中国,湖北省,宜昌市,西陵区 +420503=中国,湖北省,宜昌市,伍家岗区 +420504=中国,湖北省,宜昌市,点军区 +420505=中国,湖北省,宜昌市,猇亭区 +420506=中国,湖北省,宜昌市,夷陵区 +420525=中国,湖北省,宜昌市,远安县 +420526=中国,湖北省,宜昌市,兴山县 +420527=中国,湖北省,宜昌市,秭归县 +420528=中国,湖北省,宜昌市,长阳土家族自治县 +420529=中国,湖北省,宜昌市,五峰土家族自治县 +420581=中国,湖北省,宜昌市,宜都市 +420582=中国,湖北省,宜昌市,当阳市 +420583=中国,湖北省,宜昌市,枝江市 +420600=中国,湖北省,襄阳市 +420602=中国,湖北省,襄阳市,襄城区 +420606=中国,湖北省,襄阳市,樊城区 +420607=中国,湖北省,襄阳市,襄州区 +420624=中国,湖北省,襄阳市,南漳县 +420625=中国,湖北省,襄阳市,谷城县 +420626=中国,湖北省,襄阳市,保康县 +420682=中国,湖北省,襄阳市,老河口市 +420683=中国,湖北省,襄阳市,枣阳市 +420684=中国,湖北省,襄阳市,宜城市 +420700=中国,湖北省,鄂州市 +420702=中国,湖北省,鄂州市,梁子湖区 +420703=中国,湖北省,鄂州市,华容区 +420704=中国,湖北省,鄂州市,鄂城区 +420800=中国,湖北省,荆门市 +420802=中国,湖北省,荆门市,东宝区 +420804=中国,湖北省,荆门市,掇刀区 +420821=中国,湖北省,荆门市,京山县 +420822=中国,湖北省,荆门市,沙洋县 +420881=中国,湖北省,荆门市,钟祥市 +420900=中国,湖北省,孝感市 +420902=中国,湖北省,孝感市,孝南区 +420921=中国,湖北省,孝感市,孝昌县 +420922=中国,湖北省,孝感市,大悟县 +420923=中国,湖北省,孝感市,云梦县 +420981=中国,湖北省,孝感市,应城市 +420982=中国,湖北省,孝感市,安陆市 +420984=中国,湖北省,孝感市,汉川市 +421000=中国,湖北省,荆州市 +421002=中国,湖北省,荆州市,沙市区 +421003=中国,湖北省,荆州市,荆州区 +421022=中国,湖北省,荆州市,公安县 +421023=中国,湖北省,荆州市,监利县 +421024=中国,湖北省,荆州市,江陵县 +421081=中国,湖北省,荆州市,石首市 +421083=中国,湖北省,荆州市,洪湖市 +421087=中国,湖北省,荆州市,松滋市 +421100=中国,湖北省,黄冈市 +421102=中国,湖北省,黄冈市,黄州区 +421121=中国,湖北省,黄冈市,团风县 +421122=中国,湖北省,黄冈市,红安县 +421123=中国,湖北省,黄冈市,罗田县 +421124=中国,湖北省,黄冈市,英山县 +421125=中国,湖北省,黄冈市,浠水县 +421126=中国,湖北省,黄冈市,蕲春县 +421127=中国,湖北省,黄冈市,黄梅县 +421181=中国,湖北省,黄冈市,麻城市 +421182=中国,湖北省,黄冈市,武穴市 +421200=中国,湖北省,咸宁市 +421202=中国,湖北省,咸宁市,咸安区 +421221=中国,湖北省,咸宁市,嘉鱼县 +421222=中国,湖北省,咸宁市,通城县 +421223=中国,湖北省,咸宁市,崇阳县 +421224=中国,湖北省,咸宁市,通山县 +421281=中国,湖北省,咸宁市,赤壁市 +421300=中国,湖北省,随州市 +421303=中国,湖北省,随州市,曾都区 +421321=中国,湖北省,随州市,随县 +421381=中国,湖北省,随州市,广水市 +422800=中国,湖北省,恩施土家族苗族自治州 +422801=中国,湖北省,恩施土家族苗族自治州,恩施市 +422802=中国,湖北省,恩施土家族苗族自治州,利川市 +422822=中国,湖北省,恩施土家族苗族自治州,建始县 +422823=中国,湖北省,恩施土家族苗族自治州,巴东县 +422825=中国,湖北省,恩施土家族苗族自治州,宣恩县 +422826=中国,湖北省,恩施土家族苗族自治州,咸丰县 +422827=中国,湖北省,恩施土家族苗族自治州,来凤县 +422828=中国,湖北省,恩施土家族苗族自治州,鹤峰县 +429004=中国,湖北省,仙桃市,仙桃市 +429005=中国,湖北省,潜江市,潜江市 +429006=中国,湖北省,天门市,天门市 +429021=中国,湖北省,神农架林区,神农架林区 +430000=中国,湖南省 +430100=中国,湖南省,长沙市 +430102=中国,湖南省,长沙市,芙蓉区 +430103=中国,湖南省,长沙市,天心区 +430104=中国,湖南省,长沙市,岳麓区 +430105=中国,湖南省,长沙市,开福区 +430111=中国,湖南省,长沙市,雨花区 +430112=中国,湖南省,长沙市,望城区 +430121=中国,湖南省,长沙市,长沙县 +430181=中国,湖南省,长沙市,浏阳市 +430182=中国,湖南省,长沙市,宁乡市 +430200=中国,湖南省,株洲市 +430202=中国,湖南省,株洲市,荷塘区 +430203=中国,湖南省,株洲市,芦淞区 +430204=中国,湖南省,株洲市,石峰区 +430211=中国,湖南省,株洲市,天元区 +430221=中国,湖南省,株洲市,株洲县 +430223=中国,湖南省,株洲市,攸县 +430224=中国,湖南省,株洲市,茶陵县 +430225=中国,湖南省,株洲市,炎陵县 +430281=中国,湖南省,株洲市,醴陵市 +430300=中国,湖南省,湘潭市 +430302=中国,湖南省,湘潭市,雨湖区 +430304=中国,湖南省,湘潭市,岳塘区 +430321=中国,湖南省,湘潭市,湘潭县 +430381=中国,湖南省,湘潭市,湘乡市 +430382=中国,湖南省,湘潭市,韶山市 +430400=中国,湖南省,衡阳市 +430405=中国,湖南省,衡阳市,珠晖区 +430406=中国,湖南省,衡阳市,雁峰区 +430407=中国,湖南省,衡阳市,石鼓区 +430408=中国,湖南省,衡阳市,蒸湘区 +430412=中国,湖南省,衡阳市,南岳区 +430421=中国,湖南省,衡阳市,衡阳县 +430422=中国,湖南省,衡阳市,衡南县 +430423=中国,湖南省,衡阳市,衡山县 +430424=中国,湖南省,衡阳市,衡东县 +430426=中国,湖南省,衡阳市,祁东县 +430481=中国,湖南省,衡阳市,耒阳市 +430482=中国,湖南省,衡阳市,常宁市 +430500=中国,湖南省,邵阳市 +430502=中国,湖南省,邵阳市,双清区 +430503=中国,湖南省,邵阳市,大祥区 +430511=中国,湖南省,邵阳市,北塔区 +430521=中国,湖南省,邵阳市,邵东县 +430522=中国,湖南省,邵阳市,新邵县 +430523=中国,湖南省,邵阳市,邵阳县 +430524=中国,湖南省,邵阳市,隆回县 +430525=中国,湖南省,邵阳市,洞口县 +430527=中国,湖南省,邵阳市,绥宁县 +430528=中国,湖南省,邵阳市,新宁县 +430529=中国,湖南省,邵阳市,城步苗族自治县 +430581=中国,湖南省,邵阳市,武冈市 +430600=中国,湖南省,岳阳市 +430602=中国,湖南省,岳阳市,岳阳楼区 +430603=中国,湖南省,岳阳市,云溪区 +430611=中国,湖南省,岳阳市,君山区 +430621=中国,湖南省,岳阳市,岳阳县 +430623=中国,湖南省,岳阳市,华容县 +430624=中国,湖南省,岳阳市,湘阴县 +430626=中国,湖南省,岳阳市,平江县 +430681=中国,湖南省,岳阳市,汨罗市 +430682=中国,湖南省,岳阳市,临湘市 +430700=中国,湖南省,常德市 +430702=中国,湖南省,常德市,武陵区 +430703=中国,湖南省,常德市,鼎城区 +430721=中国,湖南省,常德市,安乡县 +430722=中国,湖南省,常德市,汉寿县 +430723=中国,湖南省,常德市,澧县 +430724=中国,湖南省,常德市,临澧县 +430725=中国,湖南省,常德市,桃源县 +430726=中国,湖南省,常德市,石门县 +430781=中国,湖南省,常德市,津市市 +430800=中国,湖南省,张家界市 +430802=中国,湖南省,张家界市,永定区 +430811=中国,湖南省,张家界市,武陵源区 +430821=中国,湖南省,张家界市,慈利县 +430822=中国,湖南省,张家界市,桑植县 +430900=中国,湖南省,益阳市 +430902=中国,湖南省,益阳市,资阳区 +430903=中国,湖南省,益阳市,赫山区 +430921=中国,湖南省,益阳市,南县 +430922=中国,湖南省,益阳市,桃江县 +430923=中国,湖南省,益阳市,安化县 +430981=中国,湖南省,益阳市,沅江市 +431000=中国,湖南省,郴州市 +431002=中国,湖南省,郴州市,北湖区 +431003=中国,湖南省,郴州市,苏仙区 +431021=中国,湖南省,郴州市,桂阳县 +431022=中国,湖南省,郴州市,宜章县 +431023=中国,湖南省,郴州市,永兴县 +431024=中国,湖南省,郴州市,嘉禾县 +431025=中国,湖南省,郴州市,临武县 +431026=中国,湖南省,郴州市,汝城县 +431027=中国,湖南省,郴州市,桂东县 +431028=中国,湖南省,郴州市,安仁县 +431081=中国,湖南省,郴州市,资兴市 +431100=中国,湖南省,永州市 +431102=中国,湖南省,永州市,零陵区 +431103=中国,湖南省,永州市,冷水滩区 +431121=中国,湖南省,永州市,祁阳县 +431122=中国,湖南省,永州市,东安县 +431123=中国,湖南省,永州市,双牌县 +431124=中国,湖南省,永州市,道县 +431125=中国,湖南省,永州市,江永县 +431126=中国,湖南省,永州市,宁远县 +431127=中国,湖南省,永州市,蓝山县 +431128=中国,湖南省,永州市,新田县 +431129=中国,湖南省,永州市,江华瑶族自治县 +431200=中国,湖南省,怀化市 +431202=中国,湖南省,怀化市,鹤城区 +431221=中国,湖南省,怀化市,中方县 +431222=中国,湖南省,怀化市,沅陵县 +431223=中国,湖南省,怀化市,辰溪县 +431224=中国,湖南省,怀化市,溆浦县 +431225=中国,湖南省,怀化市,会同县 +431226=中国,湖南省,怀化市,麻阳苗族自治县 +431227=中国,湖南省,怀化市,新晃侗族自治县 +431228=中国,湖南省,怀化市,芷江侗族自治县 +431229=中国,湖南省,怀化市,靖州苗族侗族自治县 +431230=中国,湖南省,怀化市,通道侗族自治县 +431281=中国,湖南省,怀化市,洪江市 +431300=中国,湖南省,娄底市 +431302=中国,湖南省,娄底市,娄星区 +431321=中国,湖南省,娄底市,双峰县 +431322=中国,湖南省,娄底市,新化县 +431381=中国,湖南省,娄底市,冷水江市 +431382=中国,湖南省,娄底市,涟源市 +433100=中国,湖南省,湘西土家族苗族自治州 +433101=中国,湖南省,湘西土家族苗族自治州,吉首市 +433122=中国,湖南省,湘西土家族苗族自治州,泸溪县 +433123=中国,湖南省,湘西土家族苗族自治州,凤凰县 +433124=中国,湖南省,湘西土家族苗族自治州,花垣县 +433125=中国,湖南省,湘西土家族苗族自治州,保靖县 +433126=中国,湖南省,湘西土家族苗族自治州,古丈县 +433127=中国,湖南省,湘西土家族苗族自治州,永顺县 +433130=中国,湖南省,湘西土家族苗族自治州,龙山县 +440000=中国,广东省 +440100=中国,广东省,广州市 +440103=中国,广东省,广州市,荔湾区 +440104=中国,广东省,广州市,越秀区 +440105=中国,广东省,广州市,海珠区 +440106=中国,广东省,广州市,天河区 +440111=中国,广东省,广州市,白云区 +440112=中国,广东省,广州市,黄埔区 +440113=中国,广东省,广州市,番禺区 +440114=中国,广东省,广州市,花都区 +440115=中国,广东省,广州市,南沙区 +440117=中国,广东省,广州市,从化区 +440118=中国,广东省,广州市,增城区 +440200=中国,广东省,韶关市 +440203=中国,广东省,韶关市,武江区 +440204=中国,广东省,韶关市,浈江区 +440205=中国,广东省,韶关市,曲江区 +440222=中国,广东省,韶关市,始兴县 +440224=中国,广东省,韶关市,仁化县 +440229=中国,广东省,韶关市,翁源县 +440232=中国,广东省,韶关市,乳源瑶族自治县 +440233=中国,广东省,韶关市,新丰县 +440281=中国,广东省,韶关市,乐昌市 +440282=中国,广东省,韶关市,南雄市 +440300=中国,广东省,深圳市 +440303=中国,广东省,深圳市,罗湖区 +440304=中国,广东省,深圳市,福田区 +440305=中国,广东省,深圳市,南山区 +440306=中国,广东省,深圳市,宝安区 +440307=中国,广东省,深圳市,龙岗区 +440308=中国,广东省,深圳市,盐田区 +440309=中国,广东省,深圳市,龙华区 +440310=中国,广东省,深圳市,坪山区 +440400=中国,广东省,珠海市 +440402=中国,广东省,珠海市,香洲区 +440403=中国,广东省,珠海市,斗门区 +440404=中国,广东省,珠海市,金湾区 +440499=中国,广东省,珠海市,香洲区(由澳门特别行政区实施管辖) +440500=中国,广东省,汕头市 +440507=中国,广东省,汕头市,龙湖区 +440511=中国,广东省,汕头市,金平区 +440512=中国,广东省,汕头市,濠江区 +440513=中国,广东省,汕头市,潮阳区 +440514=中国,广东省,汕头市,潮南区 +440515=中国,广东省,汕头市,澄海区 +440523=中国,广东省,汕头市,南澳县 +440600=中国,广东省,佛山市 +440604=中国,广东省,佛山市,禅城区 +440605=中国,广东省,佛山市,南海区 +440606=中国,广东省,佛山市,顺德区 +440607=中国,广东省,佛山市,三水区 +440608=中国,广东省,佛山市,高明区 +440700=中国,广东省,江门市 +440703=中国,广东省,江门市,蓬江区 +440704=中国,广东省,江门市,江海区 +440705=中国,广东省,江门市,新会区 +440781=中国,广东省,江门市,台山市 +440783=中国,广东省,江门市,开平市 +440784=中国,广东省,江门市,鹤山市 +440785=中国,广东省,江门市,恩平市 +440800=中国,广东省,湛江市 +440802=中国,广东省,湛江市,赤坎区 +440803=中国,广东省,湛江市,霞山区 +440804=中国,广东省,湛江市,坡头区 +440811=中国,广东省,湛江市,麻章区 +440823=中国,广东省,湛江市,遂溪县 +440825=中国,广东省,湛江市,徐闻县 +440881=中国,广东省,湛江市,廉江市 +440882=中国,广东省,湛江市,雷州市 +440883=中国,广东省,湛江市,吴川市 +440900=中国,广东省,茂名市 +440902=中国,广东省,茂名市,茂南区 +440904=中国,广东省,茂名市,电白区 +440981=中国,广东省,茂名市,高州市 +440982=中国,广东省,茂名市,化州市 +440983=中国,广东省,茂名市,信宜市 +441200=中国,广东省,肇庆市 +441202=中国,广东省,肇庆市,端州区 +441203=中国,广东省,肇庆市,鼎湖区 +441204=中国,广东省,肇庆市,高要区 +441223=中国,广东省,肇庆市,广宁县 +441224=中国,广东省,肇庆市,怀集县 +441225=中国,广东省,肇庆市,封开县 +441226=中国,广东省,肇庆市,德庆县 +441284=中国,广东省,肇庆市,四会市 +441300=中国,广东省,惠州市 +441302=中国,广东省,惠州市,惠城区 +441303=中国,广东省,惠州市,惠阳区 +441322=中国,广东省,惠州市,博罗县 +441323=中国,广东省,惠州市,惠东县 +441324=中国,广东省,惠州市,龙门县 +441400=中国,广东省,梅州市 +441402=中国,广东省,梅州市,梅江区 +441403=中国,广东省,梅州市,梅县区 +441422=中国,广东省,梅州市,大埔县 +441423=中国,广东省,梅州市,丰顺县 +441424=中国,广东省,梅州市,五华县 +441426=中国,广东省,梅州市,平远县 +441427=中国,广东省,梅州市,蕉岭县 +441481=中国,广东省,梅州市,兴宁市 +441500=中国,广东省,汕尾市 +441502=中国,广东省,汕尾市,城区 +441521=中国,广东省,汕尾市,海丰县 +441523=中国,广东省,汕尾市,陆河县 +441581=中国,广东省,汕尾市,陆丰市 +441600=中国,广东省,河源市 +441602=中国,广东省,河源市,源城区 +441621=中国,广东省,河源市,紫金县 +441622=中国,广东省,河源市,龙川县 +441623=中国,广东省,河源市,连平县 +441624=中国,广东省,河源市,和平县 +441625=中国,广东省,河源市,东源县 +441700=中国,广东省,阳江市 +441702=中国,广东省,阳江市,江城区 +441704=中国,广东省,阳江市,阳东区 +441721=中国,广东省,阳江市,阳西县 +441781=中国,广东省,阳江市,阳春市 +441800=中国,广东省,清远市 +441802=中国,广东省,清远市,清城区 +441803=中国,广东省,清远市,清新区 +441821=中国,广东省,清远市,佛冈县 +441823=中国,广东省,清远市,阳山县 +441825=中国,广东省,清远市,连山壮族瑶族自治县 +441826=中国,广东省,清远市,连南瑶族自治县 +441881=中国,广东省,清远市,英德市 +441882=中国,广东省,清远市,连州市 +441900=中国,广东省,东莞市 +442000=中国,广东省,中山市 +445100=中国,广东省,潮州市 +445102=中国,广东省,潮州市,湘桥区 +445103=中国,广东省,潮州市,潮安区 +445122=中国,广东省,潮州市,饶平县 +445200=中国,广东省,揭阳市 +445202=中国,广东省,揭阳市,榕城区 +445203=中国,广东省,揭阳市,揭东区 +445222=中国,广东省,揭阳市,揭西县 +445224=中国,广东省,揭阳市,惠来县 +445281=中国,广东省,揭阳市,普宁市 +445300=中国,广东省,云浮市 +445302=中国,广东省,云浮市,云城区 +445303=中国,广东省,云浮市,云安区 +445321=中国,广东省,云浮市,新兴县 +445322=中国,广东省,云浮市,郁南县 +445381=中国,广东省,云浮市,罗定市 +450000=中国,广西壮族自治区 +450100=中国,广西壮族自治区,南宁市 +450102=中国,广西壮族自治区,南宁市,兴宁区 +450103=中国,广西壮族自治区,南宁市,青秀区 +450105=中国,广西壮族自治区,南宁市,江南区 +450107=中国,广西壮族自治区,南宁市,西乡塘区 +450108=中国,广西壮族自治区,南宁市,良庆区 +450109=中国,广西壮族自治区,南宁市,邕宁区 +450110=中国,广西壮族自治区,南宁市,武鸣区 +450123=中国,广西壮族自治区,南宁市,隆安县 +450124=中国,广西壮族自治区,南宁市,马山县 +450125=中国,广西壮族自治区,南宁市,上林县 +450126=中国,广西壮族自治区,南宁市,宾阳县 +450127=中国,广西壮族自治区,南宁市,横县 +450200=中国,广西壮族自治区,柳州市 +450202=中国,广西壮族自治区,柳州市,城中区 +450203=中国,广西壮族自治区,柳州市,鱼峰区 +450204=中国,广西壮族自治区,柳州市,柳南区 +450205=中国,广西壮族自治区,柳州市,柳北区 +450206=中国,广西壮族自治区,柳州市,柳江区 +450222=中国,广西壮族自治区,柳州市,柳城县 +450223=中国,广西壮族自治区,柳州市,鹿寨县 +450224=中国,广西壮族自治区,柳州市,融安县 +450225=中国,广西壮族自治区,柳州市,融水苗族自治县 +450226=中国,广西壮族自治区,柳州市,三江侗族自治县 +450300=中国,广西壮族自治区,桂林市 +450302=中国,广西壮族自治区,桂林市,秀峰区 +450303=中国,广西壮族自治区,桂林市,叠彩区 +450304=中国,广西壮族自治区,桂林市,象山区 +450305=中国,广西壮族自治区,桂林市,七星区 +450311=中国,广西壮族自治区,桂林市,雁山区 +450312=中国,广西壮族自治区,桂林市,临桂区 +450321=中国,广西壮族自治区,桂林市,阳朔县 +450323=中国,广西壮族自治区,桂林市,灵川县 +450324=中国,广西壮族自治区,桂林市,全州县 +450325=中国,广西壮族自治区,桂林市,兴安县 +450326=中国,广西壮族自治区,桂林市,永福县 +450327=中国,广西壮族自治区,桂林市,灌阳县 +450328=中国,广西壮族自治区,桂林市,龙胜各族自治县 +450329=中国,广西壮族自治区,桂林市,资源县 +450330=中国,广西壮族自治区,桂林市,平乐县 +450331=中国,广西壮族自治区,桂林市,荔浦县 +450332=中国,广西壮族自治区,桂林市,恭城瑶族自治县 +450400=中国,广西壮族自治区,梧州市 +450403=中国,广西壮族自治区,梧州市,万秀区 +450405=中国,广西壮族自治区,梧州市,长洲区 +450406=中国,广西壮族自治区,梧州市,龙圩区 +450421=中国,广西壮族自治区,梧州市,苍梧县 +450422=中国,广西壮族自治区,梧州市,藤县 +450423=中国,广西壮族自治区,梧州市,蒙山县 +450481=中国,广西壮族自治区,梧州市,岑溪市 +450500=中国,广西壮族自治区,北海市 +450502=中国,广西壮族自治区,北海市,海城区 +450503=中国,广西壮族自治区,北海市,银海区 +450512=中国,广西壮族自治区,北海市,铁山港区 +450521=中国,广西壮族自治区,北海市,合浦县 +450600=中国,广西壮族自治区,防城港市 +450602=中国,广西壮族自治区,防城港市,港口区 +450603=中国,广西壮族自治区,防城港市,防城区 +450621=中国,广西壮族自治区,防城港市,上思县 +450681=中国,广西壮族自治区,防城港市,东兴市 +450700=中国,广西壮族自治区,钦州市 +450702=中国,广西壮族自治区,钦州市,钦南区 +450703=中国,广西壮族自治区,钦州市,钦北区 +450721=中国,广西壮族自治区,钦州市,灵山县 +450722=中国,广西壮族自治区,钦州市,浦北县 +450800=中国,广西壮族自治区,贵港市 +450802=中国,广西壮族自治区,贵港市,港北区 +450803=中国,广西壮族自治区,贵港市,港南区 +450804=中国,广西壮族自治区,贵港市,覃塘区 +450821=中国,广西壮族自治区,贵港市,平南县 +450881=中国,广西壮族自治区,贵港市,桂平市 +450900=中国,广西壮族自治区,玉林市 +450902=中国,广西壮族自治区,玉林市,玉州区 +450903=中国,广西壮族自治区,玉林市,福绵区 +450921=中国,广西壮族自治区,玉林市,容县 +450922=中国,广西壮族自治区,玉林市,陆川县 +450923=中国,广西壮族自治区,玉林市,博白县 +450924=中国,广西壮族自治区,玉林市,兴业县 +450981=中国,广西壮族自治区,玉林市,北流市 +451000=中国,广西壮族自治区,百色市 +451002=中国,广西壮族自治区,百色市,右江区 +451021=中国,广西壮族自治区,百色市,田阳县 +451022=中国,广西壮族自治区,百色市,田东县 +451023=中国,广西壮族自治区,百色市,平果县 +451024=中国,广西壮族自治区,百色市,德保县 +451026=中国,广西壮族自治区,百色市,那坡县 +451027=中国,广西壮族自治区,百色市,凌云县 +451028=中国,广西壮族自治区,百色市,乐业县 +451029=中国,广西壮族自治区,百色市,田林县 +451030=中国,广西壮族自治区,百色市,西林县 +451031=中国,广西壮族自治区,百色市,隆林各族自治县 +451081=中国,广西壮族自治区,百色市,靖西市 +451100=中国,广西壮族自治区,贺州市 +451102=中国,广西壮族自治区,贺州市,八步区 +451103=中国,广西壮族自治区,贺州市,平桂区 +451121=中国,广西壮族自治区,贺州市,昭平县 +451122=中国,广西壮族自治区,贺州市,钟山县 +451123=中国,广西壮族自治区,贺州市,富川瑶族自治县 +451200=中国,广西壮族自治区,河池市 +451202=中国,广西壮族自治区,河池市,金城江区 +451203=中国,广西壮族自治区,河池市,宜州区 +451221=中国,广西壮族自治区,河池市,南丹县 +451222=中国,广西壮族自治区,河池市,天峨县 +451223=中国,广西壮族自治区,河池市,凤山县 +451224=中国,广西壮族自治区,河池市,东兰县 +451225=中国,广西壮族自治区,河池市,罗城仫佬族自治县 +451226=中国,广西壮族自治区,河池市,环江毛南族自治县 +451227=中国,广西壮族自治区,河池市,巴马瑶族自治县 +451228=中国,广西壮族自治区,河池市,都安瑶族自治县 +451229=中国,广西壮族自治区,河池市,大化瑶族自治县 +451300=中国,广西壮族自治区,来宾市 +451302=中国,广西壮族自治区,来宾市,兴宾区 +451321=中国,广西壮族自治区,来宾市,忻城县 +451322=中国,广西壮族自治区,来宾市,象州县 +451323=中国,广西壮族自治区,来宾市,武宣县 +451324=中国,广西壮族自治区,来宾市,金秀瑶族自治县 +451381=中国,广西壮族自治区,来宾市,合山市 +451400=中国,广西壮族自治区,崇左市 +451402=中国,广西壮族自治区,崇左市,江州区 +451421=中国,广西壮族自治区,崇左市,扶绥县 +451422=中国,广西壮族自治区,崇左市,宁明县 +451423=中国,广西壮族自治区,崇左市,龙州县 +451424=中国,广西壮族自治区,崇左市,大新县 +451425=中国,广西壮族自治区,崇左市,天等县 +451481=中国,广西壮族自治区,崇左市,凭祥市 +460000=中国,海南省 +460100=中国,海南省,海口市 +460105=中国,海南省,海口市,秀英区 +460106=中国,海南省,海口市,龙华区 +460107=中国,海南省,海口市,琼山区 +460108=中国,海南省,海口市,美兰区 +460200=中国,海南省,三亚市 +460202=中国,海南省,三亚市,海棠区 +460203=中国,海南省,三亚市,吉阳区 +460204=中国,海南省,三亚市,天涯区 +460205=中国,海南省,三亚市,崖州区 +460300=中国,海南省,三沙市 +460321=中国,海南省,三沙市,西沙群岛 +460322=中国,海南省,三沙市,南沙群岛 +460323=中国,海南省,三沙市,中沙群岛的岛礁及其海域 +460400=中国,海南省,儋州市 +469001=中国,海南省,五指山市,五指山市 +469002=中国,海南省,琼海市,琼海市 +469005=中国,海南省,文昌市,文昌市 +469006=中国,海南省,万宁市,万宁市 +469007=中国,海南省,东方市,东方市 +469021=中国,海南省,定安县,定安县 +469022=中国,海南省,屯昌县,屯昌县 +469023=中国,海南省,澄迈县,澄迈县 +469024=中国,海南省,临高县,临高县 +469025=中国,海南省,白沙黎族自治县,白沙黎族自治县 +469026=中国,海南省,昌江黎族自治县,昌江黎族自治县 +469027=中国,海南省,乐东黎族自治县,乐东黎族自治县 +469028=中国,海南省,陵水黎族自治县,陵水黎族自治县 +469029=中国,海南省,保亭黎族苗族自治县,保亭黎族苗族自治县 +469030=中国,海南省,琼中黎族苗族自治县,琼中黎族苗族自治县 +500000=中国,,重庆市 +500101=中国,,重庆市,万州区 +500102=中国,,重庆市,涪陵区 +500103=中国,,重庆市,渝中区 +500104=中国,,重庆市,大渡口区 +500105=中国,,重庆市,江北区 +500106=中国,,重庆市,沙坪坝区 +500107=中国,,重庆市,九龙坡区 +500108=中国,,重庆市,南岸区 +500109=中国,,重庆市,北碚区 +500110=中国,,重庆市,綦江区 +500111=中国,,重庆市,大足区 +500112=中国,,重庆市,渝北区 +500113=中国,,重庆市,巴南区 +500114=中国,,重庆市,黔江区 +500115=中国,,重庆市,长寿区 +500116=中国,,重庆市,江津区 +500117=中国,,重庆市,合川区 +500118=中国,,重庆市,永川区 +500119=中国,,重庆市,南川区 +500120=中国,,重庆市,璧山区 +500151=中国,,重庆市,铜梁区 +500152=中国,,重庆市,潼南区 +500153=中国,,重庆市,荣昌区 +500154=中国,,重庆市,开州区 +500155=中国,,重庆市,梁平区 +500156=中国,,重庆市,武隆区 +500229=中国,,重庆市,城口县 +500230=中国,,重庆市,丰都县 +500231=中国,,重庆市,垫江县 +500233=中国,,重庆市,忠县 +500235=中国,,重庆市,云阳县 +500236=中国,,重庆市,奉节县 +500237=中国,,重庆市,巫山县 +500238=中国,,重庆市,巫溪县 +500240=中国,,重庆市,石柱土家族自治县 +500241=中国,,重庆市,秀山土家族苗族自治县 +500242=中国,,重庆市,酉阳土家族苗族自治县 +500243=中国,,重庆市,彭水苗族土家族自治县 +510000=中国,四川省 +510100=中国,四川省,成都市 +510104=中国,四川省,成都市,锦江区 +510105=中国,四川省,成都市,青羊区 +510106=中国,四川省,成都市,金牛区 +510107=中国,四川省,成都市,武侯区 +510108=中国,四川省,成都市,成华区 +510112=中国,四川省,成都市,龙泉驿区 +510113=中国,四川省,成都市,青白江区 +510114=中国,四川省,成都市,新都区 +510115=中国,四川省,成都市,温江区 +510116=中国,四川省,成都市,双流区 +510117=中国,四川省,成都市,郫都区 +510121=中国,四川省,成都市,金堂县 +510129=中国,四川省,成都市,大邑县 +510131=中国,四川省,成都市,蒲江县 +510132=中国,四川省,成都市,新津县 +510181=中国,四川省,成都市,都江堰市 +510182=中国,四川省,成都市,彭州市 +510183=中国,四川省,成都市,邛崃市 +510184=中国,四川省,成都市,崇州市 +510185=中国,四川省,成都市,简阳市 +510300=中国,四川省,自贡市 +510302=中国,四川省,自贡市,自流井区 +510303=中国,四川省,自贡市,贡井区 +510304=中国,四川省,自贡市,大安区 +510311=中国,四川省,自贡市,沿滩区 +510321=中国,四川省,自贡市,荣县 +510322=中国,四川省,自贡市,富顺县 +510400=中国,四川省,攀枝花市 +510402=中国,四川省,攀枝花市,东区 +510403=中国,四川省,攀枝花市,西区 +510411=中国,四川省,攀枝花市,仁和区 +510421=中国,四川省,攀枝花市,米易县 +510422=中国,四川省,攀枝花市,盐边县 +510500=中国,四川省,泸州市 +510502=中国,四川省,泸州市,江阳区 +510503=中国,四川省,泸州市,纳溪区 +510504=中国,四川省,泸州市,龙马潭区 +510521=中国,四川省,泸州市,泸县 +510522=中国,四川省,泸州市,合江县 +510524=中国,四川省,泸州市,叙永县 +510525=中国,四川省,泸州市,古蔺县 +510600=中国,四川省,德阳市 +510603=中国,四川省,德阳市,旌阳区 +510623=中国,四川省,德阳市,中江县 +510626=中国,四川省,德阳市,罗江县 +510681=中国,四川省,德阳市,广汉市 +510682=中国,四川省,德阳市,什邡市 +510683=中国,四川省,德阳市,绵竹市 +510700=中国,四川省,绵阳市 +510703=中国,四川省,绵阳市,涪城区 +510704=中国,四川省,绵阳市,游仙区 +510705=中国,四川省,绵阳市,安州区 +510722=中国,四川省,绵阳市,三台县 +510723=中国,四川省,绵阳市,盐亭县 +510725=中国,四川省,绵阳市,梓潼县 +510726=中国,四川省,绵阳市,北川羌族自治县 +510727=中国,四川省,绵阳市,平武县 +510781=中国,四川省,绵阳市,江油市 +510800=中国,四川省,广元市 +510802=中国,四川省,广元市,利州区 +510811=中国,四川省,广元市,昭化区 +510812=中国,四川省,广元市,朝天区 +510821=中国,四川省,广元市,旺苍县 +510822=中国,四川省,广元市,青川县 +510823=中国,四川省,广元市,剑阁县 +510824=中国,四川省,广元市,苍溪县 +510900=中国,四川省,遂宁市 +510903=中国,四川省,遂宁市,船山区 +510904=中国,四川省,遂宁市,安居区 +510921=中国,四川省,遂宁市,蓬溪县 +510922=中国,四川省,遂宁市,射洪县 +510923=中国,四川省,遂宁市,大英县 +511000=中国,四川省,内江市 +511002=中国,四川省,内江市,市中区 +511011=中国,四川省,内江市,东兴区 +511024=中国,四川省,内江市,威远县 +511025=中国,四川省,内江市,资中县 +511083=中国,四川省,内江市,隆昌市 +511100=中国,四川省,乐山市 +511102=中国,四川省,乐山市,市中区 +511111=中国,四川省,乐山市,沙湾区 +511112=中国,四川省,乐山市,五通桥区 +511113=中国,四川省,乐山市,金口河区 +511123=中国,四川省,乐山市,犍为县 +511124=中国,四川省,乐山市,井研县 +511126=中国,四川省,乐山市,夹江县 +511129=中国,四川省,乐山市,沐川县 +511132=中国,四川省,乐山市,峨边彝族自治县 +511133=中国,四川省,乐山市,马边彝族自治县 +511181=中国,四川省,乐山市,峨眉山市 +511300=中国,四川省,南充市 +511302=中国,四川省,南充市,顺庆区 +511303=中国,四川省,南充市,高坪区 +511304=中国,四川省,南充市,嘉陵区 +511321=中国,四川省,南充市,南部县 +511322=中国,四川省,南充市,营山县 +511323=中国,四川省,南充市,蓬安县 +511324=中国,四川省,南充市,仪陇县 +511325=中国,四川省,南充市,西充县 +511381=中国,四川省,南充市,阆中市 +511400=中国,四川省,眉山市 +511402=中国,四川省,眉山市,东坡区 +511403=中国,四川省,眉山市,彭山区 +511421=中国,四川省,眉山市,仁寿县 +511423=中国,四川省,眉山市,洪雅县 +511424=中国,四川省,眉山市,丹棱县 +511425=中国,四川省,眉山市,青神县 +511500=中国,四川省,宜宾市 +511502=中国,四川省,宜宾市,翠屏区 +511503=中国,四川省,宜宾市,南溪区 +511521=中国,四川省,宜宾市,宜宾县 +511523=中国,四川省,宜宾市,江安县 +511524=中国,四川省,宜宾市,长宁县 +511525=中国,四川省,宜宾市,高县 +511526=中国,四川省,宜宾市,珙县 +511527=中国,四川省,宜宾市,筠连县 +511528=中国,四川省,宜宾市,兴文县 +511529=中国,四川省,宜宾市,屏山县 +511600=中国,四川省,广安市 +511602=中国,四川省,广安市,广安区 +511603=中国,四川省,广安市,前锋区 +511621=中国,四川省,广安市,岳池县 +511622=中国,四川省,广安市,武胜县 +511623=中国,四川省,广安市,邻水县 +511681=中国,四川省,广安市,华蓥市 +511700=中国,四川省,达州市 +511702=中国,四川省,达州市,通川区 +511703=中国,四川省,达州市,达川区 +511722=中国,四川省,达州市,宣汉县 +511723=中国,四川省,达州市,开江县 +511724=中国,四川省,达州市,大竹县 +511725=中国,四川省,达州市,渠县 +511781=中国,四川省,达州市,万源市 +511800=中国,四川省,雅安市 +511802=中国,四川省,雅安市,雨城区 +511803=中国,四川省,雅安市,名山区 +511822=中国,四川省,雅安市,荥经县 +511823=中国,四川省,雅安市,汉源县 +511824=中国,四川省,雅安市,石棉县 +511825=中国,四川省,雅安市,天全县 +511826=中国,四川省,雅安市,芦山县 +511827=中国,四川省,雅安市,宝兴县 +511900=中国,四川省,巴中市 +511902=中国,四川省,巴中市,巴州区 +511903=中国,四川省,巴中市,恩阳区 +511921=中国,四川省,巴中市,通江县 +511922=中国,四川省,巴中市,南江县 +511923=中国,四川省,巴中市,平昌县 +512000=中国,四川省,资阳市 +512002=中国,四川省,资阳市,雁江区 +512021=中国,四川省,资阳市,安岳县 +512022=中国,四川省,资阳市,乐至县 +513200=中国,四川省,阿坝藏族羌族自治州 +513201=中国,四川省,阿坝藏族羌族自治州,马尔康市 +513221=中国,四川省,阿坝藏族羌族自治州,汶川县 +513222=中国,四川省,阿坝藏族羌族自治州,理县 +513223=中国,四川省,阿坝藏族羌族自治州,茂县 +513224=中国,四川省,阿坝藏族羌族自治州,松潘县 +513225=中国,四川省,阿坝藏族羌族自治州,九寨沟县 +513226=中国,四川省,阿坝藏族羌族自治州,金川县 +513227=中国,四川省,阿坝藏族羌族自治州,小金县 +513228=中国,四川省,阿坝藏族羌族自治州,黑水县 +513230=中国,四川省,阿坝藏族羌族自治州,壤塘县 +513231=中国,四川省,阿坝藏族羌族自治州,阿坝县 +513232=中国,四川省,阿坝藏族羌族自治州,若尔盖县 +513233=中国,四川省,阿坝藏族羌族自治州,红原县 +513300=中国,四川省,甘孜藏族自治州 +513301=中国,四川省,甘孜藏族自治州,康定市 +513322=中国,四川省,甘孜藏族自治州,泸定县 +513323=中国,四川省,甘孜藏族自治州,丹巴县 +513324=中国,四川省,甘孜藏族自治州,九龙县 +513325=中国,四川省,甘孜藏族自治州,雅江县 +513326=中国,四川省,甘孜藏族自治州,道孚县 +513327=中国,四川省,甘孜藏族自治州,炉霍县 +513328=中国,四川省,甘孜藏族自治州,甘孜县 +513329=中国,四川省,甘孜藏族自治州,新龙县 +513330=中国,四川省,甘孜藏族自治州,德格县 +513331=中国,四川省,甘孜藏族自治州,白玉县 +513332=中国,四川省,甘孜藏族自治州,石渠县 +513333=中国,四川省,甘孜藏族自治州,色达县 +513334=中国,四川省,甘孜藏族自治州,理塘县 +513335=中国,四川省,甘孜藏族自治州,巴塘县 +513336=中国,四川省,甘孜藏族自治州,乡城县 +513337=中国,四川省,甘孜藏族自治州,稻城县 +513338=中国,四川省,甘孜藏族自治州,得荣县 +513400=中国,四川省,凉山彝族自治州 +513401=中国,四川省,凉山彝族自治州,西昌市 +513422=中国,四川省,凉山彝族自治州,木里藏族自治县 +513423=中国,四川省,凉山彝族自治州,盐源县 +513424=中国,四川省,凉山彝族自治州,德昌县 +513425=中国,四川省,凉山彝族自治州,会理县 +513426=中国,四川省,凉山彝族自治州,会东县 +513427=中国,四川省,凉山彝族自治州,宁南县 +513428=中国,四川省,凉山彝族自治州,普格县 +513429=中国,四川省,凉山彝族自治州,布拖县 +513430=中国,四川省,凉山彝族自治州,金阳县 +513431=中国,四川省,凉山彝族自治州,昭觉县 +513432=中国,四川省,凉山彝族自治州,喜德县 +513433=中国,四川省,凉山彝族自治州,冕宁县 +513434=中国,四川省,凉山彝族自治州,越西县 +513435=中国,四川省,凉山彝族自治州,甘洛县 +513436=中国,四川省,凉山彝族自治州,美姑县 +513437=中国,四川省,凉山彝族自治州,雷波县 +520000=中国,贵州省 +520100=中国,贵州省,贵阳市 +520102=中国,贵州省,贵阳市,南明区 +520103=中国,贵州省,贵阳市,云岩区 +520111=中国,贵州省,贵阳市,花溪区 +520112=中国,贵州省,贵阳市,乌当区 +520113=中国,贵州省,贵阳市,白云区 +520115=中国,贵州省,贵阳市,观山湖区 +520121=中国,贵州省,贵阳市,开阳县 +520122=中国,贵州省,贵阳市,息烽县 +520123=中国,贵州省,贵阳市,修文县 +520181=中国,贵州省,贵阳市,清镇市 +520200=中国,贵州省,六盘水市 +520201=中国,贵州省,六盘水市,钟山区 +520203=中国,贵州省,六盘水市,六枝特区 +520221=中国,贵州省,六盘水市,水城县 +520281=中国,贵州省,六盘水市,盘州市 +520300=中国,贵州省,遵义市 +520302=中国,贵州省,遵义市,红花岗区 +520303=中国,贵州省,遵义市,汇川区 +520304=中国,贵州省,遵义市,播州区 +520322=中国,贵州省,遵义市,桐梓县 +520323=中国,贵州省,遵义市,绥阳县 +520324=中国,贵州省,遵义市,正安县 +520325=中国,贵州省,遵义市,道真仡佬族苗族自治县 +520326=中国,贵州省,遵义市,务川仡佬族苗族自治县 +520327=中国,贵州省,遵义市,凤冈县 +520328=中国,贵州省,遵义市,湄潭县 +520329=中国,贵州省,遵义市,余庆县 +520330=中国,贵州省,遵义市,习水县 +520381=中国,贵州省,遵义市,赤水市 +520382=中国,贵州省,遵义市,仁怀市 +520400=中国,贵州省,安顺市 +520402=中国,贵州省,安顺市,西秀区 +520403=中国,贵州省,安顺市,平坝区 +520422=中国,贵州省,安顺市,普定县 +520423=中国,贵州省,安顺市,镇宁布依族苗族自治县 +520424=中国,贵州省,安顺市,关岭布依族苗族自治县 +520425=中国,贵州省,安顺市,紫云苗族布依族自治县 +520500=中国,贵州省,毕节市 +520502=中国,贵州省,毕节市,七星关区 +520521=中国,贵州省,毕节市,大方县 +520522=中国,贵州省,毕节市,黔西县 +520523=中国,贵州省,毕节市,金沙县 +520524=中国,贵州省,毕节市,织金县 +520525=中国,贵州省,毕节市,纳雍县 +520526=中国,贵州省,毕节市,威宁彝族回族苗族自治县 +520527=中国,贵州省,毕节市,赫章县 +520600=中国,贵州省,铜仁市 +520602=中国,贵州省,铜仁市,碧江区 +520603=中国,贵州省,铜仁市,万山区 +520621=中国,贵州省,铜仁市,江口县 +520622=中国,贵州省,铜仁市,玉屏侗族自治县 +520623=中国,贵州省,铜仁市,石阡县 +520624=中国,贵州省,铜仁市,思南县 +520625=中国,贵州省,铜仁市,印江土家族苗族自治县 +520626=中国,贵州省,铜仁市,德江县 +520627=中国,贵州省,铜仁市,沿河土家族自治县 +520628=中国,贵州省,铜仁市,松桃苗族自治县 +522300=中国,贵州省,黔西南布依族苗族自治州 +522301=中国,贵州省,黔西南布依族苗族自治州,兴义市 +522322=中国,贵州省,黔西南布依族苗族自治州,兴仁县 +522323=中国,贵州省,黔西南布依族苗族自治州,普安县 +522324=中国,贵州省,黔西南布依族苗族自治州,晴隆县 +522325=中国,贵州省,黔西南布依族苗族自治州,贞丰县 +522326=中国,贵州省,黔西南布依族苗族自治州,望谟县 +522327=中国,贵州省,黔西南布依族苗族自治州,册亨县 +522328=中国,贵州省,黔西南布依族苗族自治州,安龙县 +522600=中国,贵州省,黔东南苗族侗族自治州 +522601=中国,贵州省,黔东南苗族侗族自治州,凯里市 +522622=中国,贵州省,黔东南苗族侗族自治州,黄平县 +522623=中国,贵州省,黔东南苗族侗族自治州,施秉县 +522624=中国,贵州省,黔东南苗族侗族自治州,三穗县 +522625=中国,贵州省,黔东南苗族侗族自治州,镇远县 +522626=中国,贵州省,黔东南苗族侗族自治州,岑巩县 +522627=中国,贵州省,黔东南苗族侗族自治州,天柱县 +522628=中国,贵州省,黔东南苗族侗族自治州,锦屏县 +522629=中国,贵州省,黔东南苗族侗族自治州,剑河县 +522630=中国,贵州省,黔东南苗族侗族自治州,台江县 +522631=中国,贵州省,黔东南苗族侗族自治州,黎平县 +522632=中国,贵州省,黔东南苗族侗族自治州,榕江县 +522633=中国,贵州省,黔东南苗族侗族自治州,从江县 +522634=中国,贵州省,黔东南苗族侗族自治州,雷山县 +522635=中国,贵州省,黔东南苗族侗族自治州,麻江县 +522636=中国,贵州省,黔东南苗族侗族自治州,丹寨县 +522700=中国,贵州省,黔南布依族苗族自治州 +522701=中国,贵州省,黔南布依族苗族自治州,都匀市 +522702=中国,贵州省,黔南布依族苗族自治州,福泉市 +522722=中国,贵州省,黔南布依族苗族自治州,荔波县 +522723=中国,贵州省,黔南布依族苗族自治州,贵定县 +522725=中国,贵州省,黔南布依族苗族自治州,瓮安县 +522726=中国,贵州省,黔南布依族苗族自治州,独山县 +522727=中国,贵州省,黔南布依族苗族自治州,平塘县 +522728=中国,贵州省,黔南布依族苗族自治州,罗甸县 +522729=中国,贵州省,黔南布依族苗族自治州,长顺县 +522730=中国,贵州省,黔南布依族苗族自治州,龙里县 +522731=中国,贵州省,黔南布依族苗族自治州,惠水县 +522732=中国,贵州省,黔南布依族苗族自治州,三都水族自治县 +530000=中国,云南省 +530100=中国,云南省,昆明市 +530102=中国,云南省,昆明市,五华区 +530103=中国,云南省,昆明市,盘龙区 +530111=中国,云南省,昆明市,官渡区 +530112=中国,云南省,昆明市,西山区 +530113=中国,云南省,昆明市,东川区 +530114=中国,云南省,昆明市,呈贡区 +530115=中国,云南省,昆明市,晋宁区 +530124=中国,云南省,昆明市,富民县 +530125=中国,云南省,昆明市,宜良县 +530126=中国,云南省,昆明市,石林彝族自治县 +530127=中国,云南省,昆明市,嵩明县 +530128=中国,云南省,昆明市,禄劝彝族苗族自治县 +530129=中国,云南省,昆明市,寻甸回族彝族自治县 +530181=中国,云南省,昆明市,安宁市 +530300=中国,云南省,曲靖市 +530302=中国,云南省,曲靖市,麒麟区 +530303=中国,云南省,曲靖市,沾益区 +530321=中国,云南省,曲靖市,马龙县 +530322=中国,云南省,曲靖市,陆良县 +530323=中国,云南省,曲靖市,师宗县 +530324=中国,云南省,曲靖市,罗平县 +530325=中国,云南省,曲靖市,富源县 +530326=中国,云南省,曲靖市,会泽县 +530381=中国,云南省,曲靖市,宣威市 +530400=中国,云南省,玉溪市 +530402=中国,云南省,玉溪市,红塔区 +530403=中国,云南省,玉溪市,江川区 +530422=中国,云南省,玉溪市,澄江县 +530423=中国,云南省,玉溪市,通海县 +530424=中国,云南省,玉溪市,华宁县 +530425=中国,云南省,玉溪市,易门县 +530426=中国,云南省,玉溪市,峨山彝族自治县 +530427=中国,云南省,玉溪市,新平彝族傣族自治县 +530428=中国,云南省,玉溪市,元江哈尼族彝族傣族自治县 +530500=中国,云南省,保山市 +530502=中国,云南省,保山市,隆阳区 +530521=中国,云南省,保山市,施甸县 +530523=中国,云南省,保山市,龙陵县 +530524=中国,云南省,保山市,昌宁县 +530581=中国,云南省,保山市,腾冲市 +530600=中国,云南省,昭通市 +530602=中国,云南省,昭通市,昭阳区 +530621=中国,云南省,昭通市,鲁甸县 +530622=中国,云南省,昭通市,巧家县 +530623=中国,云南省,昭通市,盐津县 +530624=中国,云南省,昭通市,大关县 +530625=中国,云南省,昭通市,永善县 +530626=中国,云南省,昭通市,绥江县 +530627=中国,云南省,昭通市,镇雄县 +530628=中国,云南省,昭通市,彝良县 +530629=中国,云南省,昭通市,威信县 +530630=中国,云南省,昭通市,水富县 +530700=中国,云南省,丽江市 +530702=中国,云南省,丽江市,古城区 +530721=中国,云南省,丽江市,玉龙纳西族自治县 +530722=中国,云南省,丽江市,永胜县 +530723=中国,云南省,丽江市,华坪县 +530724=中国,云南省,丽江市,宁蒗彝族自治县 +530800=中国,云南省,普洱市 +530802=中国,云南省,普洱市,思茅区 +530821=中国,云南省,普洱市,宁洱哈尼族彝族自治县 +530822=中国,云南省,普洱市,墨江哈尼族自治县 +530823=中国,云南省,普洱市,景东彝族自治县 +530824=中国,云南省,普洱市,景谷傣族彝族自治县 +530825=中国,云南省,普洱市,镇沅彝族哈尼族拉祜族自治县 +530826=中国,云南省,普洱市,江城哈尼族彝族自治县 +530827=中国,云南省,普洱市,孟连傣族拉祜族佤族自治县 +530828=中国,云南省,普洱市,澜沧拉祜族自治县 +530829=中国,云南省,普洱市,西盟佤族自治县 +530900=中国,云南省,临沧市 +530902=中国,云南省,临沧市,临翔区 +530921=中国,云南省,临沧市,凤庆县 +530922=中国,云南省,临沧市,云县 +530923=中国,云南省,临沧市,永德县 +530924=中国,云南省,临沧市,镇康县 +530925=中国,云南省,临沧市,双江拉祜族佤族布朗族傣族自治县 +530926=中国,云南省,临沧市,耿马傣族佤族自治县 +530927=中国,云南省,临沧市,沧源佤族自治县 +532300=中国,云南省,楚雄彝族自治州 +532301=中国,云南省,楚雄彝族自治州,楚雄市 +532322=中国,云南省,楚雄彝族自治州,双柏县 +532323=中国,云南省,楚雄彝族自治州,牟定县 +532324=中国,云南省,楚雄彝族自治州,南华县 +532325=中国,云南省,楚雄彝族自治州,姚安县 +532326=中国,云南省,楚雄彝族自治州,大姚县 +532327=中国,云南省,楚雄彝族自治州,永仁县 +532328=中国,云南省,楚雄彝族自治州,元谋县 +532329=中国,云南省,楚雄彝族自治州,武定县 +532331=中国,云南省,楚雄彝族自治州,禄丰县 +532500=中国,云南省,红河哈尼族彝族自治州 +532501=中国,云南省,红河哈尼族彝族自治州,个旧市 +532502=中国,云南省,红河哈尼族彝族自治州,开远市 +532503=中国,云南省,红河哈尼族彝族自治州,蒙自市 +532504=中国,云南省,红河哈尼族彝族自治州,弥勒市 +532523=中国,云南省,红河哈尼族彝族自治州,屏边苗族自治县 +532524=中国,云南省,红河哈尼族彝族自治州,建水县 +532525=中国,云南省,红河哈尼族彝族自治州,石屏县 +532527=中国,云南省,红河哈尼族彝族自治州,泸西县 +532528=中国,云南省,红河哈尼族彝族自治州,元阳县 +532529=中国,云南省,红河哈尼族彝族自治州,红河县 +532530=中国,云南省,红河哈尼族彝族自治州,金平苗族瑶族傣族自治县 +532531=中国,云南省,红河哈尼族彝族自治州,绿春县 +532532=中国,云南省,红河哈尼族彝族自治州,河口瑶族自治县 +532600=中国,云南省,文山壮族苗族自治州 +532601=中国,云南省,文山壮族苗族自治州,文山市 +532622=中国,云南省,文山壮族苗族自治州,砚山县 +532623=中国,云南省,文山壮族苗族自治州,西畴县 +532624=中国,云南省,文山壮族苗族自治州,麻栗坡县 +532625=中国,云南省,文山壮族苗族自治州,马关县 +532626=中国,云南省,文山壮族苗族自治州,丘北县 +532627=中国,云南省,文山壮族苗族自治州,广南县 +532628=中国,云南省,文山壮族苗族自治州,富宁县 +532800=中国,云南省,西双版纳傣族自治州 +532801=中国,云南省,西双版纳傣族自治州,景洪市 +532822=中国,云南省,西双版纳傣族自治州,勐海县 +532823=中国,云南省,西双版纳傣族自治州,勐腊县 +532900=中国,云南省,大理白族自治州 +532901=中国,云南省,大理白族自治州,大理市 +532922=中国,云南省,大理白族自治州,漾濞彝族自治县 +532923=中国,云南省,大理白族自治州,祥云县 +532924=中国,云南省,大理白族自治州,宾川县 +532925=中国,云南省,大理白族自治州,弥渡县 +532926=中国,云南省,大理白族自治州,南涧彝族自治县 +532927=中国,云南省,大理白族自治州,巍山彝族回族自治县 +532928=中国,云南省,大理白族自治州,永平县 +532929=中国,云南省,大理白族自治州,云龙县 +532930=中国,云南省,大理白族自治州,洱源县 +532931=中国,云南省,大理白族自治州,剑川县 +532932=中国,云南省,大理白族自治州,鹤庆县 +533100=中国,云南省,德宏傣族景颇族自治州 +533102=中国,云南省,德宏傣族景颇族自治州,瑞丽市 +533103=中国,云南省,德宏傣族景颇族自治州,芒市 +533122=中国,云南省,德宏傣族景颇族自治州,梁河县 +533123=中国,云南省,德宏傣族景颇族自治州,盈江县 +533124=中国,云南省,德宏傣族景颇族自治州,陇川县 +533300=中国,云南省,怒江傈僳族自治州 +533301=中国,云南省,怒江傈僳族自治州,泸水市 +533323=中国,云南省,怒江傈僳族自治州,福贡县 +533324=中国,云南省,怒江傈僳族自治州,贡山独龙族怒族自治县 +533325=中国,云南省,怒江傈僳族自治州,兰坪白族普米族自治县 +533400=中国,云南省,迪庆藏族自治州 +533401=中国,云南省,迪庆藏族自治州,香格里拉市 +533422=中国,云南省,迪庆藏族自治州,德钦县 +533423=中国,云南省,迪庆藏族自治州,维西傈僳族自治县 +540000=中国,西藏自治区 +540100=中国,西藏自治区,拉萨市 +540102=中国,西藏自治区,拉萨市,城关区 +540103=中国,西藏自治区,拉萨市,堆龙德庆区 +540121=中国,西藏自治区,拉萨市,林周县 +540122=中国,西藏自治区,拉萨市,当雄县 +540123=中国,西藏自治区,拉萨市,尼木县 +540124=中国,西藏自治区,拉萨市,曲水县 +540126=中国,西藏自治区,拉萨市,达孜县 +540127=中国,西藏自治区,拉萨市,墨竹工卡县 +540200=中国,西藏自治区,日喀则市 +540202=中国,西藏自治区,日喀则市,桑珠孜区 +540221=中国,西藏自治区,日喀则市,南木林县 +540222=中国,西藏自治区,日喀则市,江孜县 +540223=中国,西藏自治区,日喀则市,定日县 +540224=中国,西藏自治区,日喀则市,萨迦县 +540225=中国,西藏自治区,日喀则市,拉孜县 +540226=中国,西藏自治区,日喀则市,昂仁县 +540227=中国,西藏自治区,日喀则市,谢通门县 +540228=中国,西藏自治区,日喀则市,白朗县 +540229=中国,西藏自治区,日喀则市,仁布县 +540230=中国,西藏自治区,日喀则市,康马县 +540231=中国,西藏自治区,日喀则市,定结县 +540232=中国,西藏自治区,日喀则市,仲巴县 +540233=中国,西藏自治区,日喀则市,亚东县 +540234=中国,西藏自治区,日喀则市,吉隆县 +540235=中国,西藏自治区,日喀则市,聂拉木县 +540236=中国,西藏自治区,日喀则市,萨嘎县 +540237=中国,西藏自治区,日喀则市,岗巴县 +540300=中国,西藏自治区,昌都市 +540302=中国,西藏自治区,昌都市,卡若区 +540321=中国,西藏自治区,昌都市,江达县 +540322=中国,西藏自治区,昌都市,贡觉县 +540323=中国,西藏自治区,昌都市,类乌齐县 +540324=中国,西藏自治区,昌都市,丁青县 +540325=中国,西藏自治区,昌都市,察雅县 +540326=中国,西藏自治区,昌都市,八宿县 +540327=中国,西藏自治区,昌都市,左贡县 +540328=中国,西藏自治区,昌都市,芒康县 +540329=中国,西藏自治区,昌都市,洛隆县 +540330=中国,西藏自治区,昌都市,边坝县 +540400=中国,西藏自治区,林芝市 +540402=中国,西藏自治区,林芝市,巴宜区 +540421=中国,西藏自治区,林芝市,工布江达县 +540422=中国,西藏自治区,林芝市,米林县 +540423=中国,西藏自治区,林芝市,墨脱县 +540424=中国,西藏自治区,林芝市,波密县 +540425=中国,西藏自治区,林芝市,察隅县 +540426=中国,西藏自治区,林芝市,朗县 +540500=中国,西藏自治区,山南市 +540502=中国,西藏自治区,山南市,乃东区 +540521=中国,西藏自治区,山南市,扎囊县 +540522=中国,西藏自治区,山南市,贡嘎县 +540523=中国,西藏自治区,山南市,桑日县 +540524=中国,西藏自治区,山南市,琼结县 +540525=中国,西藏自治区,山南市,曲松县 +540526=中国,西藏自治区,山南市,措美县 +540527=中国,西藏自治区,山南市,洛扎县 +540528=中国,西藏自治区,山南市,加查县 +540529=中国,西藏自治区,山南市,隆子县 +540530=中国,西藏自治区,山南市,错那县 +540531=中国,西藏自治区,山南市,浪卡子县 +542400=中国,西藏自治区,那曲地区 +542421=中国,西藏自治区,那曲地区,那曲县 +542422=中国,西藏自治区,那曲地区,嘉黎县 +542423=中国,西藏自治区,那曲地区,比如县 +542424=中国,西藏自治区,那曲地区,聂荣县 +542425=中国,西藏自治区,那曲地区,安多县 +542426=中国,西藏自治区,那曲地区,申扎县 +542427=中国,西藏自治区,那曲地区,索县 +542428=中国,西藏自治区,那曲地区,班戈县 +542429=中国,西藏自治区,那曲地区,巴青县 +542430=中国,西藏自治区,那曲地区,尼玛县 +542431=中国,西藏自治区,那曲地区,双湖县 +542500=中国,西藏自治区,阿里地区 +542521=中国,西藏自治区,阿里地区,普兰县 +542522=中国,西藏自治区,阿里地区,札达县 +542523=中国,西藏自治区,阿里地区,噶尔县 +542524=中国,西藏自治区,阿里地区,日土县 +542525=中国,西藏自治区,阿里地区,革吉县 +542526=中国,西藏自治区,阿里地区,改则县 +542527=中国,西藏自治区,阿里地区,措勤县 +610000=中国,陕西省 +610100=中国,陕西省,西安市 +610102=中国,陕西省,西安市,新城区 +610103=中国,陕西省,西安市,碑林区 +610104=中国,陕西省,西安市,莲湖区 +610111=中国,陕西省,西安市,灞桥区 +610112=中国,陕西省,西安市,未央区 +610113=中国,陕西省,西安市,雁塔区 +610114=中国,陕西省,西安市,阎良区 +610115=中国,陕西省,西安市,临潼区 +610116=中国,陕西省,西安市,长安区 +610117=中国,陕西省,西安市,高陵区 +610118=中国,陕西省,西安市,鄠邑区 +610122=中国,陕西省,西安市,蓝田县 +610124=中国,陕西省,西安市,周至县 +610200=中国,陕西省,铜川市 +610202=中国,陕西省,铜川市,王益区 +610203=中国,陕西省,铜川市,印台区 +610204=中国,陕西省,铜川市,耀州区 +610222=中国,陕西省,铜川市,宜君县 +610300=中国,陕西省,宝鸡市 +610302=中国,陕西省,宝鸡市,渭滨区 +610303=中国,陕西省,宝鸡市,金台区 +610304=中国,陕西省,宝鸡市,陈仓区 +610322=中国,陕西省,宝鸡市,凤翔县 +610323=中国,陕西省,宝鸡市,岐山县 +610324=中国,陕西省,宝鸡市,扶风县 +610326=中国,陕西省,宝鸡市,眉县 +610327=中国,陕西省,宝鸡市,陇县 +610328=中国,陕西省,宝鸡市,千阳县 +610329=中国,陕西省,宝鸡市,麟游县 +610330=中国,陕西省,宝鸡市,凤县 +610331=中国,陕西省,宝鸡市,太白县 +610400=中国,陕西省,咸阳市 +610402=中国,陕西省,咸阳市,秦都区 +610403=中国,陕西省,咸阳市,杨陵区 +610404=中国,陕西省,咸阳市,渭城区 +610422=中国,陕西省,咸阳市,三原县 +610423=中国,陕西省,咸阳市,泾阳县 +610424=中国,陕西省,咸阳市,乾县 +610425=中国,陕西省,咸阳市,礼泉县 +610426=中国,陕西省,咸阳市,永寿县 +610427=中国,陕西省,咸阳市,彬县 +610428=中国,陕西省,咸阳市,长武县 +610429=中国,陕西省,咸阳市,旬邑县 +610430=中国,陕西省,咸阳市,淳化县 +610431=中国,陕西省,咸阳市,武功县 +610481=中国,陕西省,咸阳市,兴平市 +610500=中国,陕西省,渭南市 +610502=中国,陕西省,渭南市,临渭区 +610503=中国,陕西省,渭南市,华州区 +610522=中国,陕西省,渭南市,潼关县 +610523=中国,陕西省,渭南市,大荔县 +610524=中国,陕西省,渭南市,合阳县 +610525=中国,陕西省,渭南市,澄城县 +610526=中国,陕西省,渭南市,蒲城县 +610527=中国,陕西省,渭南市,白水县 +610528=中国,陕西省,渭南市,富平县 +610581=中国,陕西省,渭南市,韩城市 +610582=中国,陕西省,渭南市,华阴市 +610600=中国,陕西省,延安市 +610602=中国,陕西省,延安市,宝塔区 +610603=中国,陕西省,延安市,安塞区 +610621=中国,陕西省,延安市,延长县 +610622=中国,陕西省,延安市,延川县 +610623=中国,陕西省,延安市,子长县 +610625=中国,陕西省,延安市,志丹县 +610626=中国,陕西省,延安市,吴起县 +610627=中国,陕西省,延安市,甘泉县 +610628=中国,陕西省,延安市,富县 +610629=中国,陕西省,延安市,洛川县 +610630=中国,陕西省,延安市,宜川县 +610631=中国,陕西省,延安市,黄龙县 +610632=中国,陕西省,延安市,黄陵县 +610700=中国,陕西省,汉中市 +610702=中国,陕西省,汉中市,汉台区 +610721=中国,陕西省,汉中市,南郑县 +610722=中国,陕西省,汉中市,城固县 +610723=中国,陕西省,汉中市,洋县 +610724=中国,陕西省,汉中市,西乡县 +610725=中国,陕西省,汉中市,勉县 +610726=中国,陕西省,汉中市,宁强县 +610727=中国,陕西省,汉中市,略阳县 +610728=中国,陕西省,汉中市,镇巴县 +610729=中国,陕西省,汉中市,留坝县 +610730=中国,陕西省,汉中市,佛坪县 +610800=中国,陕西省,榆林市 +610802=中国,陕西省,榆林市,榆阳区 +610803=中国,陕西省,榆林市,横山区 +610822=中国,陕西省,榆林市,府谷县 +610824=中国,陕西省,榆林市,靖边县 +610825=中国,陕西省,榆林市,定边县 +610826=中国,陕西省,榆林市,绥德县 +610827=中国,陕西省,榆林市,米脂县 +610828=中国,陕西省,榆林市,佳县 +610829=中国,陕西省,榆林市,吴堡县 +610830=中国,陕西省,榆林市,清涧县 +610831=中国,陕西省,榆林市,子洲县 +610881=中国,陕西省,榆林市,神木市 +610900=中国,陕西省,安康市 +610902=中国,陕西省,安康市,汉滨区 +610921=中国,陕西省,安康市,汉阴县 +610922=中国,陕西省,安康市,石泉县 +610923=中国,陕西省,安康市,宁陕县 +610924=中国,陕西省,安康市,紫阳县 +610925=中国,陕西省,安康市,岚皋县 +610926=中国,陕西省,安康市,平利县 +610927=中国,陕西省,安康市,镇坪县 +610928=中国,陕西省,安康市,旬阳县 +610929=中国,陕西省,安康市,白河县 +611000=中国,陕西省,商洛市 +611002=中国,陕西省,商洛市,商州区 +611021=中国,陕西省,商洛市,洛南县 +611022=中国,陕西省,商洛市,丹凤县 +611023=中国,陕西省,商洛市,商南县 +611024=中国,陕西省,商洛市,山阳县 +611025=中国,陕西省,商洛市,镇安县 +611026=中国,陕西省,商洛市,柞水县 +620000=中国,甘肃省 +620100=中国,甘肃省,兰州市 +620102=中国,甘肃省,兰州市,城关区 +620103=中国,甘肃省,兰州市,七里河区 +620104=中国,甘肃省,兰州市,西固区 +620105=中国,甘肃省,兰州市,安宁区 +620111=中国,甘肃省,兰州市,红古区 +620121=中国,甘肃省,兰州市,永登县 +620122=中国,甘肃省,兰州市,皋兰县 +620123=中国,甘肃省,兰州市,榆中县 +620200=中国,甘肃省,嘉峪关市 +620201=中国,甘肃省,嘉峪关市,嘉峪关市 +620300=中国,甘肃省,金昌市 +620302=中国,甘肃省,金昌市,金川区 +620321=中国,甘肃省,金昌市,永昌县 +620400=中国,甘肃省,白银市 +620402=中国,甘肃省,白银市,白银区 +620403=中国,甘肃省,白银市,平川区 +620421=中国,甘肃省,白银市,靖远县 +620422=中国,甘肃省,白银市,会宁县 +620423=中国,甘肃省,白银市,景泰县 +620500=中国,甘肃省,天水市 +620502=中国,甘肃省,天水市,秦州区 +620503=中国,甘肃省,天水市,麦积区 +620521=中国,甘肃省,天水市,清水县 +620522=中国,甘肃省,天水市,秦安县 +620523=中国,甘肃省,天水市,甘谷县 +620524=中国,甘肃省,天水市,武山县 +620525=中国,甘肃省,天水市,张家川回族自治县 +620600=中国,甘肃省,武威市 +620602=中国,甘肃省,武威市,凉州区 +620621=中国,甘肃省,武威市,民勤县 +620622=中国,甘肃省,武威市,古浪县 +620623=中国,甘肃省,武威市,天祝藏族自治县 +620700=中国,甘肃省,张掖市 +620702=中国,甘肃省,张掖市,甘州区 +620721=中国,甘肃省,张掖市,肃南裕固族自治县 +620722=中国,甘肃省,张掖市,民乐县 +620723=中国,甘肃省,张掖市,临泽县 +620724=中国,甘肃省,张掖市,高台县 +620725=中国,甘肃省,张掖市,山丹县 +620800=中国,甘肃省,平凉市 +620802=中国,甘肃省,平凉市,崆峒区 +620821=中国,甘肃省,平凉市,泾川县 +620822=中国,甘肃省,平凉市,灵台县 +620823=中国,甘肃省,平凉市,崇信县 +620824=中国,甘肃省,平凉市,华亭县 +620825=中国,甘肃省,平凉市,庄浪县 +620826=中国,甘肃省,平凉市,静宁县 +620900=中国,甘肃省,酒泉市 +620902=中国,甘肃省,酒泉市,肃州区 +620921=中国,甘肃省,酒泉市,金塔县 +620922=中国,甘肃省,酒泉市,瓜州县 +620923=中国,甘肃省,酒泉市,肃北蒙古族自治县 +620924=中国,甘肃省,酒泉市,阿克塞哈萨克族自治县 +620981=中国,甘肃省,酒泉市,玉门市 +620982=中国,甘肃省,酒泉市,敦煌市 +621000=中国,甘肃省,庆阳市 +621002=中国,甘肃省,庆阳市,西峰区 +621021=中国,甘肃省,庆阳市,庆城县 +621022=中国,甘肃省,庆阳市,环县 +621023=中国,甘肃省,庆阳市,华池县 +621024=中国,甘肃省,庆阳市,合水县 +621025=中国,甘肃省,庆阳市,正宁县 +621026=中国,甘肃省,庆阳市,宁县 +621027=中国,甘肃省,庆阳市,镇原县 +621100=中国,甘肃省,定西市 +621102=中国,甘肃省,定西市,安定区 +621121=中国,甘肃省,定西市,通渭县 +621122=中国,甘肃省,定西市,陇西县 +621123=中国,甘肃省,定西市,渭源县 +621124=中国,甘肃省,定西市,临洮县 +621125=中国,甘肃省,定西市,漳县 +621126=中国,甘肃省,定西市,岷县 +621200=中国,甘肃省,陇南市 +621202=中国,甘肃省,陇南市,武都区 +621221=中国,甘肃省,陇南市,成县 +621222=中国,甘肃省,陇南市,文县 +621223=中国,甘肃省,陇南市,宕昌县 +621224=中国,甘肃省,陇南市,康县 +621225=中国,甘肃省,陇南市,西和县 +621226=中国,甘肃省,陇南市,礼县 +621227=中国,甘肃省,陇南市,徽县 +621228=中国,甘肃省,陇南市,两当县 +622900=中国,甘肃省,临夏回族自治州 +622901=中国,甘肃省,临夏回族自治州,临夏市 +622921=中国,甘肃省,临夏回族自治州,临夏县 +622922=中国,甘肃省,临夏回族自治州,康乐县 +622923=中国,甘肃省,临夏回族自治州,永靖县 +622924=中国,甘肃省,临夏回族自治州,广河县 +622925=中国,甘肃省,临夏回族自治州,和政县 +622926=中国,甘肃省,临夏回族自治州,东乡族自治县 +622927=中国,甘肃省,临夏回族自治州,积石山保安族东乡族撒拉族自治县 +623000=中国,甘肃省,甘南藏族自治州 +623001=中国,甘肃省,甘南藏族自治州,合作市 +623021=中国,甘肃省,甘南藏族自治州,临潭县 +623022=中国,甘肃省,甘南藏族自治州,卓尼县 +623023=中国,甘肃省,甘南藏族自治州,舟曲县 +623024=中国,甘肃省,甘南藏族自治州,迭部县 +623025=中国,甘肃省,甘南藏族自治州,玛曲县 +623026=中国,甘肃省,甘南藏族自治州,碌曲县 +623027=中国,甘肃省,甘南藏族自治州,夏河县 +630000=中国,青海省 +630100=中国,青海省,西宁市 +630102=中国,青海省,西宁市,城东区 +630103=中国,青海省,西宁市,城中区 +630104=中国,青海省,西宁市,城西区 +630105=中国,青海省,西宁市,城北区 +630121=中国,青海省,西宁市,大通回族土族自治县 +630122=中国,青海省,西宁市,湟中县 +630123=中国,青海省,西宁市,湟源县 +630200=中国,青海省,海东市 +630202=中国,青海省,海东市,乐都区 +630203=中国,青海省,海东市,平安区 +630222=中国,青海省,海东市,民和回族土族自治县 +630223=中国,青海省,海东市,互助土族自治县 +630224=中国,青海省,海东市,化隆回族自治县 +630225=中国,青海省,海东市,循化撒拉族自治县 +632200=中国,青海省,海北藏族自治州 +632221=中国,青海省,海北藏族自治州,门源回族自治县 +632222=中国,青海省,海北藏族自治州,祁连县 +632223=中国,青海省,海北藏族自治州,海晏县 +632224=中国,青海省,海北藏族自治州,刚察县 +632300=中国,青海省,黄南藏族自治州 +632321=中国,青海省,黄南藏族自治州,同仁县 +632322=中国,青海省,黄南藏族自治州,尖扎县 +632323=中国,青海省,黄南藏族自治州,泽库县 +632324=中国,青海省,黄南藏族自治州,河南蒙古族自治县 +632500=中国,青海省,海南藏族自治州 +632521=中国,青海省,海南藏族自治州,共和县 +632522=中国,青海省,海南藏族自治州,同德县 +632523=中国,青海省,海南藏族自治州,贵德县 +632524=中国,青海省,海南藏族自治州,兴海县 +632525=中国,青海省,海南藏族自治州,贵南县 +632600=中国,青海省,果洛藏族自治州 +632621=中国,青海省,果洛藏族自治州,玛沁县 +632622=中国,青海省,果洛藏族自治州,班玛县 +632623=中国,青海省,果洛藏族自治州,甘德县 +632624=中国,青海省,果洛藏族自治州,达日县 +632625=中国,青海省,果洛藏族自治州,久治县 +632626=中国,青海省,果洛藏族自治州,玛多县 +632700=中国,青海省,玉树藏族自治州 +632701=中国,青海省,玉树藏族自治州,玉树市 +632722=中国,青海省,玉树藏族自治州,杂多县 +632723=中国,青海省,玉树藏族自治州,称多县 +632724=中国,青海省,玉树藏族自治州,治多县 +632725=中国,青海省,玉树藏族自治州,囊谦县 +632726=中国,青海省,玉树藏族自治州,曲麻莱县 +632800=中国,青海省,海西蒙古族藏族自治州 +632801=中国,青海省,海西蒙古族藏族自治州,格尔木市 +632802=中国,青海省,海西蒙古族藏族自治州,德令哈市 +632821=中国,青海省,海西蒙古族藏族自治州,乌兰县 +632822=中国,青海省,海西蒙古族藏族自治州,都兰县 +632823=中国,青海省,海西蒙古族藏族自治州,天峻县 +632824=中国,青海省,海西蒙古族藏族自治州,冷湖行政区 +632825=中国,青海省,海西蒙古族藏族自治州,大柴旦行政区 +632826=中国,青海省,海西蒙古族藏族自治州,茫崖行政区 +640000=中国,宁夏回族自治区 +640100=中国,宁夏回族自治区,银川市 +640104=中国,宁夏回族自治区,银川市,兴庆区 +640105=中国,宁夏回族自治区,银川市,西夏区 +640106=中国,宁夏回族自治区,银川市,金凤区 +640121=中国,宁夏回族自治区,银川市,永宁县 +640122=中国,宁夏回族自治区,银川市,贺兰县 +640181=中国,宁夏回族自治区,银川市,灵武市 +640200=中国,宁夏回族自治区,石嘴山市 +640202=中国,宁夏回族自治区,石嘴山市,大武口区 +640205=中国,宁夏回族自治区,石嘴山市,惠农区 +640221=中国,宁夏回族自治区,石嘴山市,平罗县 +640300=中国,宁夏回族自治区,吴忠市 +640302=中国,宁夏回族自治区,吴忠市,利通区 +640303=中国,宁夏回族自治区,吴忠市,红寺堡区 +640323=中国,宁夏回族自治区,吴忠市,盐池县 +640324=中国,宁夏回族自治区,吴忠市,同心县 +640381=中国,宁夏回族自治区,吴忠市,青铜峡市 +640400=中国,宁夏回族自治区,固原市 +640402=中国,宁夏回族自治区,固原市,原州区 +640422=中国,宁夏回族自治区,固原市,西吉县 +640423=中国,宁夏回族自治区,固原市,隆德县 +640424=中国,宁夏回族自治区,固原市,泾源县 +640425=中国,宁夏回族自治区,固原市,彭阳县 +640500=中国,宁夏回族自治区,中卫市 +640502=中国,宁夏回族自治区,中卫市,沙坡头区 +640521=中国,宁夏回族自治区,中卫市,中宁县 +640522=中国,宁夏回族自治区,中卫市,海原县 +650000=中国,新疆维吾尔自治区 +650100=中国,新疆维吾尔自治区,乌鲁木齐市 +650102=中国,新疆维吾尔自治区,乌鲁木齐市,天山区 +650103=中国,新疆维吾尔自治区,乌鲁木齐市,沙依巴克区 +650104=中国,新疆维吾尔自治区,乌鲁木齐市,新市区 +650105=中国,新疆维吾尔自治区,乌鲁木齐市,水磨沟区 +650106=中国,新疆维吾尔自治区,乌鲁木齐市,头屯河区 +650107=中国,新疆维吾尔自治区,乌鲁木齐市,达坂城区 +650109=中国,新疆维吾尔自治区,乌鲁木齐市,米东区 +650121=中国,新疆维吾尔自治区,乌鲁木齐市,乌鲁木齐县 +650200=中国,新疆维吾尔自治区,克拉玛依市 +650202=中国,新疆维吾尔自治区,克拉玛依市,独山子区 +650203=中国,新疆维吾尔自治区,克拉玛依市,克拉玛依区 +650204=中国,新疆维吾尔自治区,克拉玛依市,白碱滩区 +650205=中国,新疆维吾尔自治区,克拉玛依市,乌尔禾区 +650400=中国,新疆维吾尔自治区,吐鲁番市 +650402=中国,新疆维吾尔自治区,吐鲁番市,高昌区 +650421=中国,新疆维吾尔自治区,吐鲁番市,鄯善县 +650422=中国,新疆维吾尔自治区,吐鲁番市,托克逊县 +650500=中国,新疆维吾尔自治区,哈密市 +650502=中国,新疆维吾尔自治区,哈密市,伊州区 +650521=中国,新疆维吾尔自治区,哈密市,巴里坤哈萨克自治县 +650522=中国,新疆维吾尔自治区,哈密市,伊吾县 +652300=中国,新疆维吾尔自治区,昌吉回族自治州 +652301=中国,新疆维吾尔自治区,昌吉回族自治州,昌吉市 +652302=中国,新疆维吾尔自治区,昌吉回族自治州,阜康市 +652323=中国,新疆维吾尔自治区,昌吉回族自治州,呼图壁县 +652324=中国,新疆维吾尔自治区,昌吉回族自治州,玛纳斯县 +652325=中国,新疆维吾尔自治区,昌吉回族自治州,奇台县 +652327=中国,新疆维吾尔自治区,昌吉回族自治州,吉木萨尔县 +652328=中国,新疆维吾尔自治区,昌吉回族自治州,木垒哈萨克自治县 +652700=中国,新疆维吾尔自治区,博尔塔拉蒙古自治州 +652701=中国,新疆维吾尔自治区,博尔塔拉蒙古自治州,博乐市 +652702=中国,新疆维吾尔自治区,博尔塔拉蒙古自治州,阿拉山口市 +652722=中国,新疆维吾尔自治区,博尔塔拉蒙古自治州,精河县 +652723=中国,新疆维吾尔自治区,博尔塔拉蒙古自治州,温泉县 +652800=中国,新疆维吾尔自治区,巴音郭楞蒙古自治州 +652801=中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,库尔勒市 +652822=中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,轮台县 +652823=中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,尉犁县 +652824=中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,若羌县 +652825=中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,且末县 +652826=中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,焉耆回族自治县 +652827=中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,和静县 +652828=中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,和硕县 +652829=中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,博湖县 +652900=中国,新疆维吾尔自治区,阿克苏地区 +652901=中国,新疆维吾尔自治区,阿克苏地区,阿克苏市 +652922=中国,新疆维吾尔自治区,阿克苏地区,温宿县 +652923=中国,新疆维吾尔自治区,阿克苏地区,库车县 +652924=中国,新疆维吾尔自治区,阿克苏地区,沙雅县 +652925=中国,新疆维吾尔自治区,阿克苏地区,新和县 +652926=中国,新疆维吾尔自治区,阿克苏地区,拜城县 +652927=中国,新疆维吾尔自治区,阿克苏地区,乌什县 +652928=中国,新疆维吾尔自治区,阿克苏地区,阿瓦提县 +652929=中国,新疆维吾尔自治区,阿克苏地区,柯坪县 +653000=中国,新疆维吾尔自治区,克孜勒苏柯尔克孜自治州 +653001=中国,新疆维吾尔自治区,克孜勒苏柯尔克孜自治州,阿图什市 +653022=中国,新疆维吾尔自治区,克孜勒苏柯尔克孜自治州,阿克陶县 +653023=中国,新疆维吾尔自治区,克孜勒苏柯尔克孜自治州,阿合奇县 +653024=中国,新疆维吾尔自治区,克孜勒苏柯尔克孜自治州,乌恰县 +653100=中国,新疆维吾尔自治区,喀什地区 +653101=中国,新疆维吾尔自治区,喀什地区,喀什市 +653121=中国,新疆维吾尔自治区,喀什地区,疏附县 +653122=中国,新疆维吾尔自治区,喀什地区,疏勒县 +653123=中国,新疆维吾尔自治区,喀什地区,英吉沙县 +653124=中国,新疆维吾尔自治区,喀什地区,泽普县 +653125=中国,新疆维吾尔自治区,喀什地区,莎车县 +653126=中国,新疆维吾尔自治区,喀什地区,叶城县 +653127=中国,新疆维吾尔自治区,喀什地区,麦盖提县 +653128=中国,新疆维吾尔自治区,喀什地区,岳普湖县 +653129=中国,新疆维吾尔自治区,喀什地区,伽师县 +653130=中国,新疆维吾尔自治区,喀什地区,巴楚县 +653131=中国,新疆维吾尔自治区,喀什地区,塔什库尔干塔吉克自治县 +653200=中国,新疆维吾尔自治区,和田地区 +653201=中国,新疆维吾尔自治区,和田地区,和田市 +653221=中国,新疆维吾尔自治区,和田地区,和田县 +653222=中国,新疆维吾尔自治区,和田地区,墨玉县 +653223=中国,新疆维吾尔自治区,和田地区,皮山县 +653224=中国,新疆维吾尔自治区,和田地区,洛浦县 +653225=中国,新疆维吾尔自治区,和田地区,策勒县 +653226=中国,新疆维吾尔自治区,和田地区,于田县 +653227=中国,新疆维吾尔自治区,和田地区,民丰县 +654000=中国,新疆维吾尔自治区,伊犁哈萨克自治州 +654002=中国,新疆维吾尔自治区,伊犁哈萨克自治州,伊宁市 +654003=中国,新疆维吾尔自治区,伊犁哈萨克自治州,奎屯市 +654004=中国,新疆维吾尔自治区,伊犁哈萨克自治州,霍尔果斯市 +654021=中国,新疆维吾尔自治区,伊犁哈萨克自治州,伊宁县 +654022=中国,新疆维吾尔自治区,伊犁哈萨克自治州,察布查尔锡伯自治县 +654023=中国,新疆维吾尔自治区,伊犁哈萨克自治州,霍城县 +654024=中国,新疆维吾尔自治区,伊犁哈萨克自治州,巩留县 +654025=中国,新疆维吾尔自治区,伊犁哈萨克自治州,新源县 +654026=中国,新疆维吾尔自治区,伊犁哈萨克自治州,昭苏县 +654027=中国,新疆维吾尔自治区,伊犁哈萨克自治州,特克斯县 +654028=中国,新疆维吾尔自治区,伊犁哈萨克自治州,尼勒克县 +654200=中国,新疆维吾尔自治区,塔城地区 +654201=中国,新疆维吾尔自治区,塔城地区,塔城市 +654202=中国,新疆维吾尔自治区,塔城地区,乌苏市 +654221=中国,新疆维吾尔自治区,塔城地区,额敏县 +654223=中国,新疆维吾尔自治区,塔城地区,沙湾县 +654224=中国,新疆维吾尔自治区,塔城地区,托里县 +654225=中国,新疆维吾尔自治区,塔城地区,裕民县 +654226=中国,新疆维吾尔自治区,塔城地区,和布克赛尔蒙古自治县 +654300=中国,新疆维吾尔自治区,阿勒泰地区 +654301=中国,新疆维吾尔自治区,阿勒泰地区,阿勒泰市 +654321=中国,新疆维吾尔自治区,阿勒泰地区,布尔津县 +654322=中国,新疆维吾尔自治区,阿勒泰地区,富蕴县 +654323=中国,新疆维吾尔自治区,阿勒泰地区,福海县 +654324=中国,新疆维吾尔自治区,阿勒泰地区,哈巴河县 +654325=中国,新疆维吾尔自治区,阿勒泰地区,青河县 +654326=中国,新疆维吾尔自治区,阿勒泰地区,吉木乃县 +659001=中国,新疆维吾尔自治区,石河子市,石河子市 +659002=中国,新疆维吾尔自治区,阿拉尔市,阿拉尔市 +659003=中国,新疆维吾尔自治区,图木舒克市,图木舒克市 +659004=中国,新疆维吾尔自治区,五家渠市,五家渠市 +659005=中国,新疆维吾尔自治区,北屯市,北屯市 +659006=中国,新疆维吾尔自治区,铁门关市,铁门关市 +659007=中国,新疆维吾尔自治区,双河市,双河市 +659008=中国,新疆维吾尔自治区,可克达拉市,可克达拉市 +659009=中国,新疆维吾尔自治区,昆玉市,昆玉市 +710000=中国,台湾省 +710100=中国,台湾省,台北市 +710101=中国,台湾省,台北市,中正区 +710102=中国,台湾省,台北市,大同区 +710103=中国,台湾省,台北市,中山区 +710104=中国,台湾省,台北市,松山区 +710105=中国,台湾省,台北市,大安区 +710106=中国,台湾省,台北市,万华区 +710107=中国,台湾省,台北市,信义区 +710108=中国,台湾省,台北市,士林区 +710109=中国,台湾省,台北市,北投区 +710110=中国,台湾省,台北市,内湖区 +710111=中国,台湾省,台北市,南港区 +710112=中国,台湾省,台北市,文山区 +710200=中国,台湾省,高雄市 +710201=中国,台湾省,高雄市,新兴区 +710202=中国,台湾省,高雄市,前金区 +710203=中国,台湾省,高雄市,苓雅区 +710204=中国,台湾省,高雄市,盐埕区 +710205=中国,台湾省,高雄市,鼓山区 +710206=中国,台湾省,高雄市,旗津区 +710207=中国,台湾省,高雄市,前镇区 +710208=中国,台湾省,高雄市,三民区 +710209=中国,台湾省,高雄市,左营区 +710210=中国,台湾省,高雄市,楠梓区 +710211=中国,台湾省,高雄市,小港区 +710242=中国,台湾省,高雄市,仁武区 +710243=中国,台湾省,高雄市,大社区 +710244=中国,台湾省,高雄市,冈山区 +710245=中国,台湾省,高雄市,路竹区 +710246=中国,台湾省,高雄市,阿莲区 +710247=中国,台湾省,高雄市,田寮区 +710248=中国,台湾省,高雄市,燕巢区 +710249=中国,台湾省,高雄市,桥头区 +710250=中国,台湾省,高雄市,梓官区 +710251=中国,台湾省,高雄市,弥陀区 +710252=中国,台湾省,高雄市,永安区 +710253=中国,台湾省,高雄市,湖内区 +710254=中国,台湾省,高雄市,凤山区 +710255=中国,台湾省,高雄市,大寮区 +710256=中国,台湾省,高雄市,林园区 +710257=中国,台湾省,高雄市,鸟松区 +710258=中国,台湾省,高雄市,大树区 +710259=中国,台湾省,高雄市,旗山区 +710260=中国,台湾省,高雄市,美浓区 +710261=中国,台湾省,高雄市,六龟区 +710262=中国,台湾省,高雄市,内门区 +710263=中国,台湾省,高雄市,杉林区 +710264=中国,台湾省,高雄市,甲仙区 +710265=中国,台湾省,高雄市,桃源区 +710266=中国,台湾省,高雄市,那玛夏区 +710267=中国,台湾省,高雄市,茂林区 +710268=中国,台湾省,高雄市,茄萣区 +710300=中国,台湾省,台南市 +710301=中国,台湾省,台南市,中西区 +710302=中国,台湾省,台南市,东区 +710303=中国,台湾省,台南市,南区 +710304=中国,台湾省,台南市,北区 +710305=中国,台湾省,台南市,安平区 +710306=中国,台湾省,台南市,安南区 +710339=中国,台湾省,台南市,永康区 +710340=中国,台湾省,台南市,归仁区 +710341=中国,台湾省,台南市,新化区 +710342=中国,台湾省,台南市,左镇区 +710343=中国,台湾省,台南市,玉井区 +710344=中国,台湾省,台南市,楠西区 +710345=中国,台湾省,台南市,南化区 +710346=中国,台湾省,台南市,仁德区 +710347=中国,台湾省,台南市,关庙区 +710348=中国,台湾省,台南市,龙崎区 +710349=中国,台湾省,台南市,官田区 +710350=中国,台湾省,台南市,麻豆区 +710351=中国,台湾省,台南市,佳里区 +710352=中国,台湾省,台南市,西港区 +710353=中国,台湾省,台南市,七股区 +710354=中国,台湾省,台南市,将军区 +710355=中国,台湾省,台南市,学甲区 +710356=中国,台湾省,台南市,北门区 +710357=中国,台湾省,台南市,新营区 +710358=中国,台湾省,台南市,后壁区 +710359=中国,台湾省,台南市,白河区 +710360=中国,台湾省,台南市,东山区 +710361=中国,台湾省,台南市,六甲区 +710362=中国,台湾省,台南市,下营区 +710363=中国,台湾省,台南市,柳营区 +710364=中国,台湾省,台南市,盐水区 +710365=中国,台湾省,台南市,善化区 +710366=中国,台湾省,台南市,大内区 +710367=中国,台湾省,台南市,山上区 +710368=中国,台湾省,台南市,新市区 +710369=中国,台湾省,台南市,安定区 +710400=中国,台湾省,台中市 +710401=中国,台湾省,台中市,中区 +710402=中国,台湾省,台中市,东区 +710403=中国,台湾省,台中市,南区 +710404=中国,台湾省,台中市,西区 +710405=中国,台湾省,台中市,北区 +710406=中国,台湾省,台中市,北屯区 +710407=中国,台湾省,台中市,西屯区 +710408=中国,台湾省,台中市,南屯区 +710431=中国,台湾省,台中市,太平区 +710432=中国,台湾省,台中市,大里区 +710433=中国,台湾省,台中市,雾峰区 +710434=中国,台湾省,台中市,乌日区 +710435=中国,台湾省,台中市,丰原区 +710436=中国,台湾省,台中市,后里区 +710437=中国,台湾省,台中市,石冈区 +710438=中国,台湾省,台中市,东势区 +710439=中国,台湾省,台中市,和平区 +710440=中国,台湾省,台中市,新社区 +710441=中国,台湾省,台中市,潭子区 +710442=中国,台湾省,台中市,大雅区 +710443=中国,台湾省,台中市,神冈区 +710444=中国,台湾省,台中市,大肚区 +710445=中国,台湾省,台中市,沙鹿区 +710446=中国,台湾省,台中市,龙井区 +710447=中国,台湾省,台中市,梧栖区 +710448=中国,台湾省,台中市,清水区 +710449=中国,台湾省,台中市,大甲区 +710450=中国,台湾省,台中市,外埔区 +710451=中国,台湾省,台中市,大安区 +710600=中国,台湾省,南投县 +710614=中国,台湾省,南投县,南投市 +710615=中国,台湾省,南投县,中寮乡 +710616=中国,台湾省,南投县,草屯镇 +710617=中国,台湾省,南投县,国姓乡 +710618=中国,台湾省,南投县,埔里镇 +710619=中国,台湾省,南投县,仁爱乡 +710620=中国,台湾省,南投县,名间乡 +710621=中国,台湾省,南投县,集集镇 +710622=中国,台湾省,南投县,水里乡 +710623=中国,台湾省,南投县,鱼池乡 +710624=中国,台湾省,南投县,信义乡 +710625=中国,台湾省,南投县,竹山镇 +710626=中国,台湾省,南投县,鹿谷乡 +710700=中国,台湾省,基隆市 +710701=中国,台湾省,基隆市,仁爱区 +710702=中国,台湾省,基隆市,信义区 +710703=中国,台湾省,基隆市,中正区 +710704=中国,台湾省,基隆市,中山区 +710705=中国,台湾省,基隆市,安乐区 +710706=中国,台湾省,基隆市,暖暖区 +710707=中国,台湾省,基隆市,七堵区 +710800=中国,台湾省,新竹市 +710801=中国,台湾省,新竹市,东区 +710802=中国,台湾省,新竹市,北区 +710803=中国,台湾省,新竹市,香山区 +710900=中国,台湾省,嘉义市 +710901=中国,台湾省,嘉义市,东区 +710902=中国,台湾省,嘉义市,西区 +711100=中国,台湾省,新北市 +711130=中国,台湾省,新北市,万里区 +711131=中国,台湾省,新北市,金山区 +711132=中国,台湾省,新北市,板桥区 +711133=中国,台湾省,新北市,汐止区 +711134=中国,台湾省,新北市,深坑区 +711135=中国,台湾省,新北市,石碇区 +711136=中国,台湾省,新北市,瑞芳区 +711137=中国,台湾省,新北市,平溪区 +711138=中国,台湾省,新北市,双溪区 +711139=中国,台湾省,新北市,贡寮区 +711140=中国,台湾省,新北市,新店区 +711141=中国,台湾省,新北市,坪林区 +711142=中国,台湾省,新北市,乌来区 +711143=中国,台湾省,新北市,永和区 +711144=中国,台湾省,新北市,中和区 +711145=中国,台湾省,新北市,土城区 +711146=中国,台湾省,新北市,三峡区 +711147=中国,台湾省,新北市,树林区 +711148=中国,台湾省,新北市,莺歌区 +711149=中国,台湾省,新北市,三重区 +711150=中国,台湾省,新北市,新庄区 +711151=中国,台湾省,新北市,泰山区 +711152=中国,台湾省,新北市,林口区 +711153=中国,台湾省,新北市,芦洲区 +711154=中国,台湾省,新北市,五股区 +711155=中国,台湾省,新北市,八里区 +711156=中国,台湾省,新北市,淡水区 +711157=中国,台湾省,新北市,三芝区 +711158=中国,台湾省,新北市,石门区 +711200=中国,台湾省,宜兰县 +711214=中国,台湾省,宜兰县,宜兰市 +711215=中国,台湾省,宜兰县,头城镇 +711216=中国,台湾省,宜兰县,礁溪乡 +711217=中国,台湾省,宜兰县,壮围乡 +711218=中国,台湾省,宜兰县,员山乡 +711219=中国,台湾省,宜兰县,罗东镇 +711220=中国,台湾省,宜兰县,三星乡 +711221=中国,台湾省,宜兰县,大同乡 +711222=中国,台湾省,宜兰县,五结乡 +711223=中国,台湾省,宜兰县,冬山乡 +711224=中国,台湾省,宜兰县,苏澳镇 +711225=中国,台湾省,宜兰县,南澳乡 +711300=中国,台湾省,新竹县 +711314=中国,台湾省,新竹县,竹北市 +711315=中国,台湾省,新竹县,湖口乡 +711316=中国,台湾省,新竹县,新丰乡 +711317=中国,台湾省,新竹县,新埔镇 +711318=中国,台湾省,新竹县,关西镇 +711319=中国,台湾省,新竹县,芎林乡 +711320=中国,台湾省,新竹县,宝山乡 +711321=中国,台湾省,新竹县,竹东镇 +711322=中国,台湾省,新竹县,五峰乡 +711323=中国,台湾省,新竹县,横山乡 +711324=中国,台湾省,新竹县,尖石乡 +711325=中国,台湾省,新竹县,北埔乡 +711326=中国,台湾省,新竹县,峨眉乡 +711400=中国,台湾省,桃园市 +711414=中国,台湾省,桃园市,中坜区 +711415=中国,台湾省,桃园市,平镇区 +711416=中国,台湾省,桃园市,龙潭区 +711417=中国,台湾省,桃园市,杨梅区 +711418=中国,台湾省,桃园市,新屋区 +711419=中国,台湾省,桃园市,观音区 +711420=中国,台湾省,桃园市,桃园区 +711421=中国,台湾省,桃园市,龟山区 +711422=中国,台湾省,桃园市,八德区 +711423=中国,台湾省,桃园市,大溪区 +711424=中国,台湾省,桃园市,复兴区 +711425=中国,台湾省,桃园市,大园区 +711426=中国,台湾省,桃园市,芦竹区 +711500=中国,台湾省,苗栗县 +711519=中国,台湾省,苗栗县,竹南镇 +711520=中国,台湾省,苗栗县,头份市 +711521=中国,台湾省,苗栗县,三湾乡 +711522=中国,台湾省,苗栗县,南庄乡 +711523=中国,台湾省,苗栗县,狮潭乡 +711524=中国,台湾省,苗栗县,后龙镇 +711525=中国,台湾省,苗栗县,通霄镇 +711526=中国,台湾省,苗栗县,苑里镇 +711527=中国,台湾省,苗栗县,苗栗市 +711528=中国,台湾省,苗栗县,造桥乡 +711529=中国,台湾省,苗栗县,头屋乡 +711530=中国,台湾省,苗栗县,公馆乡 +711531=中国,台湾省,苗栗县,大湖乡 +711532=中国,台湾省,苗栗县,泰安乡 +711533=中国,台湾省,苗栗县,铜锣乡 +711534=中国,台湾省,苗栗县,三义乡 +711535=中国,台湾省,苗栗县,西湖乡 +711536=中国,台湾省,苗栗县,卓兰镇 +711700=中国,台湾省,彰化县 +711727=中国,台湾省,彰化县,彰化市 +711728=中国,台湾省,彰化县,芬园乡 +711729=中国,台湾省,彰化县,花坛乡 +711730=中国,台湾省,彰化县,秀水乡 +711731=中国,台湾省,彰化县,鹿港镇 +711732=中国,台湾省,彰化县,福兴乡 +711733=中国,台湾省,彰化县,线西乡 +711734=中国,台湾省,彰化县,和美镇 +711735=中国,台湾省,彰化县,伸港乡 +711736=中国,台湾省,彰化县,员林市 +711737=中国,台湾省,彰化县,社头乡 +711738=中国,台湾省,彰化县,永靖乡 +711739=中国,台湾省,彰化县,埔心乡 +711740=中国,台湾省,彰化县,溪湖镇 +711741=中国,台湾省,彰化县,大村乡 +711742=中国,台湾省,彰化县,埔盐乡 +711743=中国,台湾省,彰化县,田中镇 +711744=中国,台湾省,彰化县,北斗镇 +711745=中国,台湾省,彰化县,田尾乡 +711746=中国,台湾省,彰化县,埤头乡 +711747=中国,台湾省,彰化县,溪州乡 +711748=中国,台湾省,彰化县,竹塘乡 +711749=中国,台湾省,彰化县,二林镇 +711750=中国,台湾省,彰化县,大城乡 +711751=中国,台湾省,彰化县,芳苑乡 +711752=中国,台湾省,彰化县,二水乡 +711900=中国,台湾省,嘉义县 +711919=中国,台湾省,嘉义县,番路乡 +711920=中国,台湾省,嘉义县,梅山乡 +711921=中国,台湾省,嘉义县,竹崎乡 +711922=中国,台湾省,嘉义县,阿里山乡 +711923=中国,台湾省,嘉义县,中埔乡 +711924=中国,台湾省,嘉义县,大埔乡 +711925=中国,台湾省,嘉义县,水上乡 +711926=中国,台湾省,嘉义县,鹿草乡 +711927=中国,台湾省,嘉义县,太保市 +711928=中国,台湾省,嘉义县,朴子市 +711929=中国,台湾省,嘉义县,东石乡 +711930=中国,台湾省,嘉义县,六脚乡 +711931=中国,台湾省,嘉义县,新港乡 +711932=中国,台湾省,嘉义县,民雄乡 +711933=中国,台湾省,嘉义县,大林镇 +711934=中国,台湾省,嘉义县,溪口乡 +711935=中国,台湾省,嘉义县,义竹乡 +711936=中国,台湾省,嘉义县,布袋镇 +712100=中国,台湾省,云林县 +712121=中国,台湾省,云林县,斗南镇 +712122=中国,台湾省,云林县,大埤乡 +712123=中国,台湾省,云林县,虎尾镇 +712124=中国,台湾省,云林县,土库镇 +712125=中国,台湾省,云林县,褒忠乡 +712126=中国,台湾省,云林县,东势乡 +712127=中国,台湾省,云林县,台西乡 +712128=中国,台湾省,云林县,仑背乡 +712129=中国,台湾省,云林县,麦寮乡 +712130=中国,台湾省,云林县,斗六市 +712131=中国,台湾省,云林县,林内乡 +712132=中国,台湾省,云林县,古坑乡 +712133=中国,台湾省,云林县,莿桐乡 +712134=中国,台湾省,云林县,西螺镇 +712135=中国,台湾省,云林县,二仑乡 +712136=中国,台湾省,云林县,北港镇 +712137=中国,台湾省,云林县,水林乡 +712138=中国,台湾省,云林县,口湖乡 +712139=中国,台湾省,云林县,四湖乡 +712140=中国,台湾省,云林县,元长乡 +712400=中国,台湾省,屏东县 +712434=中国,台湾省,屏东县,屏东市 +712435=中国,台湾省,屏东县,三地门乡 +712436=中国,台湾省,屏东县,雾台乡 +712437=中国,台湾省,屏东县,玛家乡 +712438=中国,台湾省,屏东县,九如乡 +712439=中国,台湾省,屏东县,里港乡 +712440=中国,台湾省,屏东县,高树乡 +712441=中国,台湾省,屏东县,盐埔乡 +712442=中国,台湾省,屏东县,长治乡 +712443=中国,台湾省,屏东县,麟洛乡 +712444=中国,台湾省,屏东县,竹田乡 +712445=中国,台湾省,屏东县,内埔乡 +712446=中国,台湾省,屏东县,万丹乡 +712447=中国,台湾省,屏东县,潮州镇 +712448=中国,台湾省,屏东县,泰武乡 +712449=中国,台湾省,屏东县,来义乡 +712450=中国,台湾省,屏东县,万峦乡 +712451=中国,台湾省,屏东县,崁顶乡 +712452=中国,台湾省,屏东县,新埤乡 +712453=中国,台湾省,屏东县,南州乡 +712454=中国,台湾省,屏东县,林边乡 +712455=中国,台湾省,屏东县,东港镇 +712456=中国,台湾省,屏东县,琉球乡 +712457=中国,台湾省,屏东县,佳冬乡 +712458=中国,台湾省,屏东县,新园乡 +712459=中国,台湾省,屏东县,枋寮乡 +712460=中国,台湾省,屏东县,枋山乡 +712461=中国,台湾省,屏东县,春日乡 +712462=中国,台湾省,屏东县,狮子乡 +712463=中国,台湾省,屏东县,车城乡 +712464=中国,台湾省,屏东县,牡丹乡 +712465=中国,台湾省,屏东县,恒春镇 +712466=中国,台湾省,屏东县,满州乡 +712500=中国,台湾省,台东县 +712517=中国,台湾省,台东县,台东市 +712518=中国,台湾省,台东县,绿岛乡 +712519=中国,台湾省,台东县,兰屿乡 +712520=中国,台湾省,台东县,延平乡 +712521=中国,台湾省,台东县,卑南乡 +712522=中国,台湾省,台东县,鹿野乡 +712523=中国,台湾省,台东县,关山镇 +712524=中国,台湾省,台东县,海端乡 +712525=中国,台湾省,台东县,池上乡 +712526=中国,台湾省,台东县,东河乡 +712527=中国,台湾省,台东县,成功镇 +712528=中国,台湾省,台东县,长滨乡 +712529=中国,台湾省,台东县,金峰乡 +712530=中国,台湾省,台东县,大武乡 +712531=中国,台湾省,台东县,达仁乡 +712532=中国,台湾省,台东县,太麻里乡 +712600=中国,台湾省,花莲县 +712615=中国,台湾省,花莲县,花莲市 +712616=中国,台湾省,花莲县,新城乡 +712618=中国,台湾省,花莲县,秀林乡 +712619=中国,台湾省,花莲县,吉安乡 +712620=中国,台湾省,花莲县,寿丰乡 +712621=中国,台湾省,花莲县,凤林镇 +712622=中国,台湾省,花莲县,光复乡 +712623=中国,台湾省,花莲县,丰滨乡 +712624=中国,台湾省,花莲县,瑞穗乡 +712625=中国,台湾省,花莲县,万荣乡 +712626=中国,台湾省,花莲县,玉里镇 +712627=中国,台湾省,花莲县,卓溪乡 +712628=中国,台湾省,花莲县,富里乡 +712700=中国,台湾省,澎湖县 +712707=中国,台湾省,澎湖县,马公市 +712708=中国,台湾省,澎湖县,西屿乡 +712709=中国,台湾省,澎湖县,望安乡 +712710=中国,台湾省,澎湖县,七美乡 +712711=中国,台湾省,澎湖县,白沙乡 +712712=中国,台湾省,澎湖县,湖西乡 +810000=中国,香港特别行政区,香港特别行政区 +810101=中国,香港特别行政区,香港特别行政区,中西区 +810102=中国,香港特别行政区,香港特别行政区,东区 +810103=中国,香港特别行政区,香港特别行政区,九龙城区 +810104=中国,香港特别行政区,香港特别行政区,观塘区 +810105=中国,香港特别行政区,香港特别行政区,南区 +810106=中国,香港特别行政区,香港特别行政区,深水埗区 +810107=中国,香港特别行政区,香港特别行政区,湾仔区 +810108=中国,香港特别行政区,香港特别行政区,黄大仙区 +810109=中国,香港特别行政区,香港特别行政区,油尖旺区 +810110=中国,香港特别行政区,香港特别行政区,离岛区 +810111=中国,香港特别行政区,香港特别行政区,葵青区 +810112=中国,香港特别行政区,香港特别行政区,北区 +810113=中国,香港特别行政区,香港特别行政区,西贡区 +810114=中国,香港特别行政区,香港特别行政区,沙田区 +810115=中国,香港特别行政区,香港特别行政区,屯门区 +810116=中国,香港特别行政区,香港特别行政区,大埔区 +810117=中国,香港特别行政区,香港特别行政区,荃湾区 +810118=中国,香港特别行政区,香港特别行政区,元朗区 +820000=中国,澳门特别行政区,澳门特别行政区 +820101=中国,澳门特别行政区,澳门特别行政区,澳门半岛 +820102=中国,澳门特别行政区,澳门特别行政区,凼仔 +820103=中国,澳门特别行政区,澳门特别行政区,路凼城 +820104=中国,澳门特别行政区,澳门特别行政区,路环 diff --git a/roncoo-pay-service/src/main/resources/alipay_config.properties b/roncoo-pay-service/src/main/resources/alipay_config.properties index b2198d2dd21a7e85fabccf881c795ae8c0d7790a..f58fe1a13e34de76e67262fb14885825a4d38bfc 100644 --- a/roncoo-pay-service/src/main/resources/alipay_config.properties +++ b/roncoo-pay-service/src/main/resources/alipay_config.properties @@ -1,10 +1,10 @@ ################################################# 支付宝分页查询账单配置 ##################################################### #合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm -partner=111111111 +partner=111111111111111 #MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm -key=2222222222 +key=1111111111111111 #支付宝提供给商户的服务接入网关URL(新) alipay_gateway_new=https\://mapi.alipay.com/gateway.do? @@ -19,16 +19,16 @@ log_path=C\:\\ input_charset=utf-8 #收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号 -seller_id=3333333333 +seller_id=1111111111111111 #支付宝消息验证地址 https_verify_url=https\://mapi.alipay.com/gateway.do?service\=notify_verify& #服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 -notify_url=http://roncoo.iok.la/roncoo-pay-web-gateway/scanPayNotify/notify/ALIPAY +notify_url=http://gateway.com/roncoo-pay-web-gateway/scanPayNotify/notify/ALIPAY #页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 -return_url=http://roncoo.iok.la/roncoo-pay-web-gateway/scanPayNotify/result/ALIPAY +return_url=http://gateway/roncoo-pay-web-gateway/scanPayNotify/result/ALIPAY #支付类型 ,无需修改 payment_type=1 @@ -36,3 +36,18 @@ payment_type=1 #调用的接口名,无需修改 service=create_direct_pay_by_user +#支付宝被扫地址 +trade_pay_url = https://openapi.alipay.com/gateway.do + +#支付宝交易查询地址 +trade_query_url = https://openapi.alipay.com/gateway.do + +#appid +app_id = 1111111111111 + +#商户私钥 +mch_private_key =MIIEvwIBADANBgkqha+UviBN6Gz3NcinnR4wERLD7RCO0tM1+B38zziMhbg== + +#支付宝公钥 +ali_public_key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtlhfY21rvqrdKx8V6aKlkJmhb/zJ+5/hbOXesegpaXlc4LJldZuJZ3mX/u8pHwv4duv70X4BQj1K9x7xQzNMMS9KRmDesnAozPFKnz7jmtI6X4Z40Xo6jVQxOijCSDgdmp9p/yRTzFYCNl/p7S//b7T7xo1Bg0YjoIg7c9fELOaNCC7crVX4ogIXgWFQbo9OqDk+rGXD6t//2o7edtUBGn5Er3gSizS4WLgaFG65XrOluEkYfsxuKc/I+KhkaJ76NJiqdE5ArrMkJ2EPBO66JKsuG/3MrSiF2SULJ16FNwurnzxhgC6Ejnwlv108Y/nmTGeLlJwQGd6qiSIVz/W/zwIDAQAB + diff --git a/roncoo-pay-service/src/main/resources/auth_config.properties b/roncoo-pay-service/src/main/resources/auth_config.properties new file mode 100644 index 0000000000000000000000000000000000000000..0a224a74824a376352611dad0e482a9fbca33fa4 --- /dev/null +++ b/roncoo-pay-service/src/main/resources/auth_config.properties @@ -0,0 +1,7 @@ +pay_key=0b6d14db817446c88b115949cb0ebbbd +pay_secret=a0317ca22a0d4de3b4fff94d6827df06 +auth_url=http://gateway.com//auth/init + +auth_order_query_url=http://gateway.com/roncoo-pay-web-gateway/auth/doAuth/ + +auth_amount=0.5 diff --git a/roncoo-pay-service/src/main/resources/banner.txt b/roncoo-pay-service/src/main/resources/banner.txt new file mode 100644 index 0000000000000000000000000000000000000000..f21204a6d16035241c01c01b7d14680f048e6038 --- /dev/null +++ b/roncoo-pay-service/src/main/resources/banner.txt @@ -0,0 +1,9 @@ + + ██████╗ ██████╗ ███╗ ██╗ ██████╗ ██████╗ ██████╗ ██████╗ █████╗ ██╗ ██╗ + ██╔══██╗██╔═══██╗████╗ ██║██╔════╝██╔═══██╗██╔═══██╗ ██╔══██╗██╔══██╗╚██╗ ██╔╝ + ██████╔╝██║ ██║██╔██╗ ██║██║ ██║ ██║██║ ██║ ██████╔╝███████║ ╚████╔╝ + ██╔══██╗██║ ██║██║╚██╗██║██║ ██║ ██║██║ ██║ ██╔═══╝ ██╔══██║ ╚██╔╝ + ██║ ██║╚██████╔╝██║ ╚████║╚██████╗╚██████╔╝╚██████╔╝ ██║ ██║ ██║ ██║ + ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ + + \ No newline at end of file diff --git a/roncoo-pay-service/src/main/resources/jdbc.properties b/roncoo-pay-service/src/main/resources/jdbc.properties index 5417ef2f87d02b633fc3e4a27054a3625d5c66df..0332e109481aad21c8fac829c57ebb4e384b03f5 100644 --- a/roncoo-pay-service/src/main/resources/jdbc.properties +++ b/roncoo-pay-service/src/main/resources/jdbc.properties @@ -1,14 +1,13 @@ jdbc.driver=com.mysql.jdbc.Driver -jdbc.url=jdbc:mysql://192.168.1.215:3306/roncoo_mini_pay_dev?useUnicode=true&characterEncoding=UTF-8 +jdbc.url=jdbc:mysql://127.0.0.1:3306/roncoo_mini_pay_demo?useUnicode=true&characterEncoding=UTF-8 jdbc.username=root -jdbc.password=www.roncoo.com - +jdbc.password=xxxxxxx #初始化连接大小 jdbc.initialSize=0 -#连接池最大数量 +#连接池最大数量 jdbc.maxActive=20 #连接池最小空闲 jdbc.minIdle=1 #获取连接最大等待时间 -jdbc.maxWait=60000 \ No newline at end of file +jdbc.maxWait=60000 diff --git a/roncoo-pay-service/src/main/resources/log4j.properties b/roncoo-pay-service/src/main/resources/log4j.properties deleted file mode 100644 index bafbbc5dbd96f6100ef4bb73f27364fe4fda4b66..0000000000000000000000000000000000000000 --- a/roncoo-pay-service/src/main/resources/log4j.properties +++ /dev/null @@ -1,32 +0,0 @@ -#定义LOG输出级别 -log4j.rootLogger=INFO,Console,File - -#log4j.rootLogger=DEBUG,INFO,Console,File -#定义日志输出目的地为控制台 -log4j.appender.Console=org.apache.log4j.ConsoleAppender -log4j.appender.Console.Target=System.out -log4j.appender.Console.layout = org.apache.log4j.PatternLayout -log4j.appender.Console.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%C{1}\:%L] %m%n - -#文件大小到达指定尺寸的时候产生一个新的文件 -log4j.appender.File = org.apache.log4j.RollingFileAppender -log4j.appender.File.File = logs/ -log4j.appender.File.DatePattern='-'yyyy-MM-dd'.log' -log4j.appender.File.Threshold=info -log4j.appender.File.layout=org.apache.log4j.PatternLayout -log4j.appender.File.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%C{1}\:%L] %m%n - -#定义文件最大大小 -log4j.appender.File.MaxFileSize = 10MB -log4j.appender.File.Threshold = ALL -log4j.appender.File.layout = org.apache.log4j.PatternLayout -log4j.appender.File.layout.ConversionPattern =[%-5p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%C{1}\:%L] %m%n - -###显示SQL语句部分 -#log4j.logger.com.ibatis=DEBUG -#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG -#log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG -#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG -#log4j.logger.java.sql.Connection=DEBUG -#log4j.logger.java.sql.Statement=DEBUG -#log4j.logger.java.sql.PreparedStatement=DEBUG diff --git a/roncoo-pay-service/src/main/resources/mq_config.properties b/roncoo-pay-service/src/main/resources/mq_config.properties index adcb93469c8750e22705672ea2b18db17159333f..0d3de8714e8c217aecf2b4e6b1f7e662779a19cb 100644 --- a/roncoo-pay-service/src/main/resources/mq_config.properties +++ b/roncoo-pay-service/src/main/resources/mq_config.properties @@ -1,8 +1,10 @@ ## MQ -mq.brokerURL=failover\:(tcp\://192.168.1.81\:51511,tcp\://192.168.1.82\:51512,tcp\://192.168.1.83\:51513)?randomize\=false&initialReconnectDelay\=1000&maxReconnectDelay\=30000 -mq.userName=admin -mq.password=admin +mq.brokerURL=failover\:(tcp\://127.0.0.1\:61616)?randomize\=false&initialReconnectDelay\=1000&maxReconnectDelay\=30000 +mq.userName=roncoo_demo +mq.password=xxxxxxx mq.pool.maxConnections=20 -tradeQueueName.notify=tradeNotify \ No newline at end of file +tradeQueueName.notify=opensource_demo_tradeNotify + +orderQueryQueueName.query=opensource_demo_orderQuery diff --git a/roncoo-pay-service/src/main/resources/mybatis/mapper/auth/RpUserBankAuthMapper.xml b/roncoo-pay-service/src/main/resources/mybatis/mapper/auth/RpUserBankAuthMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..11d450aa5d04b0ee3c573092939fb729abe2fdf7 --- /dev/null +++ b/roncoo-pay-service/src/main/resources/mybatis/mapper/auth/RpUserBankAuthMapper.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + id, create_time, edit_time, version, merchant_no, pay_order_no, user_name, phone, id_no, bank_account_no, status, remark + + + + rp_user_bank_auth + + + + INSERT INTO + + + + + + #{id,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{editTime,jdbcType=TIMESTAMP}, + #{version,jdbcType=BIGINT}, + #{merchantNo,jdbcType=VARCHAR}, #{payOrderNo,jdbcType=VARCHAR}, #{userName,jdbcType=VARCHAR}, + #{phone,jdbcType=VARCHAR}, #{idNo,jdbcType=VARCHAR}, + #{bankAccountNo,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR} + + + + + + + + + UPDATE + + SET + + + edit_time = #{editTime,jdbcType=TIMESTAMP}, + + + user_name = #{userName,jdbcType=VARCHAR}, + + + phone = #{phone,jdbcType=VARCHAR}, + + + id_no = #{idNo,jdbcType=VARCHAR}, + + + bank_account_no = #{bankAccountNo,jdbcType=VARCHAR}, + + + status = #{status,jdbcType=VARCHAR}, + + + remark = #{remark,jdbcType=VARCHAR}, + + + WHERE id = #{id,jdbcType=VARCHAR} + + + + and user_name = #{userName,jdbcType=VARCHAR} + and phone = #{phone,jdbcType=VARCHAR} + and id_no = #{idNo,jdbcType=VARCHAR} + and bank_account_no = + #{bankAccountNo,jdbcType=VARCHAR} + + + + + \ No newline at end of file diff --git a/roncoo-pay-service/src/main/resources/mybatis/mapper/trade/RpMicroSubmitRecordMapper.xml b/roncoo-pay-service/src/main/resources/mybatis/mapper/trade/RpMicroSubmitRecordMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..207208507f2abc7c0a4b184f0eaca09715a18cbe --- /dev/null +++ b/roncoo-pay-service/src/main/resources/mybatis/mapper/trade/RpMicroSubmitRecordMapper.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rp_micro_submit_record + + + + + id, version, create_time, creater, edit_time, editor, status, business_code, sub_mch_id, id_card_copy, + id_card_national, id_card_name, id_card_number, id_card_valid_time, account_bank, + bank_address_code, account_number, store_name, store_address_code, store_street, + store_entrance_pic, indoor_pic, merchant_shortname, service_phone, product_desc, rate, contact_phone + + + + + and id_card_name like CONCAT('%',CONCAT(#{idCardName,jdbcType=VARCHAR},'%')) + and store_name like CONCAT('%',CONCAT(#{storeName,jdbcType=VARCHAR},'%')) + and business_code = #{businessCode,jdbcType=VARCHAR} + + + + + + + + + + + + + + + + + insert into + + + + + + #{id,jdbcType=VARCHAR}, + #{version,jdbcType=INTEGER}, + #{createTime,jdbcType=TIMESTAMP}, + #{creater,jdbcType=VARCHAR}, + #{editTime, jdbcType=TIMESTAMP}, + #{editor,jdbcType=VARCHAR}, + #{status,jdbcType=VARCHAR}, + #{businessCode,jdbcType=VARCHAR}, + #{subMchId,jdbcType=VARCHAR}, + #{idCardCopy,jdbcType=VARCHAR}, + #{idCardNational,jdbcType=VARCHAR}, + #{idCardName,jdbcType=VARCHAR}, + #{idCardNumber,jdbcType=VARCHAR}, + #{idCardValidTime,jdbcType=VARCHAR}, + #{accountBank,jdbcType=VARCHAR}, + #{bankAddressCode,jdbcType=VARCHAR}, + #{accountNumber,jdbcType=VARCHAR}, + #{storeName,jdbcType=VARCHAR}, + #{storeAddressCode,jdbcType=VARCHAR}, + #{storeStreet,jdbcType=VARCHAR}, + #{storeEntrancePic,jdbcType=VARCHAR}, + #{indoorPic,jdbcType=VARCHAR}, + #{merchantShortname,jdbcType=VARCHAR}, + #{servicePhone,jdbcType=VARCHAR}, + #{productDesc,jdbcType=VARCHAR}, + #{rate,jdbcType=VARCHAR}, + #{contactPhone,jdbcType=VARCHAR} + + + + + + delete from + + where id = #{id,jdbcType=VARCHAR} + + + + + update + + set + version = #{version,jdbcType=INTEGER}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + creater = #{creater,jdbcType=VARCHAR}, + edit_time = #{editTime, jdbcType=TIMESTAMP}, + editor = #{editor,jdbcType=VARCHAR}, + status = #{status,jdbcType=VARCHAR}, + business_code = #{businessCode,jdbcType=VARCHAR}, + sub_mch_id = #{subMchId,jdbcType=VARCHAR}, + id_card_copy = #{idCardCopy,jdbcType=VARCHAR}, + id_card_national = #{idCardNational,jdbcType=VARCHAR}, + id_card_name = #{idCardName,jdbcType=VARCHAR}, + id_card_number = #{idCardNumber,jdbcType=VARCHAR}, + id_card_valid_time = #{idCardValidTime,jdbcType=VARCHAR}, + account_bank = #{accountBank,jdbcType=VARCHAR}, + bank_address_code = #{bankAddressCode,jdbcType=VARCHAR}, + account_number = #{accountNumber,jdbcType=VARCHAR}, + store_name = #{storeName,jdbcType=VARCHAR}, + store_address_code = #{storeAddressCode,jdbcType=VARCHAR}, + store_street = #{storeStreet,jdbcType=VARCHAR}, + store_entrance_pic = #{storeEntrancePic,jdbcType=VARCHAR}, + indoor_pic = #{indoorPic,jdbcType=VARCHAR}, + merchant_shortname = #{merchantShortname,jdbcType=VARCHAR}, + service_phone = #{servicePhone,jdbcType=VARCHAR}, + product_desc = #{productDesc,jdbcType=VARCHAR}, + rate = #{rate,jdbcType=VARCHAR}, + contact_phone = #{contactPhone,jdbcType=VARCHAR} + where id = #{id,jdbcType=VARCHAR} + + + \ No newline at end of file diff --git a/roncoo-pay-service/src/main/resources/mybatis/mapper/trade/RpTradePaymentRecordMapper.xml b/roncoo-pay-service/src/main/resources/mybatis/mapper/trade/RpTradePaymentRecordMapper.xml index d70d0ced0b5e4cf8b4a4402917747ec05cf2e682..a5b7a6a135bf76e97509d57f3bbb20d3426afcf0 100644 --- a/roncoo-pay-service/src/main/resources/mybatis/mapper/trade/RpTradePaymentRecordMapper.xml +++ b/roncoo-pay-service/src/main/resources/mybatis/mapper/trade/RpTradePaymentRecordMapper.xml @@ -235,4 +235,21 @@ + + + + \ No newline at end of file diff --git a/roncoo-pay-service/src/main/resources/mybatis/mapper/user/BuildNoMapper.xml b/roncoo-pay-service/src/main/resources/mybatis/mapper/user/BuildNoMapper.xml deleted file mode 100644 index 7aec710bd98e16b3372dc5dda9ae7f4f4f3132b9..0000000000000000000000000000000000000000 --- a/roncoo-pay-service/src/main/resources/mybatis/mapper/user/BuildNoMapper.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/roncoo-pay-service/src/main/resources/mybatis/mapper/user/RpUserInfoMapper.xml b/roncoo-pay-service/src/main/resources/mybatis/mapper/user/RpUserInfoMapper.xml index edc674067cb4ea0d9f0ceac4a863cfab834b1adc..582ab7634df8972aec548fc5a4fae8084fade313 100644 --- a/roncoo-pay-service/src/main/resources/mybatis/mapper/user/RpUserInfoMapper.xml +++ b/roncoo-pay-service/src/main/resources/mybatis/mapper/user/RpUserInfoMapper.xml @@ -8,9 +8,12 @@ + + + - id, create_time, status, user_no, user_name, account_no + id, create_time, status, user_no, user_name, account_no, mobile, password, pay_pwd diff --git a/roncoo-pay-service/src/main/resources/mybatis/mapper/user/RpUserPayConfigMapper.xml b/roncoo-pay-service/src/main/resources/mybatis/mapper/user/RpUserPayConfigMapper.xml index a5352a3857a538dce0834a4ee5002d7bcc57b7f8..c9b00466540f5a7b03308d75f78d2ef5057dea83 100644 --- a/roncoo-pay-service/src/main/resources/mybatis/mapper/user/RpUserPayConfigMapper.xml +++ b/roncoo-pay-service/src/main/resources/mybatis/mapper/user/RpUserPayConfigMapper.xml @@ -18,11 +18,13 @@ + + id, create_time, edit_time, version, remark, status, audit_status, is_auto_sett, product_code, product_name, user_no, user_name, risk_day, pay_key, fund_into_type, - pay_secret + pay_secret ,security_rating , merchant_server_ip '}}a=a+"";$("body").append(a);document.getElementById("temp_form_id").submit()}function notifyMerchant(){if(document.getElementById("temp_form_id")){$("#temp_form_id").remove()}var b='
';if(syncParam.indexOf("&")>0){var d=syncParam.split("&");for(var c=0;c'}}else{var a=syncParam.indexOf("=");b=b+''}b=b+"";$("body").append(b);document.getElementById("temp_form_id").submit()}var pageBackOut=false;var closeDialogShow=false;var closeDialog;function pageBack(){if(pageBackOut){if(typeof(pageBackOut)=="function"){pageBackOut();return}}if(loading){loadingClose();return}if(vpage.length==0){if(closeDialogShow){if(closeDialog){closeDialog.close();closeDialog=null;closeDialogShow=false}return}closeDialogShow=true;closeDialog=zConfirm("确认","订单还未支付,您确定要离开吗?","确认","继续",function(){notifyMerchant();closeDialogShow=false},function(){closeDialogShow=false});return}var b=vpage.pop();b.show();var a=getLastPage();a.remove();vcheck.pop();vform.pop()}function pluginInitOnLoad(){}function A100Wait(a){if("A100"==a){var b=function(c){if(c<=0){pageBackOut=null;if(loading){loading.close();loading=null}$page.find(".vform").submit();return false}if(loading){loading.close()}loading=zLoading("系统繁忙,稍后再试
倒计时("+c--+")");$(loading.domElem(".img")).remove();setTimeout(function(){b(c)},1000)};b(A100WaitTime)}};var $keybordType=null;var $inputEle=null;var $placeholder=null;var $checkFunction=null;var $page=null;var $errorMsg=null;var $maxLen=null;var $minLen=null;var $pwdDirectEnc=null;function numberKeybord(b){$inputEle=b._this;$keybordType=b.keybordType;$placeholder=b.placeholder;$checkFunction=b.checkFunction;$page=b._page;$errorMsg=b.errorMsg;$maxLen=b.maxLen;$minLen=b.minLen;if($keybordType==undefined||typeof $keybordType=="undefined"){$keybordType="idNum"}if($checkFunction==undefined||typeof $checkFunction=="undefined"){$checkFunction=function(c){return true}}if(window.orientation===90||window.orientation===-90){_initUI2()}else{_initUI()}var a=$($inputEle).val();if(a!=""){$page.find(".key-input").val(a)}keyDown();$($inputEle).blur()}var $dnaOrderId=null;var $currDate=null;var _currYear=null;var _currMonth=null;function pwdKeybord(a){$inputEle=a._this;$keybordType=a.keybordType;$placeholder=a.placeholder;$checkFunction=a.checkFunction;$page=a._page;$errorMsg=a.errorMsg;$dnaOrderId=a.dnaOrderId;$currDate=a.currDate;$maxLen=a.maxLen;$minLen=a.minLen;$pwdDirectEnc=a.pwdDirectEnc;if($keybordType==undefined||typeof $keybordType=="undefined"){$keybordType="cardPwd"}if($checkFunction==undefined||typeof $checkFunction=="undefined"){$checkFunction=function(b){return true}}if(window.orientation===90||window.orientation===-90){_initUI2()}else{_initUI()}keyDown();$($inputEle).blur()}function _initUI(){var e="";if($keybordType=="idNum"){e='
确定
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • X
  • 0
  •  
'}else{if($keybordType=="accCard"){e='
确定
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • X
  • 0
  •  
'}else{if($keybordType=="cardPwd"){var c=[0,1,2,3,4,5,6,7,8,9];c.sort(function(){return 0.5-Math.random()});var a="
    ";for(var b=0;b<10;b++){if(b==9){a=a+'
  • 取消
  • '}a=a+'
  • '+c[b]+"
  • ";if(b==9){a=a+'
  •  
'}}e='
银联安全键盘
采用银联标准加密技术加密传输,保证密码输入安全
确定
'+a+"
"}else{if($keybordType=="creditPwd"){_currYear=$currDate.substring(0,4);_currMonth=$currDate.substring(4);var d="";var f="";for(var b=0;b<12;b++){d=d+""}for(var b=0;b<12;b++){f=f+""}var c=[0,1,2,3,4,5,6,7,8,9];c.sort(function(){return 0.5-Math.random()});var a="
    ";for(var b=0;b<10;b++){if(b==9){a=a+'
  • 取消
  • '}a=a+'
  • '+c[b]+"
  • ";if(b==9){a=a+'
  •  
'}}e='
银联安全键盘
采用银联标准加密技术加密传输,保证密码输入安全
   
有效期
确定
信用卡CVN2
'+a+"
"}}}}if(IsPC()){e=e.replace(/ontouchstart/g,"onclick")}$page.append(e)}function _initUI2(){var e="";if($keybordType=="idNum"){e='
确定
  • 1
  • 2
  • 3
  • X
  • 4
  • 5
  • 6
  • 0
  • 7
  • 8
  • 9
  •  
'}else{if($keybordType=="accCard"){e='
确定
  • 1
  • 2
  • 3
  • X
  • 4
  • 5
  • 6
  • 0
  • 7
  • 8
  • 9
  •  
'}else{if($keybordType=="cardPwd"){var c=[0,1,2,3,4,5,6,7,8,9];c.sort(function(){return 0.5-Math.random()});var a="
    ";for(var b=0;b<10;b++){a=a+'
  • '+c[b]+"
  • ";if(b==7){a=a+'
  • 取消
  • '}if(b==9){a=a+'
  •  
'}}e='
银联安全键盘
采用银联标准加密技术加密传输,保证密码输入安全
确定
'+a+"
"}else{if($keybordType=="creditPwd"){_currYear=$currDate.substring(0,4);_currMonth=$currDate.substring(4);var d="";var f="";for(var b=0;b<12;b++){d=d+""}for(var b=0;b<12;b++){f=f+""}var c=[0,1,2,3,4,5,6,7,8,9];c.sort(function(){return 0.5-Math.random()});var a="
    ";for(var b=0;b<10;b++){a=a+'
  • '+c[b]+"
  • ";if(b==7){a=a+'
  • 取消
  • '}if(b==9){a=a+'
  •  
'}}e='
银联安全键盘
采用银联标准加密技术加密传输,保证密码输入安全
   
有效期
确定
信用卡CVN2
'+a+"
"}}}}if(IsPC()){e=e.replace(/ontouchstart/g,"onclick")}$page.append(e)}function IsPC(){var a=navigator.userAgent;var d=["Android","iPhone","SymbianOS","Windows Phone","iPad","iPod"];var b=true;for(var c=0;c0){b=false;break}}return b}function keyDown(){$(".js-keyboard-bg").show(100);$(".js-keyboard").show(200)}function keyUp(){$(".js-keyboard").remove();$(".js-keyboard-bg").remove()}function key(b,a){if($keybordType=="idNum"||$keybordType=="accCard"){keyNumber(b,a)}else{if($keybordType=="cardPwd"||$keybordType=="creditPwd"){keyPwd(b,a)}}}function showMsg(b){var a=$(".js-keyboard .wf-err-tip");if(a.data("animated")){return}a.data("animated",true);a.html($errorMsg);if(typeof b!="undefined"&&b!=""){a.html(b)}a.show();setTimeout(function(){a.hide().css("opacity",1).data("animated",false)},2000)}function getkeyboard(){if($keybordType=="idNum"||$keybordType=="accCard"){getNumberkeyboard()}else{if($keybordType=="cardPwd"||$keybordType=="creditPwd"){getPwdkeyboard()}}}function keyNumber(e,d){var b=$(".key-input");var a=b.val();if(d==1){if(a.replace(/ /g,"").length>=$maxLen){return false}var c=a+e.innerHTML;if($keybordType=="accCard"){c=formatAccCard(c)}b.val(c)}else{if(d==2){b.val("");keyUp()}else{if(d==3){var c=a.replace(/ /g,"");c=c.slice(0,-1);if($keybordType=="accCard"){c=formatAccCard(c)}b.val(c)}}}}function formatAccCard(a){var a=a.replace(/ /g,"");for(var b=0;b=$maxLen){return false}var c=a+e.innerHTML;b.val(c)}else{if(d==2){b.val("");keyUp();return true}else{if(d==3){var c=a.slice(0,-1);b.val(c)}}}}function getPwdkeyboard(){if($keybordType=="cardPwd"){var d=$(".key-input");var b=d.val();if(!$checkFunction(b)){$(".key-input").css("background-color","rgb(255, 231, 231);");showMsg();return false}try{var f=new RSAKey();f.setPublic(rsaModule,rsaExponent);var l=b;var g=l.length<10?("0"+l.length):(l.length);var a=g+l+$dnaOrderId;if($pwdDirectEnc){a=l}var j=f.encrypt(a);var c=hex2b64(j);$page.find(".pwd").val(c);$($inputEle).val("******")}catch(i){console.log(i)}}else{if($keybordType=="creditPwd"){var d=$(".key-input1");var k=$(".select_year").val();var h=$(".select_month").val();var m=d.val();if(k==""||h==""){$(".key-input").css("background-color","rgb(255, 231, 231);");showMsg("请选择正确的有效期!");return false}if(_currYear==k&&parseInt(_currMonth)>parseInt(h)){$(".key-input").css("background-color","rgb(255, 231, 231);");showMsg("有效期不能小于当前年月!");return false}if(!$checkFunction(m)){$(".key-input").css("background-color","rgb(255, 231, 231);");showMsg();return false}try{var f=new RSAKey();f.setPublic(rsaModule,rsaExponent);if(k.length==4){k=k.substring(2)}var l=h+k+m;var g=l.length<10?("0"+l.length):(l.length);var a=g+l+$dnaOrderId;var j=f.encrypt(a);var c=hex2b64(j);$page.find(".pwd").val(c);$($inputEle).val("******")}catch(i){console.log(i)}}}keyUp()};var b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var b64padchar="=";function hex2b64(d){var b;var e;var a="";for(b=0;b+3<=d.length;b+=3){e=parseInt(d.substring(b,b+3),16);a+=b64map.charAt(e>>6)+b64map.charAt(e&63)}if(b+1==d.length){e=parseInt(d.substring(b,b+1),16);a+=b64map.charAt(e<<2)}else{if(b+2==d.length){e=parseInt(d.substring(b,b+2),16);a+=b64map.charAt(e>>2)+b64map.charAt((e&3)<<4)}}while((a.length&3)>0){a+=b64padchar}return a}function b64tohex(e){var c="";var d;var a=0;var b;for(d=0;d>2);b=v&3;a=1}else{if(a==1){c+=int2char((b<<2)|(v>>4));b=v&15;a=2}else{if(a==2){c+=int2char(b);c+=int2char(v>>2);b=v&3;a=3}else{c+=int2char((b<<2)|(v>>4));c+=int2char(v&15);a=0}}}}if(a==1){c+=int2char(b<<2)}return c}function b64toBA(e){var d=b64tohex(e);var c;var b=new Array();for(c=0;2*c=0){var d=a*this[f++]+b[e]+h;h=Math.floor(d/67108864);b[e++]=d&67108863}return h}function am2(f,q,r,e,o,a){var k=q&32767,p=q>>15;while(--a>=0){var d=this[f]&32767;var g=this[f++]>>15;var b=p*d+g*k;d=k*d+((b&32767)<<15)+r[e]+(o&1073741823);o=(d>>>30)+(b>>>15)+p*g+(o>>>30);r[e++]=d&1073741823}return o}function am3(f,q,r,e,o,a){var k=q&16383,p=q>>14;while(--a>=0){var d=this[f]&16383;var g=this[f++]>>14;var b=p*d+g*k;d=k*d+((b&16383)<<14)+r[e]+o;o=(d>>28)+(b>>14)+p*g;r[e++]=d&268435455}return o}if(j_lm&&(navigator.appName=="Microsoft Internet Explorer")){BigInteger.prototype.am=am2;dbits=30}else{if(j_lm&&(navigator.appName!="Netscape")){BigInteger.prototype.am=am1;dbits=26}else{BigInteger.prototype.am=am3;dbits=28}}BigInteger.prototype.DB=dbits;BigInteger.prototype.DM=((1<=0;--a){b[a]=this[a]}b.t=this.t;b.s=this.s}function bnpFromInt(a){this.t=1;this.s=(a<0)?-1:0;if(a>0){this[0]=a}else{if(a<-1){this[0]=a+this.DV}else{this.t=0}}}function nbv(a){var b=nbi();b.fromInt(a);return b}function bnpFromString(h,c){var e;if(c==16){e=4}else{if(c==8){e=3}else{if(c==256){e=8}else{if(c==2){e=1}else{if(c==32){e=5}else{if(c==4){e=2}else{this.fromRadix(h,c);return}}}}}}this.t=0;this.s=0;var g=h.length,d=false,f=0;while(--g>=0){var a=(e==8)?h[g]&255:intAt(h,g);if(a<0){if(h.charAt(g)=="-"){d=true}continue}d=false;if(f==0){this[this.t++]=a}else{if(f+e>this.DB){this[this.t-1]|=(a&((1<<(this.DB-f))-1))<>(this.DB-f))}else{this[this.t-1]|=a<=this.DB){f-=this.DB}}if(e==8&&(h[0]&128)!=0){this.s=-1;if(f>0){this[this.t-1]|=((1<<(this.DB-f))-1)<0&&this[this.t-1]==a){--this.t}}function bnToString(c){if(this.s<0){return"-"+this.negate().toString(c)}var e;if(c==16){e=4}else{if(c==8){e=3}else{if(c==2){e=1}else{if(c==32){e=5}else{if(c==4){e=2}else{return this.toRadix(c)}}}}}var g=(1<0){if(j>j)>0){a=true;h=int2char(l)}while(f>=0){if(j>(j+=this.DB-e)}else{l=(this[f]>>(j-=e))&g;if(j<=0){j+=this.DB;--f}}if(l>0){a=true}if(a){h+=int2char(l)}}}return a?h:"0"}function bnNegate(){var a=nbi();BigInteger.ZERO.subTo(this,a);return a}function bnAbs(){return(this.s<0)?this.negate():this}function bnCompareTo(b){var d=this.s-b.s;if(d!=0){return d}var c=this.t;d=c-b.t;if(d!=0){return(this.s<0)?-d:d}while(--c>=0){if((d=this[c]-b[c])!=0){return d}}return 0}function nbits(a){var c=1,b;if((b=a>>>16)!=0){a=b;c+=16}if((b=a>>8)!=0){a=b;c+=8}if((b=a>>4)!=0){a=b;c+=4}if((b=a>>2)!=0){a=b;c+=2}if((b=a>>1)!=0){a=b;c+=1}return c}function bnBitLength(){if(this.t<=0){return 0}return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM))}function bnpDLShiftTo(c,b){var a;for(a=this.t-1;a>=0;--a){b[a+c]=this[a]}for(a=c-1;a>=0;--a){b[a]=0}b.t=this.t+c;b.s=this.s}function bnpDRShiftTo(c,b){for(var a=c;a=0;--d){e[d+f+1]=(this[d]>>a)|h;h=(this[d]&g)<=0;--d){e[d]=0}e[f]=h;e.t=this.t+f+1;e.s=this.s;e.clamp()}function bnpRShiftTo(g,d){d.s=this.s;var e=Math.floor(g/this.DB);if(e>=this.t){d.t=0;return}var b=g%this.DB;var a=this.DB-b;var f=(1<>b;for(var c=e+1;c>b}if(b>0){d[this.t-e-1]|=(this.s&f)<>=this.DB}if(d.t>=this.DB}g+=this.s}else{g+=this.s;while(e>=this.DB}g-=d.s}f.s=(g<0)?-1:0;if(g<-1){f[e++]=this.DV+g}else{if(g>0){f[e++]=g}}f.t=e;f.clamp()}function bnpMultiplyTo(c,e){var b=this.abs(),f=c.abs();var d=b.t;e.t=d+f.t;while(--d>=0){e[d]=0}for(d=0;d=0){d[b]=0}for(b=0;b=a.DV){d[b+a.t]-=a.DV;d[b+a.t+1]=1}}if(d.t>0){d[d.t-1]+=a.am(b,a[b],d,2*b,0,1)}d.s=0;d.clamp()}function bnpDivRemTo(n,h,g){var w=n.abs();if(w.t<=0){return}var k=this.abs();if(k.t0){w.lShiftTo(v,d);k.lShiftTo(v,g)}else{w.copyTo(d);k.copyTo(g)}var p=d.t;var b=d[p-1];if(b==0){return}var o=b*(1<1)?d[p-2]>>this.F2:0);var A=this.FV/o,z=(1<=0){g[g.t++]=1;g.subTo(f,g)}BigInteger.ONE.dlShiftTo(p,f);f.subTo(d,d);while(d.t=0){var c=(g[--u]==b)?this.DM:Math.floor(g[u]*A+(g[u-1]+x)*z);if((g[u]+=d.am(0,c,g,s,0,p))0){g.rShiftTo(v,g)}if(a<0){BigInteger.ZERO.subTo(g,g)}}function bnMod(b){var c=nbi();this.abs().divRemTo(b,null,c);if(this.s<0&&c.compareTo(BigInteger.ZERO)>0){b.subTo(c,c)}return c}function Classic(a){this.m=a}function cConvert(a){if(a.s<0||a.compareTo(this.m)>=0){return a.mod(this.m)}else{return a}}function cRevert(a){return a}function cReduce(a){a.divRemTo(this.m,null,a)}function cMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}function cSqrTo(a,b){a.squareTo(b);this.reduce(b)}Classic.prototype.convert=cConvert;Classic.prototype.revert=cRevert;Classic.prototype.reduce=cReduce;Classic.prototype.mulTo=cMulTo;Classic.prototype.sqrTo=cSqrTo;function bnpInvDigit(){if(this.t<1){return 0}var a=this[0];if((a&1)==0){return 0}var b=a&3;b=(b*(2-(a&15)*b))&15;b=(b*(2-(a&255)*b))&255;b=(b*(2-(((a&65535)*b)&65535)))&65535;b=(b*(2-a*b%this.DV))%this.DV;return(b>0)?this.DV-b:-b}function Montgomery(a){this.m=a;this.mp=a.invDigit();this.mpl=this.mp&32767;this.mph=this.mp>>15;this.um=(1<<(a.DB-15))-1;this.mt2=2*a.t}function montConvert(a){var b=nbi();a.abs().dlShiftTo(this.m.t,b);b.divRemTo(this.m,null,b);if(a.s<0&&b.compareTo(BigInteger.ZERO)>0){this.m.subTo(b,b)}return b}function montRevert(a){var b=nbi();a.copyTo(b);this.reduce(b);return b}function montReduce(a){while(a.t<=this.mt2){a[a.t++]=0}for(var c=0;c>15)*this.mpl)&this.um)<<15))&a.DM;b=c+this.m.t;a[b]+=this.m.am(0,d,a,c,0,this.m.t);while(a[b]>=a.DV){a[b]-=a.DV;a[++b]++}}a.clamp();a.drShiftTo(this.m.t,a);if(a.compareTo(this.m)>=0){a.subTo(this.m,a)}}function montSqrTo(a,b){a.squareTo(b);this.reduce(b)}function montMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}Montgomery.prototype.convert=montConvert;Montgomery.prototype.revert=montRevert;Montgomery.prototype.reduce=montReduce;Montgomery.prototype.mulTo=montMulTo;Montgomery.prototype.sqrTo=montSqrTo;function bnpIsEven(){return((this.t>0)?(this[0]&1):this.s)==0}function bnpExp(h,j){if(h>4294967295||h<1){return BigInteger.ONE}var f=nbi(),a=nbi(),d=j.convert(this),c=nbits(h)-1;d.copyTo(f);while(--c>=0){j.sqrTo(f,a);if((h&(1<0){j.mulTo(a,d,f)}else{var b=f;f=a;a=b}}return j.revert(f)}function bnModPowInt(b,a){var c;if(b<256||a.isEven()){c=new Classic(a)}else{c=new Montgomery(a)}return this.exp(b,c)}BigInteger.prototype.copyTo=bnpCopyTo;BigInteger.prototype.fromInt=bnpFromInt;BigInteger.prototype.fromString=bnpFromString;BigInteger.prototype.clamp=bnpClamp;BigInteger.prototype.dlShiftTo=bnpDLShiftTo;BigInteger.prototype.drShiftTo=bnpDRShiftTo;BigInteger.prototype.lShiftTo=bnpLShiftTo;BigInteger.prototype.rShiftTo=bnpRShiftTo;BigInteger.prototype.subTo=bnpSubTo;BigInteger.prototype.multiplyTo=bnpMultiplyTo;BigInteger.prototype.squareTo=bnpSquareTo;BigInteger.prototype.divRemTo=bnpDivRemTo;BigInteger.prototype.invDigit=bnpInvDigit;BigInteger.prototype.isEven=bnpIsEven;BigInteger.prototype.exp=bnpExp;BigInteger.prototype.toString=bnToString;BigInteger.prototype.negate=bnNegate;BigInteger.prototype.abs=bnAbs;BigInteger.prototype.compareTo=bnCompareTo;BigInteger.prototype.bitLength=bnBitLength;BigInteger.prototype.mod=bnMod;BigInteger.prototype.modPowInt=bnModPowInt;BigInteger.ZERO=nbv(0);BigInteger.ONE=nbv(1);function Arcfour(){this.i=0;this.j=0;this.S=new Array()}function ARC4init(d){var c,a,b;for(c=0;c<256;++c){this.S[c]=c}a=0;for(c=0;c<256;++c){a=(a+this.S[c]+d[c%d.length])&255;b=this.S[c];this.S[c]=this.S[a];this.S[a]=b}this.i=0;this.j=0}function ARC4next(){var a;this.i=(this.i+1)&255;this.j=(this.j+this.S[this.i])&255;a=this.S[this.i];this.S[this.i]=this.S[this.j];this.S[this.j]=a;return this.S[(a+this.S[this.i])&255]}Arcfour.prototype.init=ARC4init;Arcfour.prototype.next=ARC4next;function prng_newstate(){return new Arcfour()}var rng_psize=256;var rng_state;var rng_pool;var rng_pptr;function rng_seed_int(a){rng_pool[rng_pptr++]^=a&255;rng_pool[rng_pptr++]^=(a>>8)&255;rng_pool[rng_pptr++]^=(a>>16)&255;rng_pool[rng_pptr++]^=(a>>24)&255;if(rng_pptr>=rng_psize){rng_pptr-=rng_psize}}function rng_seed_time(){rng_seed_int(new Date().getTime())}if(rng_pool==null){rng_pool=new Array();rng_pptr=0;var t;if(window.crypto&&window.crypto.getRandomValues){var ua=new Uint8Array(32);window.crypto.getRandomValues(ua);for(t=0;t<32;++t){rng_pool[rng_pptr++]=ua[t]}}if(navigator.appName=="Netscape"&&navigator.appVersion<"5"&&window.crypto){var z=window.crypto.random(32);for(t=0;t>>8;rng_pool[rng_pptr++]=t&255}rng_pptr=0;rng_seed_time()}function rng_get_byte(){if(rng_state==null){rng_seed_time();rng_state=prng_newstate();rng_state.init(rng_pool);for(rng_pptr=0;rng_pptr=0&&h>0){var f=e.charCodeAt(d--);if(f<128){g[--h]=f}else{if((f>127)&&(f<2048)){g[--h]=(f&63)|128;g[--h]=(f>>6)|192}else{g[--h]=(f&63)|128;g[--h]=((f>>6)&63)|128;g[--h]=(f>>12)|224}}}g[--h]=0;var b=new SecureRandom();var a=new Array();while(h>2){a[0]=0;while(a[0]==0){b.nextBytes(a)}g[--h]=a[0]}g[--h]=2;g[--h]=0;return new BigInteger(g)}function RSAKey(){this.n=null;this.e=0;this.d=null;this.p=null;this.q=null;this.dmp1=null;this.dmq1=null;this.coeff=null}function RSASetPublic(b,a){if(b!=null&&a!=null&&b.length>0&&a.length>0){this.n=parseBigInt(b,16);this.e=parseInt(a,16)}else{alert("Invalid RSA public key")}}function RSADoPublic(a){return a.modPowInt(this.e,this.n)}function RSAEncrypt(d){var a=pkcs1pad2(d,(this.n.bitLength()+7)>>3);if(a==null){return null}var e=this.doPublic(a);if(e==null){return null}var b=e.toString(16);if((b.length&1)==0){return b}else{return"0"+b}}RSAKey.prototype.doPublic=RSADoPublic;RSAKey.prototype.setPublic=RSASetPublic;RSAKey.prototype.encrypt=RSAEncrypt;/*! + * mDialog v1.3.1 + * Copyright 2013-2014 Frans.Lee, http://www.ifrans.cn + * v1.3.1 2014-04-23 #修复一处自定义class相关的问题 + * v1.3 2014-04-01 #优化弹窗内容过多时的上下滑动体验 + * v1.2 2014-03-18 #修复一处问题,兼容android 2.3.x + * v1.1 2014-02-19 #阻止touchmove事件 + */ +;(function(){var b='

';var a=function(g,f){f=f||{};var d=a.config;var c=(f.cancelBtn&&!f.cancelBtn.hide)?false:true;for(var h in d){f[h]=f[h]===undefined?d[h]:f[h];if(Object.prototype.toString.call(d[h]).toLowerCase()=="[object object]"){for(var e in d[h]){f[h][e]=f[h][e]===undefined?d[h][e]:f[h][e]}}}f.cancelBtn.hide=c;a.config.zIndex=f.zIndex;return new a.prototype.init(g,f)};a.prototype={constructor:a,init:function(j,f){if(!j){return}var h,d=true,g=this;if(g.elems(".ui-dialog")){var e=0,c=g.elems(".ui-dialog").length;while(e"}if(!d.cancelBtn.hide){c+=''+d.cancelBtn.text+""}f.domElem(".ui-dialog-btn-wrapper").innerHTML=c;if(f.domElem(".ok-btn")){f.domElem(".ok-btn").addEventListener("click",function(){if(d.okBtn.callback&&d.okBtn.callback.call(f)==false){return}f.close()},false)}if(f.domElem(".cancel-btn")){f.domElem(".cancel-btn").addEventListener("click",function(){if(d.cancelBtn.callback&&d.cancelBtn.callback.call(f)==false){return}f.close()},false)}if(f.domElem(".ui-dialog-close-btn")){f.domElem(".ui-dialog-close-btn").addEventListener("click",function(){if(d.closeBtn.callback&&d.closeBtn.callback.call(f)==false){return}f.close()},false)}}};a.close=function(c){if(!c){return}a().close(c)};a.config={title:"提示信息",mask:true,id:"",addClass:"",zIndex:9900,okBtn:{hide:false,text:"确定",callback:null},cancelBtn:{hide:false,text:"取消",callback:null},closeBtn:{hide:false,callback:null}};a.prototype.init.prototype=a.prototype;window.mDialog=a})(window,undefined); \ No newline at end of file diff --git a/roncoo-pay-web-boss/src/main/webapp/common/scan/js/fz1.js b/roncoo-pay-web-boss/src/main/webapp/common/scan/js/fz1.js new file mode 100644 index 0000000000000000000000000000000000000000..7d1e81fcfd445cab396b8b75082f1ac3a721a146 --- /dev/null +++ b/roncoo-pay-web-boss/src/main/webapp/common/scan/js/fz1.js @@ -0,0 +1,136 @@ +//对应first。jsp +//提交前同步手动数据 +function storeInfo(){ + //判断数据来源,手动输入信息要同步展示数据和隐藏数据,cookie获取信息不同步展示数据和隐藏数据 + if($("#dataFlag").val()!="cookie"){ + synDate(); + } + return true; + } + +//同步展示数据和隐藏数据 +function synDate(){ + var bankCode=$.trim($("#bankCode").val()); + var bankAccountName=$.trim($("#bankAccountName").val()); + var certNo=$.trim($("#certNo").val()); + var bankAccountNo=$.trim($("#bankAccountNo").val()); + var phoneNo=$.trim($("#phoneNo").val()); + + //缺少值时,可以同步 + //同步输入字段到隐藏字段,以便过js校验 + $("#bankAccountNameHidden").val(bankAccountName); + $("#certNoHidden").val(certNo); + $("#bankAccountNoHidden").val(bankAccountNo); + $("#phoneNoHidden").val(phoneNo); + + + //缺少值不提交cookie + if(bankCode.length>0 && bankAccountName.length>0 && certNo.length>0 && bankAccountNo.length>0 && phoneNo.length>0 ){ + setCookie("bankCode",bankCode); + + + //形成伪展示值 + var bankAccountNameShow = bankAccountName.substring(0,1)+"*"; + var certNoShow = certNo.substring(0,9)+"****"+certNo.substring(14,18); + var len=bankAccountNo.length; + var bankAccountNoShow = bankAccountNo.substring(0,8)+"****"+bankAccountNo.substring(len-4,len); + var phoneNoShow = phoneNo.substring(0,3)+"****"+phoneNo.substring(7,11) + setCookie("bankAccountName",bankAccountNameShow); + setCookie("certNo",certNoShow); + setCookie("bankAccountNo",bankAccountNoShow); + setCookie("phoneNo",phoneNoShow); + //加密信息 + var infoStr="bankCode="+bankCode+"&bankAccountName="+bankAccountName+"&certNo="+certNo+"&bankAccountNo="+bankAccountNo+"&phoneNo="+phoneNo; + var info=encodeURIComponent(infoStr); + setCookie("info",info); + } +} + +//Cookie操作 +function getCookie(name) { + var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)"); + if(arr=document.cookie.match(reg)){ + var cookieValue = unescape(arr[2]); + return cookieValue.replace(/(^")|("$)/g,"") + }else{ + return null; + } +} +function setCookie(name,value) +{ + var Days = 365; + var exp = new Date(); //new Date("December 31, 9998"); + exp.setTime(exp.getTime() + Days*24*60*60*1000);//一年内 + document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString(); +} + +//获取最近一次输入个人信息(银行卡号) +function getPrivateInfo(){ + var bankCode = getCookie('bankCode'); + var bankAccountName = getCookie('bankAccountName'); + var certNo = getCookie('certNo'); + var bankAccountNo = getCookie('bankAccountNo'); + var phoneNo = getCookie('phoneNo'); + var info = getCookie('info'); + //不接受残缺cookie + if(bankCode!=null && bankAccountName!=null && certNo!=null && bankAccountNo!=null && phoneNo!=null && info!=null){ + //cookie数据,不同步 + $("#dataFlag").val("cookie"); + //赋展示值 + $("#bankCode").val(bankCode); + $("#bankAccountName").attr("value",bankAccountName); + $("#certNo").attr("value",certNo); + $("#bankAccountNo").attr("value",bankAccountNo); + $("#phoneNo").attr("value",phoneNo); + //赋值给隐藏字段 + var infoStr=decodeURIComponent(info); + var arr=infoStr.split("&"); + for( var i=0;i0 && bankAccountName.length>0 && certNo.length>0 && bankAccountNo.length>0 && phoneNo.length>0 ){ + setCookie("bankCode",bankCode); + + + //形成伪展示值 + var bankAccountNameShow = bankAccountName.substring(0,1)+"*"; + var certNoShow = certNo.substring(0,9)+"****"+certNo.substring(14,18); + var len=bankAccountNo.length; + var bankAccountNoShow = bankAccountNo.substring(0,8)+"****"+bankAccountNo.substring(len-4,len); + var phoneNoShow = phoneNo.substring(0,3)+"****"+phoneNo.substring(7,11) + setCookie("bankAccountName",bankAccountNameShow); + setCookie("certNo",certNoShow); + setCookie("bankAccountNo",bankAccountNoShow); + setCookie("phoneNo",phoneNoShow); + //加密信息 + var infoStr="bankCode="+bankCode+"&bankAccountName="+bankAccountName+"&certNo="+certNo+"&bankAccountNo="+bankAccountNo+"&phoneNo="+phoneNo; + var info=encodeURIComponent(infoStr); + setCookie("info",info); + } +} + +//Cookie操作 +function getCookie(name) { + var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)"); + if(arr=document.cookie.match(reg)){ + var cookieValue = unescape(arr[2]); + return cookieValue.replace(/(^")|("$)/g,"") + }else{ + return null; + } +} +function setCookie(name,value) +{ + var Days = 365; + var exp = new Date(); //new Date("December 31, 9998"); + exp.setTime(exp.getTime() + Days*24*60*60*1000);//一年内 + document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString(); +} + +//获取最近一次输入个人信息(银行卡号) +function getPrivateInfo1(){ + var bankCode = getCookie('bankCode'); + var bankAccountName = getCookie('bankAccountName'); + var certNo = getCookie('certNo'); + var bankAccountNo = getCookie('bankAccountNo'); + var phoneNo = getCookie('phoneNo'); + var info = getCookie('info'); + //不接受残缺cookie + if(bankCode!=null && bankAccountName!=null && certNo!=null && bankAccountNo!=null && phoneNo!=null && info!=null){ + //cookie数据,不同步 + $("#dataFlag").val("cookie"); + //赋展示值 + $("#bankCode").val(bankCode); + $("#bankAccountName").attr("value",bankAccountName); + $("#certNo").attr("value",certNo); + $("#bankAccountNo").attr("value",bankAccountNo); + $("#phoneNo").attr("value",phoneNo); + //赋值给隐藏字段 + var infoStr=decodeURIComponent(info); + var arr=infoStr.split("&"); + for( var i=0;i").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/roncoo-pay-web-boss/src/main/webapp/common/scan/js/jquery.qrcode.min.js b/roncoo-pay-web-boss/src/main/webapp/common/scan/js/jquery.qrcode.min.js new file mode 100644 index 0000000000000000000000000000000000000000..fe9680e6c51d0d2efcf9ef0e1c3866d0c88012e6 --- /dev/null +++ b/roncoo-pay-web-boss/src/main/webapp/common/scan/js/jquery.qrcode.min.js @@ -0,0 +1,28 @@ +(function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){this.typeNumber=a;this.errorCorrectLevel=c;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[]}function q(a,c){if(void 0==a.length)throw Error(a.length+"/"+c);for(var d=0;da||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]= +0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c= +j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount- +b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0g;g++)if(null==this.modules[b][i-g]){var n=!1;f>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a, +c),b=new t,e=0;e8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d= +0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+ +a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;dc)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+ +a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256), +LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d +this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b>>7-a%8&1)},put:function(a,c){for(var d=0;d>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1, +correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f
").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e").css("height",b+"px").appendTo(c);for(i=0;i").css("width", +d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;jQuery(a).appendTo(this)})}})(jQuery); diff --git a/roncoo-pay-web-boss/src/main/webapp/common/scan/js/pay-min.css b/roncoo-pay-web-boss/src/main/webapp/common/scan/js/pay-min.css new file mode 100644 index 0000000000000000000000000000000000000000..fffa941af37680c293a1fca4572d971eba5e8674 --- /dev/null +++ b/roncoo-pay-web-boss/src/main/webapp/common/scan/js/pay-min.css @@ -0,0 +1 @@ +html{height:100%;font-size:1em;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight:rgba(0,0,0,0);-webkit-text-size-adjust:none}body{margin:0 auto;height:100%;font-size:12px;background:#f0f0f0;color:#333}body,input,button,select,textarea,sub{font-family:microsoft yahei,Verdana,Arial,Helvetica,sans-serif}label{cursor:pointer}a:link,a:visited{text-decoration:none}input,button,select,textarea{outline:0}input[type="text"],input[type="tel"],input[type="password"],input[type="number"],textarea{-webkit-appearance:none}textarea{resize:none}a,abbr,acronym,address,applet,article,aside,audio,b,blockquote,big,body,center,canvas,caption,cite,code,command,datalist,dd,del,details,dfn,dl,div,dt,em,embed,fieldset,figcaption,figure,font,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,keygen,label,legend,li,meter,nav,menu,object,ol,output,p,pre,progress,q,s,samp,section,small,span,source,strike,strong,sub,sup,table,tbody,tfoot,thead,th,tr,tdvideo,tt,u,ul,var{margin:0;padding:0}ol,ul,li,dl,dd,dt{list-style:none}article,aside,footer,header,hgroup,nav,section,figure,figcaption{display:block}h1,h2,h3,h4,h5,h6,th,td,table,input,button,select,textarea,sub{font-size:1em}em,cite,address,optgroup,i{font-style:normal}kbd,samp,code{font-family:monospace}img,input,button,select,textarea{vertical-align:middle}img,fieldset{border:0}abbr,acronym{cursor:help;border-bottom:1px dotted black}table{border-spacing:0;border:0}table th,table td{border:0}legend,hr{overflow:hidden;position:absolute;left:0}legend,hr,caption{visibility:hidden;font-size:0;width:0;height:0;line-height:0}body.fixed{overflow:hidden}.l,.left{float:left}.r,.right{float:right}.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}/*\*/.clearfix{display:block}/**/.none{display:none}.block{display:block}.inline{display:inline}.hidden{overflow:hidden}.formAddBankCard{display:none}.pay-card-ul li a:link,.pay-card-ul li a:visited,.pay-card-ul li a:hover,.pay-card-ul li a:active{color:#999;text-decoration:none}a{text-decoration:none}ol,ul,li,nav{list-style:none}.header{width:100%;height:44px;line-height:42px;background:#1fc1d8;border-bottom:1px solid #ddd;position:fixed;top:0;z-index:999}.header-title{margin:0 32px;height:44px;line-height:44px;overflow:hidden;text-align:center}.header-title h1{font-size:16px;color:#fff}.tool-back{width:30px;height:42px;position:absolute;left:5px;top:0;background:url(../images/pay.png) no-repeat center 13px;background-size:36px auto}.tool-logo{width:36px;height:42px;position:absolute;right:5px;top:0;background:url(../images/pay.png) no-repeat center -30px;background-size:36px auto}.hide{overflow:hidden}.box_bg{width:100%;height:100%;position:absolute;left:0;top:0;z-index:1;background-color:rgba(0,0,0,0.7);display:none}.pay-step{margin:0 20px;height:83px;line-height:22px;position:relative}.step-line{width:100%;height:2px;background:#999;position:absolute;top:30px}.pay-step ul{display:table;width:100%}.pay-step li{display:table-cell;padding-top:48px;color:#999;text-align:center;position:relative}.li-line{width:100%;height:2px;background:#999;position:absolute;left:0;top:30px}.pay-step li.on .li-line{background-color:#f5a200}.li-num{width:100%;position:absolute;left:0;top:18px}.li-num span{width:22px;height:22px;border:2px solid #999;color:#666;display:block;background:#f0f0f0;margin:0 auto;border-radius:50%}.pay-step li.on span{background:#f5a200;border-color:#f5a200;color:#fff;background-clip:padding-box}.pay-info{width:100%;background:#fff;color:#999;margin-bottom:10px;border-top:1px solid #e6e6e6}.pay-info-bottom{width:100%;height:18px;overflow:hidden;background:url(../images/pay.png) repeat-x center bottom;background-size:36px auto}div.pay-info-error{margin-top:30px;padding-bottom:20px;border-bottom:1px solid #ddd}div.pay-info-error li{text-align:left;position:relative;word-wrap:break-word;word-break:normal;overflow:visible;height:auto}div.pay-info-error li span{display:block;float:none;text-align:left;position:absolute;top:0;left:0}div.pay-info-error li div{float:none;margin-left:60px}.pay-info-notes{padding:10px 0;margin:0 15px;border-bottom:1px solid #ececec;color:#666;line-height:22px;font-size:12px;text-align:center}.pay-value{padding:10px 0;margin:0 15px;border-bottom:1px solid #ececec;color:#666;line-height:30px;font-size:14px;text-align:center}.pay-value span{font-size:22px;color:#f5a200}.pay-ok{padding:20px 0;margin:0 15px;border-bottom:1px solid #ececec;color:#666;line-height:30px;font-size:14px;text-align:center}.pay-ok span{font-size:22px;padding-left:32px;color:#5ab208;background:url(../images/pay.png) no-repeat left -280px;background-size:36px auto}.pay-fail{padding:20px 0;margin:0 15px;border-bottom:1px solid #ececec;color:#666;line-height:30px;font-size:14px;text-align:center}.pay-fail span{font-size:22px;padding-left:32px;color:#f41016;background:url(../images/pay-fail.png) no-repeat left 1px;background-size:25px auto}.pay-shenhe{padding:15px 0;margin:0 15px;border-bottom:1px solid #ececec;color:#999;line-height:32px;font-size:14px;text-align:center}.pay-shenhe span{font-size:18px;color:#f5a200}.pay-shenhe p{line-height:22px}.pay-error{padding:15px;background:#fff;margin-bottom:10px;border-top:1px solid #e6e6e6;border-bottom:1px solid #e6e6e6;color:#999}.pay-error p{line-height:22px;font-size:12px}.pay-xieyi{padding:20px;line-height:24px;font-size:14px}.pay-xieyi h1{font-size:16px;height:40px;font-weight:100px;line-height:36px;text-align:center}.pay-xieyi p{margin-bottom:12px}.pay-banklist{padding:20px 0;line-height:24px;font-size:14px}.bank-list-title{padding:10px 0 10px 20px;background:#fff;border-top:1px solid #e6e6e6;border-bottom:1px solid #e6e6e6;line-height:22px;font-size:14px}.bank-list-title span{width:24%;text-align:center;float:right}.pay-banklist h1{font-size:16px;height:42px;font-weight:100px;line-height:32px;text-align:center}.bank-list-ul{padding-left:20px}.pay-banklist li{line-height:32px;height:32px;padding:10px 0;border-bottom:1px solid #bfbfc1}.pay-banklist li img{margin-right:5px}.pay-banklist li span{line-height:32px;width:24%;float:right;text-align:center}.pay-goods{margin:0 15px;padding-top:10px;overflow:hidden;font-size:12px}.pay-goods-h{height:20px}.pay-goods li{text-align:right;height:24px;line-height:24px;overflow:hidden}.pay-goods li.li-first{padding-right:16px;background:url(../images/pay.png) no-repeat right -190px;background-size:36px auto}.pay-goods li.li_down{background-position:right -230px}.pay-goods span{float:left}.pay-goods p{text-align:center}.pay-goods a{color:#576b95}.pay-results{margin:0 15px;padding-top:10px;font-size:12px}.pay-results li{text-align:right;height:24px;line-height:24px;overflow:hidden}.pay-results span{float:left}.pay-paizhao{text-align:center;color:#666;padding:15px 0;line-height:24px}.pay-zhao{width:218px;margin:0 auto}.zhaopian{width:140px;float:left}.zhaopian_xz ul li{float:left;padding:3px 20px 0 0}.zhaopian_xz1{float:left;padding:20px 10px 0 0}.zhaopian_img{float:left}.zhaopian_img img{width:60px;height:75px}.zhaopian_xz2{float:left;clear:both;text-align:center;padding:5px 0 0 48px}.zhaopian_xz3{float:left;padding:20px 0 0 10px}.litpic_btn{width:64px;height:64px;background:url(../images/paizhao.png) no-repeat center center;background-size:50px auto;position:relative;overflow:hidden;float:left}div.pay-input-crdit{padding-left:100px}div.pay-input-crdit .input-label{width:90px}.pay-input{height:44px;padding-left:80px;padding-right:15px;border-bottom:1px solid #e6e6e6;background:#fff;font-size:12px;line-height:44px;overflow:hidden;position:relative}.pay-input:first-child{margin-top:10px;border-top:1px solid #e6e6e6}div.pay-input-r{padding-right:0}.pay-input-r .p-text-yanz{margin-right:110px}.pay-input-one{border-top:1px solid #e6e6e6}.pay-input input{width:100%;padding:6px 0;line-height:15px;border:1px solid #fff;text-align:right}.input-label{width:60px;height:40px;top:0;left:15px;position:absolute}.input-yanz{width:90px;height:44px;color:#2f00ee;border-left:1px solid #e6e6e6;top:0;right:5px;position:absolute;text-align:center}.input-shouji{width:90px;height:44px;color:#576b95;border-left:1px solid #e6e6e6;top:0;right:5px;position:absolute;text-align:center}.pay-card-a{padding:15px 15px 8px;text-align:right;font-size:12px}.pay-card-a label{float:left;color:#999}.pay-card-a a{color:#576b95}.pay-card-key{padding:10px 15px;height:48px;line-height:22px;font-size:12px;color:#999}.pay-card-key a{color:#576b95;margin-left:20px}.card-key-tips{color:#999}.pay-card-tips{padding:15px 15px 5px;color:#999}.pay-change{border-top:1px solid #e6e6e6;line-height:22px;border-bottom:1px solid #e6e6e6;background-color:#fff;padding:0 15px 0 56px}.pay-change a{width:100%;line-height:20px;padding:10px 0;display:block;color:#999}.pay-change em{font-size:14px;color:#333;margin-right:10px}.pay-change a .r{line-height:40px;padding-right:12px;background:url(../images/pay.png) no-repeat right -65px;background-size:36px auto}.card_bank{background:#fff url(../images/ccbc.png) no-repeat 15px center;background-size:32px auto}.card_ccbc{background:#fff url(../images/ccbc.png) no-repeat 15px center;background-size:32px auto}.card_mobile{border-top:0}.pay-card-now{border-top:1px solid #e6e6e6;border-bottom:1px solid #e6e6e6;color:#999;line-height:22px;background-color:#fff;padding:12px 15px 12px 56px}.pay-card-now em{font-size:14px;color:#333;margin-right:10px}.pay-card-ul{border-bottom:1px solid #e6e6e6}.pay-card-ul li{border-top:1px solid #e6e6e6;color:#999;line-height:22px;background-color:#fff;padding:12px 15px 12px 56px}.pay-card-ul li em{font-size:14px;color:#333;margin-right:10px}.pay-card-ul li.on .r{line-height:40px;margin-right:10px;padding-right:12px;background:url(../images/pay.png) no-repeat right -306px;background-size:36px auto}.pay-btn{padding:20px 10px 30px}.pay-btn input{width:100%;font-size:.8rem;border-radius:3px;background:#f3c978;display:block;padding:12px 0;color:#fff;text-align:center;border:1px solid #f3c978;background:-moz-linear-gradient(top,#f3c978,rgba(243,201,120,1));background:-webkit-gradient(linear,0 0,0 bottom,from(#f3c978),to(rgba(243,204,120,1)))}.pay-btn2 input{width:100%;font-size:.8rem;border-radius:3px;background:#f5a200;display:block;padding:12px 0;color:#fff;text-align:center;border:1px solid #f5a200;background:-moz-linear-gradient(top,#f5a200,rgba(245,162,0,1));background:-webkit-gradient(linear,0 0,0 bottom,from(#f5a200),to(rgba(245,162,0,1)))}.pay-btn3{padding:20px 10px 10px}.pay-btn3 input{width:100%;font-size:.8rem;border-radius:3px;background:#3276da;display:block;padding:12px 0;color:#fff;text-align:center;border:1px solid #3276da;background:-moz-linear-gradient(top,#3276da,rgba(50,118,218,1));background:-webkit-gradient(linear,0 0,0 bottom,from(#3276da),to(rgba(50,118,218,1)))}.xieyi-btn{position:fixed;bottom:0;width:100%;z-index:999;background:#fff}.pay-xieyi-btn{position:fixed;bottom:0;width:100%;z-index:999;background:#fff;padding-bottom:20px;height:60px}.js-keyboard-bg{width:100%;height:100%;position:fixed;top:0;left:0;background-color:rgba(0,0,0,0.5);display:none}.js-keyboard{width:100%;padding-bottom:1px;background:#fff;border-top:1px solid #e6e6e6;position:fixed;display:none;bottom:0;left:0}.keyboard-close{padding:5px 0;border-bottom:1px solid #c9ccd3;height:20px;background:#ebecee url(../images/pay.png) no-repeat center -345px;background-size:36px auto}.keyboard-title{text-align:center;padding:8px 0;border-bottom:1px solid #c9ccd3;line-height:20px;color:#687887;text-shadow:0 1px 1px #fff}.keyboard-title span{padding-left:20px;font-size:16px;background:url(../images/pay.png) no-repeat left -117px;background-size:36px auto}.keyboard-psw{padding:7px 0;position:relative;background:#ebecee;border-top:1px solid #f5f6f7}.keyboard-psw1{padding:7px 0;position:relative;background:#ebecee;border-top:1px solid #f5f6f7;border-bottom:1px solid #c9ccd3}.keyboard-psw2{padding:7px 0;position:relative;background:#ebecee;border-top:1px solid #f5f6f7;border-bottom:1px solid #c9ccd3}.js-keyboard .input-div{margin-left:5px;margin-right:64px}.js-keyboard .input-div-credit{margin-left:5px;margin-right:154px}.js-keyboard .input-div2{margin-left:5px;margin-right:5px}.js-keyboard .input-div1{margin-left:50px;margin-right:6px;text-align:right}.js-keyboard .input-div1 select{padding:8px 0;width:45%;border:1px solid #d4d3d7;text-indent:8px}.js-keyboard .input-div1 select.input-select1{border-top-left-radius:5px;border-bottom-left-radius:5px}.js-keyboard .input-div1 select.input-select2{border-top-right-radius:5px;border-bottom-right-radius:5px;border-left:0}.js-keyboard .input-select{width:100%;padding:8px 0;background:#fff;text-align:center;border:1px solid #d4d3d7;border-radius:5px;text-indent:20px}.js-keyboard .input-select span{margin:0 10px;display:block;background:url(../images/pay.png) no-repeat right -77px;background-size:36px auto}.js-keyboard .key-input{width:100%;padding:8px 0;background:#fff;text-indent:8px;border:1px solid #d4d3d7;border-radius:5px}.js-keyboard .key-input1{width:100%;padding:8px 0;background:#fff;border:1px solid #d4d3d7;border-radius:5px;padding-left:90px}.js-keyboard .input-btn{width:48px;height:32px;line-height:32px;text-align:center;position:absolute;right:6px;top:8px;border:1px solid #d4d3d7;border-radius:3px;background:#fff}.js-keyboard .input-title{width:80px;height:30px;line-height:30px;position:absolute;left:15px;top:9px}.keyboard-key{border-top:1px solid #c9ccd3}.js-keyboard li{width:33.3%;float:left;height:42px;line-height:42px}.js-keyboard li div{border-left:1px solid #ddd;border-bottom:1px solid #ddd;height:41px;font-size:16px;background:#f5f5f5;text-align:center}.js-keyboard li div em{font-size:12px}.js-keyboard li div span{width:100%;height:100%;display:block;background:url(../images/pay.png) no-repeat center -148px;background-size:36px auto}.menuin{-webkit-animation:fadeInDown .3s .1s ease both;-moz-animation:fadeInDown .3s .1s ease both}@-webkit-keyframes fadeInDown{0{opacity:0;-webkit-transform:translateY(-10px)}100%{opacity:1;-webkit-transform:translateY(0)}}@-moz-keyframes fadeInDown{0{opacity:0;-moz-transform:translateY(-10px)}100%{opacity:1;-moz-transform:translateY(0)}}.menuout{-webkit-animation:fadeOutUp .3s .1s ease both;-moz-animation:fadeOutUp .3s .1s ease both}@-webkit-keyframes fadeOutUp{0{opacity:1;-webkit-transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-10px)}}@-moz-keyframes fadeOutUp{0{opacity:1;-moz-transform:translateY(0)}100%{opacity:0;-moz-transform:translateY(-10px)}}.rz-box{width:260px;font-size:14px;padding-top:12px;z-index:3;line-height:24px;position:fixed;top:36%;left:50%;margin-left:-130px;background:#fff;border-radius:10px;text-align:center;border:1px #dedfe0 solid;display:none}.rz-box span{width:100%;height:40px;margin-top:12px;display:block;line-height:40px;border-top:1px #dedfe0 solid}.comp{width:100%;height:48px;padding-top:15px;margin-top:12px;display:block;border-top:1px #dedfe0 solid}.combtnok{padding:8px 20px;background:#2e58ae;border:1px solid #2e58ae;border-radius:5px;margin:0 12px;color:#fff;font-size:14px}.combtngo{padding:8px 20px;background:#f5a200;border:1px solid #f5a200;border-radius:5px;margin:0 12px;color:#fff;font-size:14px}.loadMack{background:#000;opacity:.6;position:fixed;left:0;top:0;width:100%;height:100%;z-index:99800;display:none}.loadCon{background:#fff;width:120px;height:60px;line-height:30px;text-align:center;left:50%;top:50%;margin-left:-80px;margin-top:-36px;border-radius:6px;color:#333;font-size:14px;padding:15px 20px;position:fixed;z-index:99801;display:none}.box{padding-top:50px}.xieyi-bg{background:#fff;padding-bottom:50px}.pay-photo{display:table;margin:0 auto 0 auto}.pay-photo .table-cell{display:table-cell;text-align:center;vertical-align:middle}.pay-photo .photo-box{height:100px}.pay-photo .photo-box .img-box{width:80px;height:100px}.pay-photo .photo-box .img-box img{width:100%;height:100%}@media(orientation:portrait) and (min-width:400px) and (max-width:480px),(orientation:landscape) and (min-height:400px) and (max-height:480px){body{font-size:15px}.yinlian{width:45px}.imgyin{width:38px;height:38px}.imgcheck{width:20px;height:20px}.box{padding-top:62px}div.pay-info-error li div{margin-left:70px}.header{height:52px;line-height:52px}.header-title{height:52px;line-height:52px}.header-title h1{font-size:18px}.tool-back{width:36px;height:52px;background-position:center 16px;background-size:42px auto}.tool-logo{width:45px;height:52px;background-position:center -36px;background-size:42px auto}.pay-step{height:100px;line-height:24px}.step-line{top:33px}.li-line{top:33px}.li-num{top:20px}.li-num span{width:24px;height:24px}.pay-info-bottom{height:20px}.pay-info-notes{padding:10px 0;margin:0 15px;line-height:24px;font-size:14px}.pay-value{line-height:32px;font-size:16px}.pay-value span{font-size:24px}.pay-ok{padding:20px 0;margin:0 15px;line-height:32px;font-size:16px}.pay-ok span{font-size:24px;padding-left:32px;background-position:left -280px;background-size:36px auto}.pay-shenhe{padding:15px 0;margin:0 15px;line-height:36px;font-size:16px}.pay-shenhe span{font-size:22px}.pay-shenhe p{line-height:24px}.pay-error{padding:15px;margin-bottom:10px}.pay-error p{line-height:24px;font-size:14px}.pay-xieyi{padding:20px;line-height:27px;font-size:16px}.pay-xieyi h1{font-size:20px;height:48px;font-weight:100px;line-height:45px}.pay-xieyi p{margin-bottom:15px}.pay-banklist{padding:20px 0;line-height:27px;font-size:16px}.bank-list-title{padding:10px 0 10px 20px;line-height:24px;font-size:16px}.bank-list-title span{width:24%}.pay-banklist h1{font-size:20px;height:48px;font-weight:100px;line-height:36px}.bank-list-ul{padding-left:20px}.pay-banklist li{line-height:36px;height:36px;padding:10px 0}.pay-banklist li img{margin-right:5px}.pay-banklist li span{line-height:36px;width:24%}.pay-goods{font-size:14px}.pay-goods-h{height:24px}.pay-goods li{height:27px;line-height:27px}.pay-goods li.li-first{padding-right:18px;background-position:right -190px}.pay-goods li.li_down{background-position:right -230px}.pay-results{margin:0 15px;padding-top:12px;font-size:14px}.pay-results li{height:27px;line-height:27px}.pay-paizhao{padding:15px 0;line-height:27px}.pay-zhao{width:228px}.zhaopian{width:140px}.zhaopian_xz ul li{padding:3px 50px 0 0}.zhaopian_xz1{padding:20px 10px 0 0}.zhaopian_xz2{padding:5px 0 0 50px}.zhaopian_xz3{padding:20px 0 0 10px}.litpic_btn{width:72px;height:72px;background-size:50px auto;padding:0 0 0 5px}div.pay-input-crdit{padding-left:115px}div.pay-input-crdit .input-label{width:95px}.pay-input{height:45px;padding-left:90px;padding-right:15px;font-size:14px;line-height:45px}.input-label{width:72px;height:40px;left:15px}.input-yanz{width:90px;height:44px;right:5px}.input-shouji{width:90px;height:44px;right:5px}.pay-input input{padding:6px 0;line-height:15px}.pay-card-a{font-size:14px}.pay-card-key{padding:10px 15px;height:48px;line-height:24px;font-size:14px}.pay-card-key a{margin-left:20px}.pay-card-tips{padding:15px 15px 5px}.pay-change{line-height:24px;padding:0 15px 0 64px}.pay-change a{line-height:22px}.pay-change em{font-size:15px;margin-right:10px}.pay-change a .r{line-height:44px;padding-right:15px;background-position:right -77px;background-size:42px auto}.card_ccbc{background-position:18px center;background-size:36px auto}.pay-card-now{line-height:22px;padding:12px 15px 12px 56px}.pay-card-now em{font-size:14px;margin-right:10px}.pay-card-ul li{line-height:22px;padding:12px 15px 12px 56px}.pay-card-ul li em{font-size:14px;margin-right:10px}.pay-card-ul li.on .r{line-height:40px;margin-right:10px;padding-right:16px;background-position:right -356px;background-size:42px auto}.pay-btn input{font-size:.8rem;padding:12px 0}.pay-btn2 input{font-size:.8rem;padding:12px 0}.pay-btn3{padding:20px 10px 10px}.pay-btn3 input{font-size:.8rem;padding:12px 0}.zhaopian_img img{width:68px;height:85px}.js-keyboard{padding-bottom:1px}.keyboard-close{padding:8px 0;height:20px;background:#ebecee url(../images/pay.png) no-repeat center -342px;background-size:36px auto}.keyboard-title{padding:10px 0;line-height:24px;text-shadow:0 1px 1px #fff}.keyboard-title span{padding-left:20px;font-size:16px;background-position:left -117px;background-size:36px auto}.keyboard-psw{padding:7px 0}.keyboard-psw1{padding:7px 0}.keyboard-psw2{padding:7px 0}.js-keyboard .input-div{margin-left:5px;margin-right:64px}.js-keyboard .input-div-credit{margin-left:5px;margin-right:164px}.js-keyboard .input-div2{margin-left:5px;margin-right:5px}.js-keyboard .input-div1{margin-left:50px;margin-right:6px}.js-keyboard .input-div1 select{padding:8px 0;width:45%;text-indent:8px}.js-keyboard .input-div1 select.input-select1{border-top-left-radius:5px;border-bottom-left-radius:5px}.js-keyboard .input-div1 select.input-select2{border-top-right-radius:5px;border-bottom-right-radius:5px}.js-keyboard .input-select{padding:8px 0;border-radius:5px;text-indent:20px}.js-keyboard .input-select span{margin:0 10px;background-position:right -77px;background-size:36px auto}.js-keyboard .key-input{padding:8px 0;text-indent:8px;border-radius:5px}.js-keyboard .key-input1{padding:8px 0;padding-left:100px}.js-keyboard .input-btn{width:48px;height:36px;line-height:36px;right:6px;top:8px;border-radius:3px}.js-keyboard .input-title{width:90px;height:34px;line-height:34px;left:15px;top:9px}.js-keyboard li div{height:41px;font-size:16px}.js-keyboard li div em{font-size:12px}.js-keyboard li div span{background-position:center -148px;background-size:36px auto}}@media(orientation:portrait) and (min-width:480px) and (max-width:640px),(orientation:landscape) and (min-height:480px) and (max-height:640px){body{margin:0 auto;font-size:18px}.yinlian{width:48px}.imgyin{width:48px;height:48px}.imgcheck{width:24px;height:24px}.box{padding-top:86px}.xieyi-bg{padding-bottom:60px}div.pay-info-error li div{margin-left:90px}.header{height:66px;line-height:63px}.header-title{height:66px;line-height:66px}.header-title h1{font-size:24px}.tool-back{width:45px;height:63px;background-position:center 22px;background-size:54px auto}.tool-logo{width:54px;height:63px;background-position:center -45px;background-size:54px auto}.pay-step{height:125px;line-height:33px}.step-line{height:3px;top:45px}.pay-step li{padding-top:72px}.li-line{height:3px;top:45px}.li-num{top:26px}.li-num span{width:33px;height:33px;border:3px solid #999}.pay-info-bottom{height:18px}.pay-info-notes{padding:10px 0;margin:0 15px;line-height:33px;font-size:18px}.pay-value{line-height:45px;font-size:21px}.pay-value span{font-size:33px}.pay-ok{padding:20px 0;margin:0 15px;line-height:45px;font-size:21px}.pay-ok span{font-size:33px;padding-left:48px;background-position:left -415px;background-size:54px auto}.pay-shenhe{padding:15px 0;margin:0 15px;line-height:48px;font-size:20px}.pay-shenhe span{font-size:32px}.pay-shenhe p{line-height:33px}.pay-error{padding:15px;margin-bottom:10px}.pay-error p{line-height:33px;font-size:18px}.pay-xieyi{padding:20px;line-height:36px;font-size:21px}.pay-xieyi h1{font-size:24px;height:60px;font-weight:100px;line-height:54px}.pay-xieyi p{margin-bottom:12px}.pay-banklist{padding:20px 0;line-height:36px;font-size:21px}.bank-list-title{padding:10px 0 10px 20px;line-height:33px;font-size:21px}.bank-list-title span{width:24%}.pay-banklist h1{font-size:24px;height:63px;font-weight:100px;line-height:48px}.bank-list-ul{padding-left:20px}.pay-banklist li{line-height:48px;height:48px;padding:10px 0}.pay-banklist li img{margin-right:5px}.pay-banklist li span{line-height:48px;width:24%}.pay-goods{font-size:18px}.pay-goods-h{height:30px}.pay-goods li{height:32px;line-height:32px}.pay-goods li.li-first{padding-right:24px;background-position:right -288px;background-size:54px auto}.pay-goods li.li_down{background-position:right -348px}.pay-results{margin:0 15px;padding-top:10px;font-size:18px}.pay-results li{height:36px;line-height:36px}.pay-paizhao{padding:15px 0;line-height:36px}.pay-zhao{width:278px}.zhaopian{width:140px}.zhaopian_xz ul li{padding:3px 50px 0 0}.litpic_btn{width:64px;height:64px;background-size:50px auto;padding:0 0 0 5px}div.pay-input-crdit{padding-left:140px}div.pay-input-crdit .input-label{width:120px}.pay-input{height:66px;padding-left:110px;padding-right:15px;font-size:18px;line-height:66px}.pay-input-r .p-text-yanz{margin-right:120px}.input-label{width:90px;height:60px;left:15px}.input-yanz{width:100px;height:66px;right:5px}.input-shouji{width:100px;height:66px;right:5px}.pay-input input{padding:6px 0;line-height:20px;border:1px solid #fff}.pay-card-a{font-size:18px}.pay-card-key{padding:10px 15px;height:72px;line-height:33px;font-size:18px}.pay-card-key a{margin-left:20px}.pay-card-tips{padding:15px 15px 5px}.pay-change{line-height:33px;padding:0 15px 0 82px}.pay-change a{line-height:30px}.pay-change em{font-size:21px;margin-right:10px}.pay-change a .r{line-height:60px;padding-right:18px;background-position:right -96px;background-size:54px auto}.card_ccbc{background-position:20px center;background-size:54px auto}.pay-card-now{line-height:33px;padding:12px 15px 12px 82px}.pay-card-now em{font-size:21px;margin-right:10px}.pay-card-ul li{line-height:33px;padding:12px 15px 12px 82px}.pay-card-ul li em{font-size:21px;margin-right:10px}.pay-card-ul li.on .r{line-height:60px;margin-right:10px;padding-right:18px;background-position:right -458px;background-size:54px auto}.pay-btn input{font-size:1rem;padding:15px 0}.pay-btn2 input{font-size:1rem;padding:15px 0}.pay-btn3{padding:20px 10px 10px}.pay-btn3 input{font-size:1rem;padding:15px 0}.pay-xieyi-btn{height:50px;padding-bottom:35px}.js-keyboard{padding-bottom:1px;display:none}.keyboard-title{padding:6px 0;line-height:20px;text-shadow:0 1px 1px #fff}.keyboard-close{padding:8px 0;height:30px;background:#ebecee url(../images/pay.png) no-repeat center -518px;background-size:54px auto}.keyboard-title span{padding-left:20px;font-size:16px;background-position:left -117px;background-size:36px auto}.keyboard-psw{padding:7px 0}.keyboard-psw1{padding:7px 0}.keyboard-psw2{padding:7px 0}.js-keyboard .input-div{margin-left:5px;margin-right:80px}.js-keyboard .input-div-credit{margin-left:5px;margin-right:200px}.js-keyboard .input-div2{margin-left:5px;margin-right:5px}.js-keyboard .input-div1{margin-left:50px;margin-right:6px}.js-keyboard .input-div1 select{padding:8px 0;width:45%;text-indent:8px}.js-keyboard .input-div1 select.input-select1{border-top-left-radius:5px;border-bottom-left-radius:5px}.js-keyboard .input-div1 select.input-select2{border-top-right-radius:5px;border-bottom-right-radius:5px}.js-keyboard .input-select{padding:12px 0;border-radius:5px;text-indent:20px}.js-keyboard .input-select span{margin:0 10px;background-position:right -115px;background-size:54px auto}.js-keyboard .key-input{padding:8px 0;text-indent:8px;border-radius:5px}.js-keyboard .key-input1{padding:8px 0;padding-left:120px}.js-keyboard .input-btn{width:60px;height:40px;line-height:40px;top:8px;border-radius:3px}.js-keyboard .input-title{width:120px;height:45px;line-height:45px;left:15px;top:7px}.zhaopian_img img{width:80px;height:100px}.js-keyboard li div{height:41px;font-size:16px}.js-keyboard li div em{font-size:12px}.js-keyboard li div span{background-position:center -148px;background-size:36px auto}}@media(orientation:portrait){.js-keyboard li{width:33.3%;height:42px;line-height:42px}}@media(orientation:landscape){.js-keyboard li{width:25%;height:42px;line-height:42px}}@media(orientation:portrait) and (min-width:640px),(orientation:landscape) and (min-height:640px){body{margin:0 auto;font-size:20px}.yinlian{width:72px}.imgyin{width:64px;height:64px}.imgcheck{width:32px;height:32px}.box{padding-top:108px}.js-keyboard-bg{position:fixed}div.pay-info-error li div{margin-left:120px}.xieyi-bg{padding-bottom:80px}.header{height:88px;line-height:84px}.header-title{height:88px;line-height:88px}.header-title h1{font-size:32px}.tool-back{width:60px;height:84px;background-position:center 26px;background-size:72px auto}.tool-logo{width:72px;height:84px;background-position:center -60px;background-size:72px auto}.pay-step{height:160px;line-height:44px}.step-line{height:4px;top:55px}.pay-step li{padding-top:100px}.li-line{height:4px;top:55px}.li-num{top:32px}.li-num span{width:44px;height:44px;border:4px solid #999}.pay-info{margin-bottom:20px}.pay-info-bottom{height:32px}.pay-info-notes{padding:20px 0;margin:0 15px;line-height:44px;font-size:24px}.pay-value{line-height:60px;font-size:28px}.pay-value span{font-size:44px}.pay-ok{padding:20px 0;margin:0 15px;line-height:60px;font-size:28px}.pay-ok span{font-size:44px;padding-left:60px;background-position:left -552px;background-size:72px auto}.pay-shenhe{padding:15px 0;margin:0 15px;line-height:64px;font-size:28px}.pay-shenhe span{font-size:36px}.pay-shenhe p{line-height:44px}.pay-error{padding:15px;margin-bottom:10px}.pay-error p{line-height:44px;font-size:24px}.pay-xieyi{padding:20px;line-height:48px;font-size:28px}.pay-xieyi h1{font-size:32px;height:80px;font-weight:100px;line-height:72px}.pay-xieyi p{margin-bottom:12px}.pay-banklist{padding:20px 0;line-height:48px;font-size:28px}.bank-list-title{padding:10px 0 10px 20px;line-height:44px;font-size:28px}.bank-list-title span{width:24%}.pay-banklist h1{font-size:32px;height:84px;font-weight:100px;line-height:64px}.bank-list-ul{padding-left:20px}.pay-banklist li{line-height:64px;height:64px;padding:20px 0}.pay-banklist li img{margin-right:5px}.pay-banklist li span{line-height:64px;width:24%}.pay-goods{padding-top:20px;font-size:24px}.pay-goods-h{height:40px}.pay-goods li{height:48px;line-height:48px}.pay-goods li.li-first{padding-right:32px;background-position:right -380px;background-size:72px auto}.pay-goods li.li_down{background-position:right -460px}.pay-results{margin:0 15px;padding-top:10px;font-size:24px}.pay-results li{height:48px;line-height:48px}.pay-paizhao{padding:15px 0;line-height:48px}.pay-zhao{width:386px}.zhaopian_img img{width:100px;height:125px}.zhaopian{width:200px}.zhaopian_xz ul li{padding:5px 10px 0 0}.zhaopian_xz1 img{width:32px}.zhaopian_xz2 img{width:32px}.zhaopian_xz3 img{width:32px}.zhaopian_xz1{padding:40px 10px 0 0}.zhaopian_xz2{padding:5px 0 0 75px}.zhaopian_xz3{padding:40px 0 0 10px}.litpic_btn{width:128px;height:128px;background-size:100px auto;padding:0 0 0 5px}div.pay-input-crdit{padding-left:190px}div.pay-input-crdit .input-label{width:150px}.pay-input{height:88px;padding-left:170px;padding-right:30px;font-size:24px;line-height:88px}.pay-input-r .p-text-yanz{margin-right:200px}.input-label{width:125px;height:80px;left:30px}.input-yanz{width:180px;height:88px;right:5px}.input-shouji{width:180px;height:88px;border-left:1px solid #e6e6e6;right:5px}.pay-input input{padding:12px 0;line-height:30px}.pay-card-a{padding:30px 15px 16px;font-size:24px}.pay-card-key{padding:10px 15px;height:96px;line-height:44px;font-size:24px}.pay-card-key a{margin-left:20px}.pay-card-tips{padding:15px 15px 5px}.pay-change{line-height:44px;padding:0 15px 0 112px}.pay-change a{line-height:40px;padding:20px 0}.pay-change em{font-size:28px;margin-right:20px}.pay-change a .r{line-height:80px;padding-right:24px;background-position:right -130px;background-size:72px auto}.card_ccbc{background-position:30px center;background-size:64px auto}.pay-card-now{line-height:44px;padding:12px 15px 12px 112px}.pay-card-now em{font-size:28px;margin-right:10px}.pay-card-ul li{line-height:44px;padding:12px 15px 12px 112px}.pay-card-ul li em{font-size:28px;margin-right:10px}.pay-card-ul li.on .r{line-height:80px;margin-right:10px;padding-right:24px;background-position:right -612px;background-size:72px auto}.pay-btn input{font-size:24px;border-radius:3px;padding:18px 0}.pay-btn2 input{font-size:24px;border-radius:3px;padding:18px 0}.pay-btn3{padding:20px 10px 10px}.pay-btn3 input{font-size:24px;border-radius:3px;padding:18px 0}.pay-xieyi-btn{height:70px;padding-bottom:35px}.js-keyboard{padding-bottom:1px}.keyboard-close{padding:10px 0;height:20px;background:#ebecee url(../images/pay.png) no-repeat center -696px;background-size:72px auto}.keyboard-title{padding:6px 0;line-height:20px;text-shadow:0 1px 1px #fff}.keyboard-title span{padding-left:40px;font-size:16px;line-height:36px;display:inline-block;background-position:left -238px;background-size:72px auto}.keyboard-psw{padding:7px 0}.keyboard-psw1{padding:7px 0}.keyboard-psw2{padding:7px 0}.js-keyboard .input-div{margin-left:10px;margin-right:110px}.js-keyboard .input-div-credit{margin-left:5px;margin-right:270px}.js-keyboard .input-div2{margin-left:5px;margin-right:5px}.js-keyboard .input-div1{margin-left:50px;margin-right:6px}.js-keyboard .input-div1 select{padding:16px 0;width:45%;text-indent:8px}.js-keyboard .input-div1 select.input-select1{border-top-left-radius:5px;border-bottom-left-radius:5px}.js-keyboard .input-div1 select.input-select2{border-top-right-radius:5px;border-bottom-right-radius:5px}.js-keyboard .input-select{padding:9px 0;border-radius:5px;text-indent:20px}.js-keyboard .input-select span{margin:0 10px;background-position:right -154px;background-size:72px auto}.js-keyboard .key-input{padding:9px 0;text-indent:8px;border-radius:5px}.js-keyboard .key-input1{padding:9px 0;border-radius:5px;padding-left:160px}.js-keyboard .input-btn{width:80px;height:44px;line-height:44px;top:7px;border-radius:3px}.js-keyboard .input-title{width:160px;height:60px;line-height:60px;left:15px;top:1px}.js-keyboard li div{border-left:1px solid #ddd;height:41px;font-size:16px}.js-keyboard li div em{font-size:16px}.js-keyboard li div span{background-position:center -148px;background-size:36px auto}}.ui-dialog{display:-webkit-box;position:absolute;position:fixed;left:50%;top:50%;max-width:400px;max-height:90%;-webkit-transform:translate(-50%,-50%);width:80%;border-radius:.4em}.ui-dialog-inner{font-family:"微软雅黑";-webkit-box-flex:1;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;z-index:1000;min-width:200px;max-height:90%;background:#f9f9f9;border-radius:.4em}.ui-dialog a{text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.ui-dialog-header{display:none;position:relative;overflow:hidden;height:44px;border:0;border-radius:.4em .4em 0 0;border-bottom:1px solid #3b1313;background-image:-webkit-gradient(linear,left top,left bottom,from(#e36482),to(#8e0c2b));background-image:-webkit-linear-gradient(#e36482,#8e0c2b);background-image:linear-gradient(#e36482,#8e0c2b);-webkit-box-sizing:border-box;box-sizing:border-box}.ui-dialog-header h2{color:#FFF;text-align:center;font-weight:normal;font-size:16px;line-height:44px;margin:0 30% .6em}.ui-dialog-header .ui-dialog-btn{position:absolute;right:12px;top:8px;margin:0;width:26px;height:26px;background-image:-webkit-gradient(linear,left top,left bottom,from(#fe9fb5),to(#911f3a));background-image:-webkit-linear-gradient(#fe9fb5,#911f3a);background-image:linear-gradient(#fe9fb5,#911f3a);border-radius:30px;text-align:center}.ui-dialog-header a:hover{background:#93213c}.ui-dialog-header a:after{content:'×';font-weight:bold;font-size:18px;line-height:26px;vertical-align:top;color:#FFF}.ui-dialog-cont-wrapper{-webkit-box-flex:1;overflow-y:auto;overflow-x:hidden;padding:1.5em 1em .5em;text-shadow:none;color:#2d212f;text-align:center;line-height:1.5}.ui-dialog-cont-wrapper{border-bottom:solid 1px #ccc;padding-bottom:1em}.ui-dialog-content{display:inline-block;text-align:left}.ui-dialog-btn-wrapper{text-align:center;margin-bottom:15px;margin-top:10px}.ui-dialog-btn-wrapper .ui-dialog-btn:only-child{width:70%}.ui-dialog-btn{display:inline-block;line-height:36px;margin:0 2%;width:35%;color:#FFF;border-radius:3px}.ui-dialog .btn-a{background-color:#1fc1d8}.ui-dialog .btn-b{background-color:#f5a200}.ui-dialog-mask{background:rgba(0,0,0,.5);-webkit-transform:none;width:100%;height:100%;max-height:none;max-width:none;left:0;top:0;-webkit-box-pack:center;-webkit-box-align:center;border-radius:0;box-shadow:none}.ui-dialog-mask .ui-dialog-inner{-webkit-box-flex:0;width:70%;max-width:400px}.loadDiv{width:120px;height:60px;line-height:30px;text-align:center}.loadDiv .img{margin:auto;background:url(../images/loading.gif) left no-repeat;width:32px;height:32px} \ No newline at end of file diff --git a/roncoo-pay-web-boss/src/main/webapp/common/scan/pay-min.css b/roncoo-pay-web-boss/src/main/webapp/common/scan/pay-min.css new file mode 100644 index 0000000000000000000000000000000000000000..fffa941af37680c293a1fca4572d971eba5e8674 --- /dev/null +++ b/roncoo-pay-web-boss/src/main/webapp/common/scan/pay-min.css @@ -0,0 +1 @@ +html{height:100%;font-size:1em;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight:rgba(0,0,0,0);-webkit-text-size-adjust:none}body{margin:0 auto;height:100%;font-size:12px;background:#f0f0f0;color:#333}body,input,button,select,textarea,sub{font-family:microsoft yahei,Verdana,Arial,Helvetica,sans-serif}label{cursor:pointer}a:link,a:visited{text-decoration:none}input,button,select,textarea{outline:0}input[type="text"],input[type="tel"],input[type="password"],input[type="number"],textarea{-webkit-appearance:none}textarea{resize:none}a,abbr,acronym,address,applet,article,aside,audio,b,blockquote,big,body,center,canvas,caption,cite,code,command,datalist,dd,del,details,dfn,dl,div,dt,em,embed,fieldset,figcaption,figure,font,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,keygen,label,legend,li,meter,nav,menu,object,ol,output,p,pre,progress,q,s,samp,section,small,span,source,strike,strong,sub,sup,table,tbody,tfoot,thead,th,tr,tdvideo,tt,u,ul,var{margin:0;padding:0}ol,ul,li,dl,dd,dt{list-style:none}article,aside,footer,header,hgroup,nav,section,figure,figcaption{display:block}h1,h2,h3,h4,h5,h6,th,td,table,input,button,select,textarea,sub{font-size:1em}em,cite,address,optgroup,i{font-style:normal}kbd,samp,code{font-family:monospace}img,input,button,select,textarea{vertical-align:middle}img,fieldset{border:0}abbr,acronym{cursor:help;border-bottom:1px dotted black}table{border-spacing:0;border:0}table th,table td{border:0}legend,hr{overflow:hidden;position:absolute;left:0}legend,hr,caption{visibility:hidden;font-size:0;width:0;height:0;line-height:0}body.fixed{overflow:hidden}.l,.left{float:left}.r,.right{float:right}.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}/*\*/.clearfix{display:block}/**/.none{display:none}.block{display:block}.inline{display:inline}.hidden{overflow:hidden}.formAddBankCard{display:none}.pay-card-ul li a:link,.pay-card-ul li a:visited,.pay-card-ul li a:hover,.pay-card-ul li a:active{color:#999;text-decoration:none}a{text-decoration:none}ol,ul,li,nav{list-style:none}.header{width:100%;height:44px;line-height:42px;background:#1fc1d8;border-bottom:1px solid #ddd;position:fixed;top:0;z-index:999}.header-title{margin:0 32px;height:44px;line-height:44px;overflow:hidden;text-align:center}.header-title h1{font-size:16px;color:#fff}.tool-back{width:30px;height:42px;position:absolute;left:5px;top:0;background:url(../images/pay.png) no-repeat center 13px;background-size:36px auto}.tool-logo{width:36px;height:42px;position:absolute;right:5px;top:0;background:url(../images/pay.png) no-repeat center -30px;background-size:36px auto}.hide{overflow:hidden}.box_bg{width:100%;height:100%;position:absolute;left:0;top:0;z-index:1;background-color:rgba(0,0,0,0.7);display:none}.pay-step{margin:0 20px;height:83px;line-height:22px;position:relative}.step-line{width:100%;height:2px;background:#999;position:absolute;top:30px}.pay-step ul{display:table;width:100%}.pay-step li{display:table-cell;padding-top:48px;color:#999;text-align:center;position:relative}.li-line{width:100%;height:2px;background:#999;position:absolute;left:0;top:30px}.pay-step li.on .li-line{background-color:#f5a200}.li-num{width:100%;position:absolute;left:0;top:18px}.li-num span{width:22px;height:22px;border:2px solid #999;color:#666;display:block;background:#f0f0f0;margin:0 auto;border-radius:50%}.pay-step li.on span{background:#f5a200;border-color:#f5a200;color:#fff;background-clip:padding-box}.pay-info{width:100%;background:#fff;color:#999;margin-bottom:10px;border-top:1px solid #e6e6e6}.pay-info-bottom{width:100%;height:18px;overflow:hidden;background:url(../images/pay.png) repeat-x center bottom;background-size:36px auto}div.pay-info-error{margin-top:30px;padding-bottom:20px;border-bottom:1px solid #ddd}div.pay-info-error li{text-align:left;position:relative;word-wrap:break-word;word-break:normal;overflow:visible;height:auto}div.pay-info-error li span{display:block;float:none;text-align:left;position:absolute;top:0;left:0}div.pay-info-error li div{float:none;margin-left:60px}.pay-info-notes{padding:10px 0;margin:0 15px;border-bottom:1px solid #ececec;color:#666;line-height:22px;font-size:12px;text-align:center}.pay-value{padding:10px 0;margin:0 15px;border-bottom:1px solid #ececec;color:#666;line-height:30px;font-size:14px;text-align:center}.pay-value span{font-size:22px;color:#f5a200}.pay-ok{padding:20px 0;margin:0 15px;border-bottom:1px solid #ececec;color:#666;line-height:30px;font-size:14px;text-align:center}.pay-ok span{font-size:22px;padding-left:32px;color:#5ab208;background:url(../images/pay.png) no-repeat left -280px;background-size:36px auto}.pay-fail{padding:20px 0;margin:0 15px;border-bottom:1px solid #ececec;color:#666;line-height:30px;font-size:14px;text-align:center}.pay-fail span{font-size:22px;padding-left:32px;color:#f41016;background:url(../images/pay-fail.png) no-repeat left 1px;background-size:25px auto}.pay-shenhe{padding:15px 0;margin:0 15px;border-bottom:1px solid #ececec;color:#999;line-height:32px;font-size:14px;text-align:center}.pay-shenhe span{font-size:18px;color:#f5a200}.pay-shenhe p{line-height:22px}.pay-error{padding:15px;background:#fff;margin-bottom:10px;border-top:1px solid #e6e6e6;border-bottom:1px solid #e6e6e6;color:#999}.pay-error p{line-height:22px;font-size:12px}.pay-xieyi{padding:20px;line-height:24px;font-size:14px}.pay-xieyi h1{font-size:16px;height:40px;font-weight:100px;line-height:36px;text-align:center}.pay-xieyi p{margin-bottom:12px}.pay-banklist{padding:20px 0;line-height:24px;font-size:14px}.bank-list-title{padding:10px 0 10px 20px;background:#fff;border-top:1px solid #e6e6e6;border-bottom:1px solid #e6e6e6;line-height:22px;font-size:14px}.bank-list-title span{width:24%;text-align:center;float:right}.pay-banklist h1{font-size:16px;height:42px;font-weight:100px;line-height:32px;text-align:center}.bank-list-ul{padding-left:20px}.pay-banklist li{line-height:32px;height:32px;padding:10px 0;border-bottom:1px solid #bfbfc1}.pay-banklist li img{margin-right:5px}.pay-banklist li span{line-height:32px;width:24%;float:right;text-align:center}.pay-goods{margin:0 15px;padding-top:10px;overflow:hidden;font-size:12px}.pay-goods-h{height:20px}.pay-goods li{text-align:right;height:24px;line-height:24px;overflow:hidden}.pay-goods li.li-first{padding-right:16px;background:url(../images/pay.png) no-repeat right -190px;background-size:36px auto}.pay-goods li.li_down{background-position:right -230px}.pay-goods span{float:left}.pay-goods p{text-align:center}.pay-goods a{color:#576b95}.pay-results{margin:0 15px;padding-top:10px;font-size:12px}.pay-results li{text-align:right;height:24px;line-height:24px;overflow:hidden}.pay-results span{float:left}.pay-paizhao{text-align:center;color:#666;padding:15px 0;line-height:24px}.pay-zhao{width:218px;margin:0 auto}.zhaopian{width:140px;float:left}.zhaopian_xz ul li{float:left;padding:3px 20px 0 0}.zhaopian_xz1{float:left;padding:20px 10px 0 0}.zhaopian_img{float:left}.zhaopian_img img{width:60px;height:75px}.zhaopian_xz2{float:left;clear:both;text-align:center;padding:5px 0 0 48px}.zhaopian_xz3{float:left;padding:20px 0 0 10px}.litpic_btn{width:64px;height:64px;background:url(../images/paizhao.png) no-repeat center center;background-size:50px auto;position:relative;overflow:hidden;float:left}div.pay-input-crdit{padding-left:100px}div.pay-input-crdit .input-label{width:90px}.pay-input{height:44px;padding-left:80px;padding-right:15px;border-bottom:1px solid #e6e6e6;background:#fff;font-size:12px;line-height:44px;overflow:hidden;position:relative}.pay-input:first-child{margin-top:10px;border-top:1px solid #e6e6e6}div.pay-input-r{padding-right:0}.pay-input-r .p-text-yanz{margin-right:110px}.pay-input-one{border-top:1px solid #e6e6e6}.pay-input input{width:100%;padding:6px 0;line-height:15px;border:1px solid #fff;text-align:right}.input-label{width:60px;height:40px;top:0;left:15px;position:absolute}.input-yanz{width:90px;height:44px;color:#2f00ee;border-left:1px solid #e6e6e6;top:0;right:5px;position:absolute;text-align:center}.input-shouji{width:90px;height:44px;color:#576b95;border-left:1px solid #e6e6e6;top:0;right:5px;position:absolute;text-align:center}.pay-card-a{padding:15px 15px 8px;text-align:right;font-size:12px}.pay-card-a label{float:left;color:#999}.pay-card-a a{color:#576b95}.pay-card-key{padding:10px 15px;height:48px;line-height:22px;font-size:12px;color:#999}.pay-card-key a{color:#576b95;margin-left:20px}.card-key-tips{color:#999}.pay-card-tips{padding:15px 15px 5px;color:#999}.pay-change{border-top:1px solid #e6e6e6;line-height:22px;border-bottom:1px solid #e6e6e6;background-color:#fff;padding:0 15px 0 56px}.pay-change a{width:100%;line-height:20px;padding:10px 0;display:block;color:#999}.pay-change em{font-size:14px;color:#333;margin-right:10px}.pay-change a .r{line-height:40px;padding-right:12px;background:url(../images/pay.png) no-repeat right -65px;background-size:36px auto}.card_bank{background:#fff url(../images/ccbc.png) no-repeat 15px center;background-size:32px auto}.card_ccbc{background:#fff url(../images/ccbc.png) no-repeat 15px center;background-size:32px auto}.card_mobile{border-top:0}.pay-card-now{border-top:1px solid #e6e6e6;border-bottom:1px solid #e6e6e6;color:#999;line-height:22px;background-color:#fff;padding:12px 15px 12px 56px}.pay-card-now em{font-size:14px;color:#333;margin-right:10px}.pay-card-ul{border-bottom:1px solid #e6e6e6}.pay-card-ul li{border-top:1px solid #e6e6e6;color:#999;line-height:22px;background-color:#fff;padding:12px 15px 12px 56px}.pay-card-ul li em{font-size:14px;color:#333;margin-right:10px}.pay-card-ul li.on .r{line-height:40px;margin-right:10px;padding-right:12px;background:url(../images/pay.png) no-repeat right -306px;background-size:36px auto}.pay-btn{padding:20px 10px 30px}.pay-btn input{width:100%;font-size:.8rem;border-radius:3px;background:#f3c978;display:block;padding:12px 0;color:#fff;text-align:center;border:1px solid #f3c978;background:-moz-linear-gradient(top,#f3c978,rgba(243,201,120,1));background:-webkit-gradient(linear,0 0,0 bottom,from(#f3c978),to(rgba(243,204,120,1)))}.pay-btn2 input{width:100%;font-size:.8rem;border-radius:3px;background:#f5a200;display:block;padding:12px 0;color:#fff;text-align:center;border:1px solid #f5a200;background:-moz-linear-gradient(top,#f5a200,rgba(245,162,0,1));background:-webkit-gradient(linear,0 0,0 bottom,from(#f5a200),to(rgba(245,162,0,1)))}.pay-btn3{padding:20px 10px 10px}.pay-btn3 input{width:100%;font-size:.8rem;border-radius:3px;background:#3276da;display:block;padding:12px 0;color:#fff;text-align:center;border:1px solid #3276da;background:-moz-linear-gradient(top,#3276da,rgba(50,118,218,1));background:-webkit-gradient(linear,0 0,0 bottom,from(#3276da),to(rgba(50,118,218,1)))}.xieyi-btn{position:fixed;bottom:0;width:100%;z-index:999;background:#fff}.pay-xieyi-btn{position:fixed;bottom:0;width:100%;z-index:999;background:#fff;padding-bottom:20px;height:60px}.js-keyboard-bg{width:100%;height:100%;position:fixed;top:0;left:0;background-color:rgba(0,0,0,0.5);display:none}.js-keyboard{width:100%;padding-bottom:1px;background:#fff;border-top:1px solid #e6e6e6;position:fixed;display:none;bottom:0;left:0}.keyboard-close{padding:5px 0;border-bottom:1px solid #c9ccd3;height:20px;background:#ebecee url(../images/pay.png) no-repeat center -345px;background-size:36px auto}.keyboard-title{text-align:center;padding:8px 0;border-bottom:1px solid #c9ccd3;line-height:20px;color:#687887;text-shadow:0 1px 1px #fff}.keyboard-title span{padding-left:20px;font-size:16px;background:url(../images/pay.png) no-repeat left -117px;background-size:36px auto}.keyboard-psw{padding:7px 0;position:relative;background:#ebecee;border-top:1px solid #f5f6f7}.keyboard-psw1{padding:7px 0;position:relative;background:#ebecee;border-top:1px solid #f5f6f7;border-bottom:1px solid #c9ccd3}.keyboard-psw2{padding:7px 0;position:relative;background:#ebecee;border-top:1px solid #f5f6f7;border-bottom:1px solid #c9ccd3}.js-keyboard .input-div{margin-left:5px;margin-right:64px}.js-keyboard .input-div-credit{margin-left:5px;margin-right:154px}.js-keyboard .input-div2{margin-left:5px;margin-right:5px}.js-keyboard .input-div1{margin-left:50px;margin-right:6px;text-align:right}.js-keyboard .input-div1 select{padding:8px 0;width:45%;border:1px solid #d4d3d7;text-indent:8px}.js-keyboard .input-div1 select.input-select1{border-top-left-radius:5px;border-bottom-left-radius:5px}.js-keyboard .input-div1 select.input-select2{border-top-right-radius:5px;border-bottom-right-radius:5px;border-left:0}.js-keyboard .input-select{width:100%;padding:8px 0;background:#fff;text-align:center;border:1px solid #d4d3d7;border-radius:5px;text-indent:20px}.js-keyboard .input-select span{margin:0 10px;display:block;background:url(../images/pay.png) no-repeat right -77px;background-size:36px auto}.js-keyboard .key-input{width:100%;padding:8px 0;background:#fff;text-indent:8px;border:1px solid #d4d3d7;border-radius:5px}.js-keyboard .key-input1{width:100%;padding:8px 0;background:#fff;border:1px solid #d4d3d7;border-radius:5px;padding-left:90px}.js-keyboard .input-btn{width:48px;height:32px;line-height:32px;text-align:center;position:absolute;right:6px;top:8px;border:1px solid #d4d3d7;border-radius:3px;background:#fff}.js-keyboard .input-title{width:80px;height:30px;line-height:30px;position:absolute;left:15px;top:9px}.keyboard-key{border-top:1px solid #c9ccd3}.js-keyboard li{width:33.3%;float:left;height:42px;line-height:42px}.js-keyboard li div{border-left:1px solid #ddd;border-bottom:1px solid #ddd;height:41px;font-size:16px;background:#f5f5f5;text-align:center}.js-keyboard li div em{font-size:12px}.js-keyboard li div span{width:100%;height:100%;display:block;background:url(../images/pay.png) no-repeat center -148px;background-size:36px auto}.menuin{-webkit-animation:fadeInDown .3s .1s ease both;-moz-animation:fadeInDown .3s .1s ease both}@-webkit-keyframes fadeInDown{0{opacity:0;-webkit-transform:translateY(-10px)}100%{opacity:1;-webkit-transform:translateY(0)}}@-moz-keyframes fadeInDown{0{opacity:0;-moz-transform:translateY(-10px)}100%{opacity:1;-moz-transform:translateY(0)}}.menuout{-webkit-animation:fadeOutUp .3s .1s ease both;-moz-animation:fadeOutUp .3s .1s ease both}@-webkit-keyframes fadeOutUp{0{opacity:1;-webkit-transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-10px)}}@-moz-keyframes fadeOutUp{0{opacity:1;-moz-transform:translateY(0)}100%{opacity:0;-moz-transform:translateY(-10px)}}.rz-box{width:260px;font-size:14px;padding-top:12px;z-index:3;line-height:24px;position:fixed;top:36%;left:50%;margin-left:-130px;background:#fff;border-radius:10px;text-align:center;border:1px #dedfe0 solid;display:none}.rz-box span{width:100%;height:40px;margin-top:12px;display:block;line-height:40px;border-top:1px #dedfe0 solid}.comp{width:100%;height:48px;padding-top:15px;margin-top:12px;display:block;border-top:1px #dedfe0 solid}.combtnok{padding:8px 20px;background:#2e58ae;border:1px solid #2e58ae;border-radius:5px;margin:0 12px;color:#fff;font-size:14px}.combtngo{padding:8px 20px;background:#f5a200;border:1px solid #f5a200;border-radius:5px;margin:0 12px;color:#fff;font-size:14px}.loadMack{background:#000;opacity:.6;position:fixed;left:0;top:0;width:100%;height:100%;z-index:99800;display:none}.loadCon{background:#fff;width:120px;height:60px;line-height:30px;text-align:center;left:50%;top:50%;margin-left:-80px;margin-top:-36px;border-radius:6px;color:#333;font-size:14px;padding:15px 20px;position:fixed;z-index:99801;display:none}.box{padding-top:50px}.xieyi-bg{background:#fff;padding-bottom:50px}.pay-photo{display:table;margin:0 auto 0 auto}.pay-photo .table-cell{display:table-cell;text-align:center;vertical-align:middle}.pay-photo .photo-box{height:100px}.pay-photo .photo-box .img-box{width:80px;height:100px}.pay-photo .photo-box .img-box img{width:100%;height:100%}@media(orientation:portrait) and (min-width:400px) and (max-width:480px),(orientation:landscape) and (min-height:400px) and (max-height:480px){body{font-size:15px}.yinlian{width:45px}.imgyin{width:38px;height:38px}.imgcheck{width:20px;height:20px}.box{padding-top:62px}div.pay-info-error li div{margin-left:70px}.header{height:52px;line-height:52px}.header-title{height:52px;line-height:52px}.header-title h1{font-size:18px}.tool-back{width:36px;height:52px;background-position:center 16px;background-size:42px auto}.tool-logo{width:45px;height:52px;background-position:center -36px;background-size:42px auto}.pay-step{height:100px;line-height:24px}.step-line{top:33px}.li-line{top:33px}.li-num{top:20px}.li-num span{width:24px;height:24px}.pay-info-bottom{height:20px}.pay-info-notes{padding:10px 0;margin:0 15px;line-height:24px;font-size:14px}.pay-value{line-height:32px;font-size:16px}.pay-value span{font-size:24px}.pay-ok{padding:20px 0;margin:0 15px;line-height:32px;font-size:16px}.pay-ok span{font-size:24px;padding-left:32px;background-position:left -280px;background-size:36px auto}.pay-shenhe{padding:15px 0;margin:0 15px;line-height:36px;font-size:16px}.pay-shenhe span{font-size:22px}.pay-shenhe p{line-height:24px}.pay-error{padding:15px;margin-bottom:10px}.pay-error p{line-height:24px;font-size:14px}.pay-xieyi{padding:20px;line-height:27px;font-size:16px}.pay-xieyi h1{font-size:20px;height:48px;font-weight:100px;line-height:45px}.pay-xieyi p{margin-bottom:15px}.pay-banklist{padding:20px 0;line-height:27px;font-size:16px}.bank-list-title{padding:10px 0 10px 20px;line-height:24px;font-size:16px}.bank-list-title span{width:24%}.pay-banklist h1{font-size:20px;height:48px;font-weight:100px;line-height:36px}.bank-list-ul{padding-left:20px}.pay-banklist li{line-height:36px;height:36px;padding:10px 0}.pay-banklist li img{margin-right:5px}.pay-banklist li span{line-height:36px;width:24%}.pay-goods{font-size:14px}.pay-goods-h{height:24px}.pay-goods li{height:27px;line-height:27px}.pay-goods li.li-first{padding-right:18px;background-position:right -190px}.pay-goods li.li_down{background-position:right -230px}.pay-results{margin:0 15px;padding-top:12px;font-size:14px}.pay-results li{height:27px;line-height:27px}.pay-paizhao{padding:15px 0;line-height:27px}.pay-zhao{width:228px}.zhaopian{width:140px}.zhaopian_xz ul li{padding:3px 50px 0 0}.zhaopian_xz1{padding:20px 10px 0 0}.zhaopian_xz2{padding:5px 0 0 50px}.zhaopian_xz3{padding:20px 0 0 10px}.litpic_btn{width:72px;height:72px;background-size:50px auto;padding:0 0 0 5px}div.pay-input-crdit{padding-left:115px}div.pay-input-crdit .input-label{width:95px}.pay-input{height:45px;padding-left:90px;padding-right:15px;font-size:14px;line-height:45px}.input-label{width:72px;height:40px;left:15px}.input-yanz{width:90px;height:44px;right:5px}.input-shouji{width:90px;height:44px;right:5px}.pay-input input{padding:6px 0;line-height:15px}.pay-card-a{font-size:14px}.pay-card-key{padding:10px 15px;height:48px;line-height:24px;font-size:14px}.pay-card-key a{margin-left:20px}.pay-card-tips{padding:15px 15px 5px}.pay-change{line-height:24px;padding:0 15px 0 64px}.pay-change a{line-height:22px}.pay-change em{font-size:15px;margin-right:10px}.pay-change a .r{line-height:44px;padding-right:15px;background-position:right -77px;background-size:42px auto}.card_ccbc{background-position:18px center;background-size:36px auto}.pay-card-now{line-height:22px;padding:12px 15px 12px 56px}.pay-card-now em{font-size:14px;margin-right:10px}.pay-card-ul li{line-height:22px;padding:12px 15px 12px 56px}.pay-card-ul li em{font-size:14px;margin-right:10px}.pay-card-ul li.on .r{line-height:40px;margin-right:10px;padding-right:16px;background-position:right -356px;background-size:42px auto}.pay-btn input{font-size:.8rem;padding:12px 0}.pay-btn2 input{font-size:.8rem;padding:12px 0}.pay-btn3{padding:20px 10px 10px}.pay-btn3 input{font-size:.8rem;padding:12px 0}.zhaopian_img img{width:68px;height:85px}.js-keyboard{padding-bottom:1px}.keyboard-close{padding:8px 0;height:20px;background:#ebecee url(../images/pay.png) no-repeat center -342px;background-size:36px auto}.keyboard-title{padding:10px 0;line-height:24px;text-shadow:0 1px 1px #fff}.keyboard-title span{padding-left:20px;font-size:16px;background-position:left -117px;background-size:36px auto}.keyboard-psw{padding:7px 0}.keyboard-psw1{padding:7px 0}.keyboard-psw2{padding:7px 0}.js-keyboard .input-div{margin-left:5px;margin-right:64px}.js-keyboard .input-div-credit{margin-left:5px;margin-right:164px}.js-keyboard .input-div2{margin-left:5px;margin-right:5px}.js-keyboard .input-div1{margin-left:50px;margin-right:6px}.js-keyboard .input-div1 select{padding:8px 0;width:45%;text-indent:8px}.js-keyboard .input-div1 select.input-select1{border-top-left-radius:5px;border-bottom-left-radius:5px}.js-keyboard .input-div1 select.input-select2{border-top-right-radius:5px;border-bottom-right-radius:5px}.js-keyboard .input-select{padding:8px 0;border-radius:5px;text-indent:20px}.js-keyboard .input-select span{margin:0 10px;background-position:right -77px;background-size:36px auto}.js-keyboard .key-input{padding:8px 0;text-indent:8px;border-radius:5px}.js-keyboard .key-input1{padding:8px 0;padding-left:100px}.js-keyboard .input-btn{width:48px;height:36px;line-height:36px;right:6px;top:8px;border-radius:3px}.js-keyboard .input-title{width:90px;height:34px;line-height:34px;left:15px;top:9px}.js-keyboard li div{height:41px;font-size:16px}.js-keyboard li div em{font-size:12px}.js-keyboard li div span{background-position:center -148px;background-size:36px auto}}@media(orientation:portrait) and (min-width:480px) and (max-width:640px),(orientation:landscape) and (min-height:480px) and (max-height:640px){body{margin:0 auto;font-size:18px}.yinlian{width:48px}.imgyin{width:48px;height:48px}.imgcheck{width:24px;height:24px}.box{padding-top:86px}.xieyi-bg{padding-bottom:60px}div.pay-info-error li div{margin-left:90px}.header{height:66px;line-height:63px}.header-title{height:66px;line-height:66px}.header-title h1{font-size:24px}.tool-back{width:45px;height:63px;background-position:center 22px;background-size:54px auto}.tool-logo{width:54px;height:63px;background-position:center -45px;background-size:54px auto}.pay-step{height:125px;line-height:33px}.step-line{height:3px;top:45px}.pay-step li{padding-top:72px}.li-line{height:3px;top:45px}.li-num{top:26px}.li-num span{width:33px;height:33px;border:3px solid #999}.pay-info-bottom{height:18px}.pay-info-notes{padding:10px 0;margin:0 15px;line-height:33px;font-size:18px}.pay-value{line-height:45px;font-size:21px}.pay-value span{font-size:33px}.pay-ok{padding:20px 0;margin:0 15px;line-height:45px;font-size:21px}.pay-ok span{font-size:33px;padding-left:48px;background-position:left -415px;background-size:54px auto}.pay-shenhe{padding:15px 0;margin:0 15px;line-height:48px;font-size:20px}.pay-shenhe span{font-size:32px}.pay-shenhe p{line-height:33px}.pay-error{padding:15px;margin-bottom:10px}.pay-error p{line-height:33px;font-size:18px}.pay-xieyi{padding:20px;line-height:36px;font-size:21px}.pay-xieyi h1{font-size:24px;height:60px;font-weight:100px;line-height:54px}.pay-xieyi p{margin-bottom:12px}.pay-banklist{padding:20px 0;line-height:36px;font-size:21px}.bank-list-title{padding:10px 0 10px 20px;line-height:33px;font-size:21px}.bank-list-title span{width:24%}.pay-banklist h1{font-size:24px;height:63px;font-weight:100px;line-height:48px}.bank-list-ul{padding-left:20px}.pay-banklist li{line-height:48px;height:48px;padding:10px 0}.pay-banklist li img{margin-right:5px}.pay-banklist li span{line-height:48px;width:24%}.pay-goods{font-size:18px}.pay-goods-h{height:30px}.pay-goods li{height:32px;line-height:32px}.pay-goods li.li-first{padding-right:24px;background-position:right -288px;background-size:54px auto}.pay-goods li.li_down{background-position:right -348px}.pay-results{margin:0 15px;padding-top:10px;font-size:18px}.pay-results li{height:36px;line-height:36px}.pay-paizhao{padding:15px 0;line-height:36px}.pay-zhao{width:278px}.zhaopian{width:140px}.zhaopian_xz ul li{padding:3px 50px 0 0}.litpic_btn{width:64px;height:64px;background-size:50px auto;padding:0 0 0 5px}div.pay-input-crdit{padding-left:140px}div.pay-input-crdit .input-label{width:120px}.pay-input{height:66px;padding-left:110px;padding-right:15px;font-size:18px;line-height:66px}.pay-input-r .p-text-yanz{margin-right:120px}.input-label{width:90px;height:60px;left:15px}.input-yanz{width:100px;height:66px;right:5px}.input-shouji{width:100px;height:66px;right:5px}.pay-input input{padding:6px 0;line-height:20px;border:1px solid #fff}.pay-card-a{font-size:18px}.pay-card-key{padding:10px 15px;height:72px;line-height:33px;font-size:18px}.pay-card-key a{margin-left:20px}.pay-card-tips{padding:15px 15px 5px}.pay-change{line-height:33px;padding:0 15px 0 82px}.pay-change a{line-height:30px}.pay-change em{font-size:21px;margin-right:10px}.pay-change a .r{line-height:60px;padding-right:18px;background-position:right -96px;background-size:54px auto}.card_ccbc{background-position:20px center;background-size:54px auto}.pay-card-now{line-height:33px;padding:12px 15px 12px 82px}.pay-card-now em{font-size:21px;margin-right:10px}.pay-card-ul li{line-height:33px;padding:12px 15px 12px 82px}.pay-card-ul li em{font-size:21px;margin-right:10px}.pay-card-ul li.on .r{line-height:60px;margin-right:10px;padding-right:18px;background-position:right -458px;background-size:54px auto}.pay-btn input{font-size:1rem;padding:15px 0}.pay-btn2 input{font-size:1rem;padding:15px 0}.pay-btn3{padding:20px 10px 10px}.pay-btn3 input{font-size:1rem;padding:15px 0}.pay-xieyi-btn{height:50px;padding-bottom:35px}.js-keyboard{padding-bottom:1px;display:none}.keyboard-title{padding:6px 0;line-height:20px;text-shadow:0 1px 1px #fff}.keyboard-close{padding:8px 0;height:30px;background:#ebecee url(../images/pay.png) no-repeat center -518px;background-size:54px auto}.keyboard-title span{padding-left:20px;font-size:16px;background-position:left -117px;background-size:36px auto}.keyboard-psw{padding:7px 0}.keyboard-psw1{padding:7px 0}.keyboard-psw2{padding:7px 0}.js-keyboard .input-div{margin-left:5px;margin-right:80px}.js-keyboard .input-div-credit{margin-left:5px;margin-right:200px}.js-keyboard .input-div2{margin-left:5px;margin-right:5px}.js-keyboard .input-div1{margin-left:50px;margin-right:6px}.js-keyboard .input-div1 select{padding:8px 0;width:45%;text-indent:8px}.js-keyboard .input-div1 select.input-select1{border-top-left-radius:5px;border-bottom-left-radius:5px}.js-keyboard .input-div1 select.input-select2{border-top-right-radius:5px;border-bottom-right-radius:5px}.js-keyboard .input-select{padding:12px 0;border-radius:5px;text-indent:20px}.js-keyboard .input-select span{margin:0 10px;background-position:right -115px;background-size:54px auto}.js-keyboard .key-input{padding:8px 0;text-indent:8px;border-radius:5px}.js-keyboard .key-input1{padding:8px 0;padding-left:120px}.js-keyboard .input-btn{width:60px;height:40px;line-height:40px;top:8px;border-radius:3px}.js-keyboard .input-title{width:120px;height:45px;line-height:45px;left:15px;top:7px}.zhaopian_img img{width:80px;height:100px}.js-keyboard li div{height:41px;font-size:16px}.js-keyboard li div em{font-size:12px}.js-keyboard li div span{background-position:center -148px;background-size:36px auto}}@media(orientation:portrait){.js-keyboard li{width:33.3%;height:42px;line-height:42px}}@media(orientation:landscape){.js-keyboard li{width:25%;height:42px;line-height:42px}}@media(orientation:portrait) and (min-width:640px),(orientation:landscape) and (min-height:640px){body{margin:0 auto;font-size:20px}.yinlian{width:72px}.imgyin{width:64px;height:64px}.imgcheck{width:32px;height:32px}.box{padding-top:108px}.js-keyboard-bg{position:fixed}div.pay-info-error li div{margin-left:120px}.xieyi-bg{padding-bottom:80px}.header{height:88px;line-height:84px}.header-title{height:88px;line-height:88px}.header-title h1{font-size:32px}.tool-back{width:60px;height:84px;background-position:center 26px;background-size:72px auto}.tool-logo{width:72px;height:84px;background-position:center -60px;background-size:72px auto}.pay-step{height:160px;line-height:44px}.step-line{height:4px;top:55px}.pay-step li{padding-top:100px}.li-line{height:4px;top:55px}.li-num{top:32px}.li-num span{width:44px;height:44px;border:4px solid #999}.pay-info{margin-bottom:20px}.pay-info-bottom{height:32px}.pay-info-notes{padding:20px 0;margin:0 15px;line-height:44px;font-size:24px}.pay-value{line-height:60px;font-size:28px}.pay-value span{font-size:44px}.pay-ok{padding:20px 0;margin:0 15px;line-height:60px;font-size:28px}.pay-ok span{font-size:44px;padding-left:60px;background-position:left -552px;background-size:72px auto}.pay-shenhe{padding:15px 0;margin:0 15px;line-height:64px;font-size:28px}.pay-shenhe span{font-size:36px}.pay-shenhe p{line-height:44px}.pay-error{padding:15px;margin-bottom:10px}.pay-error p{line-height:44px;font-size:24px}.pay-xieyi{padding:20px;line-height:48px;font-size:28px}.pay-xieyi h1{font-size:32px;height:80px;font-weight:100px;line-height:72px}.pay-xieyi p{margin-bottom:12px}.pay-banklist{padding:20px 0;line-height:48px;font-size:28px}.bank-list-title{padding:10px 0 10px 20px;line-height:44px;font-size:28px}.bank-list-title span{width:24%}.pay-banklist h1{font-size:32px;height:84px;font-weight:100px;line-height:64px}.bank-list-ul{padding-left:20px}.pay-banklist li{line-height:64px;height:64px;padding:20px 0}.pay-banklist li img{margin-right:5px}.pay-banklist li span{line-height:64px;width:24%}.pay-goods{padding-top:20px;font-size:24px}.pay-goods-h{height:40px}.pay-goods li{height:48px;line-height:48px}.pay-goods li.li-first{padding-right:32px;background-position:right -380px;background-size:72px auto}.pay-goods li.li_down{background-position:right -460px}.pay-results{margin:0 15px;padding-top:10px;font-size:24px}.pay-results li{height:48px;line-height:48px}.pay-paizhao{padding:15px 0;line-height:48px}.pay-zhao{width:386px}.zhaopian_img img{width:100px;height:125px}.zhaopian{width:200px}.zhaopian_xz ul li{padding:5px 10px 0 0}.zhaopian_xz1 img{width:32px}.zhaopian_xz2 img{width:32px}.zhaopian_xz3 img{width:32px}.zhaopian_xz1{padding:40px 10px 0 0}.zhaopian_xz2{padding:5px 0 0 75px}.zhaopian_xz3{padding:40px 0 0 10px}.litpic_btn{width:128px;height:128px;background-size:100px auto;padding:0 0 0 5px}div.pay-input-crdit{padding-left:190px}div.pay-input-crdit .input-label{width:150px}.pay-input{height:88px;padding-left:170px;padding-right:30px;font-size:24px;line-height:88px}.pay-input-r .p-text-yanz{margin-right:200px}.input-label{width:125px;height:80px;left:30px}.input-yanz{width:180px;height:88px;right:5px}.input-shouji{width:180px;height:88px;border-left:1px solid #e6e6e6;right:5px}.pay-input input{padding:12px 0;line-height:30px}.pay-card-a{padding:30px 15px 16px;font-size:24px}.pay-card-key{padding:10px 15px;height:96px;line-height:44px;font-size:24px}.pay-card-key a{margin-left:20px}.pay-card-tips{padding:15px 15px 5px}.pay-change{line-height:44px;padding:0 15px 0 112px}.pay-change a{line-height:40px;padding:20px 0}.pay-change em{font-size:28px;margin-right:20px}.pay-change a .r{line-height:80px;padding-right:24px;background-position:right -130px;background-size:72px auto}.card_ccbc{background-position:30px center;background-size:64px auto}.pay-card-now{line-height:44px;padding:12px 15px 12px 112px}.pay-card-now em{font-size:28px;margin-right:10px}.pay-card-ul li{line-height:44px;padding:12px 15px 12px 112px}.pay-card-ul li em{font-size:28px;margin-right:10px}.pay-card-ul li.on .r{line-height:80px;margin-right:10px;padding-right:24px;background-position:right -612px;background-size:72px auto}.pay-btn input{font-size:24px;border-radius:3px;padding:18px 0}.pay-btn2 input{font-size:24px;border-radius:3px;padding:18px 0}.pay-btn3{padding:20px 10px 10px}.pay-btn3 input{font-size:24px;border-radius:3px;padding:18px 0}.pay-xieyi-btn{height:70px;padding-bottom:35px}.js-keyboard{padding-bottom:1px}.keyboard-close{padding:10px 0;height:20px;background:#ebecee url(../images/pay.png) no-repeat center -696px;background-size:72px auto}.keyboard-title{padding:6px 0;line-height:20px;text-shadow:0 1px 1px #fff}.keyboard-title span{padding-left:40px;font-size:16px;line-height:36px;display:inline-block;background-position:left -238px;background-size:72px auto}.keyboard-psw{padding:7px 0}.keyboard-psw1{padding:7px 0}.keyboard-psw2{padding:7px 0}.js-keyboard .input-div{margin-left:10px;margin-right:110px}.js-keyboard .input-div-credit{margin-left:5px;margin-right:270px}.js-keyboard .input-div2{margin-left:5px;margin-right:5px}.js-keyboard .input-div1{margin-left:50px;margin-right:6px}.js-keyboard .input-div1 select{padding:16px 0;width:45%;text-indent:8px}.js-keyboard .input-div1 select.input-select1{border-top-left-radius:5px;border-bottom-left-radius:5px}.js-keyboard .input-div1 select.input-select2{border-top-right-radius:5px;border-bottom-right-radius:5px}.js-keyboard .input-select{padding:9px 0;border-radius:5px;text-indent:20px}.js-keyboard .input-select span{margin:0 10px;background-position:right -154px;background-size:72px auto}.js-keyboard .key-input{padding:9px 0;text-indent:8px;border-radius:5px}.js-keyboard .key-input1{padding:9px 0;border-radius:5px;padding-left:160px}.js-keyboard .input-btn{width:80px;height:44px;line-height:44px;top:7px;border-radius:3px}.js-keyboard .input-title{width:160px;height:60px;line-height:60px;left:15px;top:1px}.js-keyboard li div{border-left:1px solid #ddd;height:41px;font-size:16px}.js-keyboard li div em{font-size:16px}.js-keyboard li div span{background-position:center -148px;background-size:36px auto}}.ui-dialog{display:-webkit-box;position:absolute;position:fixed;left:50%;top:50%;max-width:400px;max-height:90%;-webkit-transform:translate(-50%,-50%);width:80%;border-radius:.4em}.ui-dialog-inner{font-family:"微软雅黑";-webkit-box-flex:1;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;z-index:1000;min-width:200px;max-height:90%;background:#f9f9f9;border-radius:.4em}.ui-dialog a{text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.ui-dialog-header{display:none;position:relative;overflow:hidden;height:44px;border:0;border-radius:.4em .4em 0 0;border-bottom:1px solid #3b1313;background-image:-webkit-gradient(linear,left top,left bottom,from(#e36482),to(#8e0c2b));background-image:-webkit-linear-gradient(#e36482,#8e0c2b);background-image:linear-gradient(#e36482,#8e0c2b);-webkit-box-sizing:border-box;box-sizing:border-box}.ui-dialog-header h2{color:#FFF;text-align:center;font-weight:normal;font-size:16px;line-height:44px;margin:0 30% .6em}.ui-dialog-header .ui-dialog-btn{position:absolute;right:12px;top:8px;margin:0;width:26px;height:26px;background-image:-webkit-gradient(linear,left top,left bottom,from(#fe9fb5),to(#911f3a));background-image:-webkit-linear-gradient(#fe9fb5,#911f3a);background-image:linear-gradient(#fe9fb5,#911f3a);border-radius:30px;text-align:center}.ui-dialog-header a:hover{background:#93213c}.ui-dialog-header a:after{content:'×';font-weight:bold;font-size:18px;line-height:26px;vertical-align:top;color:#FFF}.ui-dialog-cont-wrapper{-webkit-box-flex:1;overflow-y:auto;overflow-x:hidden;padding:1.5em 1em .5em;text-shadow:none;color:#2d212f;text-align:center;line-height:1.5}.ui-dialog-cont-wrapper{border-bottom:solid 1px #ccc;padding-bottom:1em}.ui-dialog-content{display:inline-block;text-align:left}.ui-dialog-btn-wrapper{text-align:center;margin-bottom:15px;margin-top:10px}.ui-dialog-btn-wrapper .ui-dialog-btn:only-child{width:70%}.ui-dialog-btn{display:inline-block;line-height:36px;margin:0 2%;width:35%;color:#FFF;border-radius:3px}.ui-dialog .btn-a{background-color:#1fc1d8}.ui-dialog .btn-b{background-color:#f5a200}.ui-dialog-mask{background:rgba(0,0,0,.5);-webkit-transform:none;width:100%;height:100%;max-height:none;max-width:none;left:0;top:0;-webkit-box-pack:center;-webkit-box-align:center;border-radius:0;box-shadow:none}.ui-dialog-mask .ui-dialog-inner{-webkit-box-flex:0;width:70%;max-width:400px}.loadDiv{width:120px;height:60px;line-height:30px;text-align:center}.loadDiv .img{margin:auto;background:url(../images/loading.gif) left no-repeat;width:32px;height:32px} \ No newline at end of file diff --git a/roncoo-pay-web-boss/src/main/webapp/common/scan/pay_files/browser-sync-client.2.10.1.js b/roncoo-pay-web-boss/src/main/webapp/common/scan/pay_files/browser-sync-client.2.10.1.js new file mode 100644 index 0000000000000000000000000000000000000000..88ba2f1d8222baeba9462f5a797a2f4dc7e20ecb --- /dev/null +++ b/roncoo-pay-web-boss/src/main/webapp/common/scan/pay_files/browser-sync-client.2.10.1.js @@ -0,0 +1,129 @@ +window.___browserSync___oldSocketIo = window.io;!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.io=e()}}(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o0&&!this.encoding){var pack=this.packetBuffer.shift();this.packet(pack)}};Manager.prototype.cleanup=function(){var sub;while(sub=this.subs.shift())sub.destroy();this.packetBuffer=[];this.encoding=false;this.decoder.destroy()};Manager.prototype.close=Manager.prototype.disconnect=function(){this.skipReconnect=true;this.backoff.reset();this.readyState="closed";this.engine&&this.engine.close()};Manager.prototype.onclose=function(reason){debug("close");this.cleanup();this.backoff.reset();this.readyState="closed";this.emit("close",reason);if(this._reconnection&&!this.skipReconnect){this.reconnect()}};Manager.prototype.reconnect=function(){if(this.reconnecting||this.skipReconnect)return this;var self=this;if(this.backoff.attempts>=this._reconnectionAttempts){debug("reconnect failed");this.backoff.reset();this.emitAll("reconnect_failed");this.reconnecting=false}else{var delay=this.backoff.duration();debug("will wait %dms before reconnect attempt",delay);this.reconnecting=true;var timer=setTimeout(function(){if(self.skipReconnect)return;debug("attempting reconnect");self.emitAll("reconnect_attempt",self.backoff.attempts);self.emitAll("reconnecting",self.backoff.attempts);if(self.skipReconnect)return;self.open(function(err){if(err){debug("reconnect attempt error");self.reconnecting=false;self.reconnect();self.emitAll("reconnect_error",err.data)}else{debug("reconnect success");self.onreconnect()}})},delay);this.subs.push({destroy:function(){clearTimeout(timer)}})}};Manager.prototype.onreconnect=function(){var attempt=this.backoff.attempts;this.reconnecting=false;this.backoff.reset();this.updateSocketIds();this.emitAll("reconnect",attempt)}},{"./on":4,"./socket":5,"./url":6,backo2:7,"component-bind":8,"component-emitter":9,debug:10,"engine.io-client":11,indexof:40,"object-component":41,"socket.io-parser":44}],4:[function(_dereq_,module,exports){module.exports=on;function on(obj,ev,fn){obj.on(ev,fn);return{destroy:function(){obj.removeListener(ev,fn)}}}},{}],5:[function(_dereq_,module,exports){var parser=_dereq_("socket.io-parser");var Emitter=_dereq_("component-emitter");var toArray=_dereq_("to-array");var on=_dereq_("./on");var bind=_dereq_("component-bind");var debug=_dereq_("debug")("socket.io-client:socket");var hasBin=_dereq_("has-binary");module.exports=exports=Socket;var events={connect:1,connect_error:1,connect_timeout:1,disconnect:1,error:1,reconnect:1,reconnect_attempt:1,reconnect_failed:1,reconnect_error:1,reconnecting:1};var emit=Emitter.prototype.emit;function Socket(io,nsp){this.io=io;this.nsp=nsp;this.json=this;this.ids=0;this.acks={};if(this.io.autoConnect)this.open();this.receiveBuffer=[];this.sendBuffer=[];this.connected=false;this.disconnected=true}Emitter(Socket.prototype);Socket.prototype.subEvents=function(){if(this.subs)return;var io=this.io;this.subs=[on(io,"open",bind(this,"onopen")),on(io,"packet",bind(this,"onpacket")),on(io,"close",bind(this,"onclose"))]};Socket.prototype.open=Socket.prototype.connect=function(){if(this.connected)return this;this.subEvents();this.io.open();if("open"==this.io.readyState)this.onopen();return this};Socket.prototype.send=function(){var args=toArray(arguments);args.unshift("message");this.emit.apply(this,args);return this};Socket.prototype.emit=function(ev){if(events.hasOwnProperty(ev)){emit.apply(this,arguments);return this}var args=toArray(arguments);var parserType=parser.EVENT;if(hasBin(args)){parserType=parser.BINARY_EVENT}var packet={type:parserType,data:args};if("function"==typeof args[args.length-1]){debug("emitting packet with ack id %d",this.ids);this.acks[this.ids]=args.pop();packet.id=this.ids++}if(this.connected){this.packet(packet)}else{this.sendBuffer.push(packet)}return this};Socket.prototype.packet=function(packet){packet.nsp=this.nsp;this.io.packet(packet)};Socket.prototype.onopen=function(){debug("transport is open - connecting");if("/"!=this.nsp){this.packet({type:parser.CONNECT})}};Socket.prototype.onclose=function(reason){debug("close (%s)",reason);this.connected=false;this.disconnected=true;delete this.id;this.emit("disconnect",reason)};Socket.prototype.onpacket=function(packet){if(packet.nsp!=this.nsp)return;switch(packet.type){case parser.CONNECT:this.onconnect();break;case parser.EVENT:this.onevent(packet);break;case parser.BINARY_EVENT:this.onevent(packet);break;case parser.ACK:this.onack(packet);break;case parser.BINARY_ACK:this.onack(packet);break;case parser.DISCONNECT:this.ondisconnect();break;case parser.ERROR:this.emit("error",packet.data);break}};Socket.prototype.onevent=function(packet){var args=packet.data||[];debug("emitting event %j",args);if(null!=packet.id){debug("attaching ack callback to event");args.push(this.ack(packet.id))}if(this.connected){emit.apply(this,args)}else{this.receiveBuffer.push(args)}};Socket.prototype.ack=function(id){var self=this;var sent=false;return function(){if(sent)return;sent=true;var args=toArray(arguments);debug("sending ack %j",args);var type=hasBin(args)?parser.BINARY_ACK:parser.ACK;self.packet({type:type,id:id,data:args})}};Socket.prototype.onack=function(packet){debug("calling ack %s with %j",packet.id,packet.data);var fn=this.acks[packet.id];fn.apply(this,packet.data);delete this.acks[packet.id]};Socket.prototype.onconnect=function(){this.connected=true;this.disconnected=false;this.emit("connect");this.emitBuffered()};Socket.prototype.emitBuffered=function(){var i;for(i=0;i0&&opts.jitter<=1?opts.jitter:0;this.attempts=0}Backoff.prototype.duration=function(){var ms=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var rand=Math.random();var deviation=Math.floor(rand*this.jitter*ms);ms=(Math.floor(rand*10)&1)==0?ms-deviation:ms+deviation}return Math.min(ms,this.max)|0};Backoff.prototype.reset=function(){this.attempts=0};Backoff.prototype.setMin=function(min){this.ms=min};Backoff.prototype.setMax=function(max){this.max=max};Backoff.prototype.setJitter=function(jitter){this.jitter=jitter}},{}],8:[function(_dereq_,module,exports){var slice=[].slice;module.exports=function(obj,fn){if("string"==typeof fn)fn=obj[fn];if("function"!=typeof fn)throw new Error("bind() requires a function");var args=slice.call(arguments,2);return function(){return fn.apply(obj,args.concat(slice.call(arguments)))}}},{}],9:[function(_dereq_,module,exports){module.exports=Emitter;function Emitter(obj){if(obj)return mixin(obj)}function mixin(obj){for(var key in Emitter.prototype){obj[key]=Emitter.prototype[key]}return obj}Emitter.prototype.on=Emitter.prototype.addEventListener=function(event,fn){this._callbacks=this._callbacks||{};(this._callbacks[event]=this._callbacks[event]||[]).push(fn);return this};Emitter.prototype.once=function(event,fn){var self=this;this._callbacks=this._callbacks||{};function on(){self.off(event,on);fn.apply(this,arguments)}on.fn=fn;this.on(event,on);return this};Emitter.prototype.off=Emitter.prototype.removeListener=Emitter.prototype.removeAllListeners=Emitter.prototype.removeEventListener=function(event,fn){this._callbacks=this._callbacks||{};if(0==arguments.length){this._callbacks={};return this}var callbacks=this._callbacks[event];if(!callbacks)return this;if(1==arguments.length){delete this._callbacks[event];return this}var cb;for(var i=0;i=hour)return(ms/hour).toFixed(1)+"h";if(ms>=min)return(ms/min).toFixed(1)+"m";if(ms>=sec)return(ms/sec|0)+"s";return ms+"ms"};debug.enabled=function(name){for(var i=0,len=debug.skips.length;i';iframe=document.createElement(html)}catch(e){iframe=document.createElement("iframe");iframe.name=self.iframeId;iframe.src="javascript:0"}iframe.id=self.iframeId;self.form.appendChild(iframe);self.iframe=iframe}initIframe();data=data.replace(rEscapedNewline,"\\\n");this.area.value=data.replace(rNewline,"\\n");try{this.form.submit()}catch(e){}if(this.iframe.attachEvent){this.iframe.onreadystatechange=function(){if(self.iframe.readyState=="complete"){complete()}}}else{this.iframe.onload=complete}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./polling":18,"component-inherit":21}],17:[function(_dereq_,module,exports){(function(global){var XMLHttpRequest=_dereq_("xmlhttprequest");var Polling=_dereq_("./polling");var Emitter=_dereq_("component-emitter");var inherit=_dereq_("component-inherit");var debug=_dereq_("debug")("engine.io-client:polling-xhr");module.exports=XHR;module.exports.Request=Request;function empty(){}function XHR(opts){Polling.call(this,opts);if(global.location){var isSSL="https:"==location.protocol;var port=location.port;if(!port){port=isSSL?443:80}this.xd=opts.hostname!=global.location.hostname||port!=opts.port;this.xs=opts.secure!=isSSL}}inherit(XHR,Polling);XHR.prototype.supportsBinary=true;XHR.prototype.request=function(opts){opts=opts||{};opts.uri=this.uri();opts.xd=this.xd;opts.xs=this.xs;opts.agent=this.agent||false;opts.supportsBinary=this.supportsBinary;opts.enablesXDR=this.enablesXDR;opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;return new Request(opts)};XHR.prototype.doWrite=function(data,fn){var isBinary=typeof data!=="string"&&data!==undefined;var req=this.request({method:"POST",data:data,isBinary:isBinary});var self=this;req.on("success",fn);req.on("error",function(err){self.onError("xhr post error",err)});this.sendXhr=req};XHR.prototype.doPoll=function(){debug("xhr poll");var req=this.request();var self=this;req.on("data",function(data){self.onData(data)});req.on("error",function(err){self.onError("xhr poll error",err)});this.pollXhr=req};function Request(opts){this.method=opts.method||"GET";this.uri=opts.uri;this.xd=!!opts.xd;this.xs=!!opts.xs;this.async=false!==opts.async;this.data=undefined!=opts.data?opts.data:null;this.agent=opts.agent;this.isBinary=opts.isBinary;this.supportsBinary=opts.supportsBinary;this.enablesXDR=opts.enablesXDR;this.pfx=opts.pfx;this.key=opts.key;this.passphrase=opts.passphrase;this.cert=opts.cert;this.ca=opts.ca;this.ciphers=opts.ciphers;this.rejectUnauthorized=opts.rejectUnauthorized;this.create()}Emitter(Request.prototype);Request.prototype.create=function(){var opts={agent:this.agent,xdomain:this.xd,xscheme:this.xs,enablesXDR:this.enablesXDR};opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;var xhr=this.xhr=new XMLHttpRequest(opts);var self=this;try{debug("xhr open %s: %s",this.method,this.uri);xhr.open(this.method,this.uri,this.async);if(this.supportsBinary){xhr.responseType="arraybuffer"}if("POST"==this.method){try{if(this.isBinary){xhr.setRequestHeader("Content-type","application/octet-stream")}else{xhr.setRequestHeader("Content-type","text/plain;charset=UTF-8")}}catch(e){}}if("withCredentials"in xhr){xhr.withCredentials=true}if(this.hasXDR()){xhr.onload=function(){self.onLoad()};xhr.onerror=function(){self.onError(xhr.responseText)}}else{xhr.onreadystatechange=function(){if(4!=xhr.readyState)return;if(200==xhr.status||1223==xhr.status){self.onLoad()}else{setTimeout(function(){self.onError(xhr.status)},0)}}}debug("xhr data %s",this.data);xhr.send(this.data)}catch(e){setTimeout(function(){self.onError(e)},0);return}if(global.document){this.index=Request.requestsCount++;Request.requests[this.index]=this}};Request.prototype.onSuccess=function(){this.emit("success");this.cleanup()};Request.prototype.onData=function(data){this.emit("data",data);this.onSuccess()};Request.prototype.onError=function(err){this.emit("error",err);this.cleanup(true)};Request.prototype.cleanup=function(fromError){if("undefined"==typeof this.xhr||null===this.xhr){return}if(this.hasXDR()){this.xhr.onload=this.xhr.onerror=empty}else{this.xhr.onreadystatechange=empty}if(fromError){try{this.xhr.abort()}catch(e){}}if(global.document){delete Request.requests[this.index]}this.xhr=null};Request.prototype.onLoad=function(){var data;try{var contentType;try{contentType=this.xhr.getResponseHeader("Content-Type").split(";")[0]}catch(e){}if(contentType==="application/octet-stream"){data=this.xhr.response}else{if(!this.supportsBinary){data=this.xhr.responseText}else{data="ok"}}}catch(e){this.onError(e)}if(null!=data){this.onData(data)}};Request.prototype.hasXDR=function(){return"undefined"!==typeof global.XDomainRequest&&!this.xs&&this.enablesXDR};Request.prototype.abort=function(){this.cleanup()};if(global.document){Request.requestsCount=0;Request.requests={};if(global.attachEvent){global.attachEvent("onunload",unloadHandler)}else if(global.addEventListener){global.addEventListener("beforeunload",unloadHandler,false)}}function unloadHandler(){for(var i in Request.requests){if(Request.requests.hasOwnProperty(i)){Request.requests[i].abort()}}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./polling":18,"component-emitter":9,"component-inherit":21,debug:22,xmlhttprequest:20}],18:[function(_dereq_,module,exports){var Transport=_dereq_("../transport");var parseqs=_dereq_("parseqs");var parser=_dereq_("engine.io-parser");var inherit=_dereq_("component-inherit");var debug=_dereq_("debug")("engine.io-client:polling");module.exports=Polling;var hasXHR2=function(){var XMLHttpRequest=_dereq_("xmlhttprequest");var xhr=new XMLHttpRequest({xdomain:false});return null!=xhr.responseType}();function Polling(opts){var forceBase64=opts&&opts.forceBase64;if(!hasXHR2||forceBase64){this.supportsBinary=false}Transport.call(this,opts)}inherit(Polling,Transport);Polling.prototype.name="polling";Polling.prototype.doOpen=function(){this.poll()};Polling.prototype.pause=function(onPause){var pending=0;var self=this;this.readyState="pausing";function pause(){debug("paused");self.readyState="paused";onPause()}if(this.polling||!this.writable){var total=0;if(this.polling){debug("we are currently polling - waiting to pause");total++;this.once("pollComplete",function(){debug("pre-pause polling complete");--total||pause()})}if(!this.writable){debug("we are currently writing - waiting to pause");total++;this.once("drain",function(){debug("pre-pause writing complete");--total||pause()})}}else{pause()}};Polling.prototype.poll=function(){debug("polling");this.polling=true;this.doPoll();this.emit("poll")};Polling.prototype.onData=function(data){var self=this;debug("polling got data %s",data);var callback=function(packet,index,total){if("opening"==self.readyState){self.onOpen()}if("close"==packet.type){self.onClose();return false}self.onPacket(packet)};parser.decodePayload(data,this.socket.binaryType,callback);if("closed"!=this.readyState){this.polling=false;this.emit("pollComplete");if("open"==this.readyState){this.poll()}else{debug('ignoring poll - transport state "%s"',this.readyState)}}};Polling.prototype.doClose=function(){var self=this;function close(){debug("writing close packet");self.write([{type:"close"}])}if("open"==this.readyState){debug("transport open - closing");close()}else{debug("transport not open - deferring close");this.once("open",close)}};Polling.prototype.write=function(packets){var self=this;this.writable=false;var callbackfn=function(){self.writable=true;self.emit("drain")};var self=this;parser.encodePayload(packets,this.supportsBinary,function(data){self.doWrite(data,callbackfn)})};Polling.prototype.uri=function(){var query=this.query||{};var schema=this.secure?"https":"http";var port="";if(false!==this.timestampRequests){query[this.timestampParam]=+new Date+"-"+Transport.timestamps++}if(!this.supportsBinary&&!query.sid){query.b64=1}query=parseqs.encode(query);if(this.port&&("https"==schema&&this.port!=443||"http"==schema&&this.port!=80)){port=":"+this.port}if(query.length){query="?"+query}return schema+"://"+this.hostname+port+this.path+query}},{"../transport":14,"component-inherit":21,debug:22,"engine.io-parser":25,parseqs:33,xmlhttprequest:20}],19:[function(_dereq_,module,exports){var Transport=_dereq_("../transport");var parser=_dereq_("engine.io-parser");var parseqs=_dereq_("parseqs");var inherit=_dereq_("component-inherit");var debug=_dereq_("debug")("engine.io-client:websocket");var WebSocket=_dereq_("ws");module.exports=WS;function WS(opts){var forceBase64=opts&&opts.forceBase64;if(forceBase64){this.supportsBinary=false}Transport.call(this,opts)}inherit(WS,Transport);WS.prototype.name="websocket";WS.prototype.supportsBinary=true;WS.prototype.doOpen=function(){if(!this.check()){return}var self=this;var uri=this.uri();var protocols=void 0;var opts={agent:this.agent};opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;this.ws=new WebSocket(uri,protocols,opts);if(this.ws.binaryType===undefined){this.supportsBinary=false}this.ws.binaryType="arraybuffer";this.addEventListeners()};WS.prototype.addEventListeners=function(){var self=this;this.ws.onopen=function(){self.onOpen()};this.ws.onclose=function(){self.onClose()};this.ws.onmessage=function(ev){self.onData(ev.data)};this.ws.onerror=function(e){self.onError("websocket error",e)}};if("undefined"!=typeof navigator&&/iPad|iPhone|iPod/i.test(navigator.userAgent)){WS.prototype.onData=function(data){var self=this;setTimeout(function(){Transport.prototype.onData.call(self,data)},0)}}WS.prototype.write=function(packets){var self=this;this.writable=false;for(var i=0,l=packets.length;i=31}exports.formatters.j=function(v){return JSON.stringify(v)};function formatArgs(){var args=arguments;var useColors=this.useColors;args[0]=(useColors?"%c":"")+this.namespace+(useColors?" %c":" ")+args[0]+(useColors?"%c ":" ")+"+"+exports.humanize(this.diff);if(!useColors)return args;var c="color: "+this.color;args=[args[0],c,"color: inherit"].concat(Array.prototype.slice.call(args,1));var index=0;var lastC=0;args[0].replace(/%[a-z%]/g,function(match){if("%%"===match)return;index++;if("%c"===match){lastC=index}});args.splice(lastC,0,c);return args}function log(){return"object"==typeof console&&"function"==typeof console.log&&Function.prototype.apply.call(console.log,console,arguments)}function save(namespaces){try{if(null==namespaces){localStorage.removeItem("debug")}else{localStorage.debug=namespaces}}catch(e){}}function load(){var r;try{r=localStorage.debug}catch(e){}return r}exports.enable(load())},{"./debug":23}],23:[function(_dereq_,module,exports){exports=module.exports=debug;exports.coerce=coerce;exports.disable=disable;exports.enable=enable;exports.enabled=enabled;exports.humanize=_dereq_("ms");exports.names=[];exports.skips=[];exports.formatters={};var prevColor=0;var prevTime;function selectColor(){return exports.colors[prevColor++%exports.colors.length]}function debug(namespace){function disabled(){}disabled.enabled=false;function enabled(){var self=enabled;var curr=+new Date;var ms=curr-(prevTime||curr);self.diff=ms;self.prev=prevTime;self.curr=curr;prevTime=curr;if(null==self.useColors)self.useColors=exports.useColors();if(null==self.color&&self.useColors)self.color=selectColor();var args=Array.prototype.slice.call(arguments);args[0]=exports.coerce(args[0]);if("string"!==typeof args[0]){args=["%o"].concat(args)}var index=0;args[0]=args[0].replace(/%([a-z%])/g,function(match,format){if(match==="%%")return match;index++;var formatter=exports.formatters[format];if("function"===typeof formatter){var val=args[index];match=formatter.call(self,val);args.splice(index,1);index--}return match});if("function"===typeof exports.formatArgs){args=exports.formatArgs.apply(self,args)}var logFn=enabled.log||exports.log||console.log.bind(console);logFn.apply(self,args)}enabled.enabled=true;var fn=exports.enabled(namespace)?enabled:disabled;fn.namespace=namespace;return fn}function enable(namespaces){exports.save(namespaces);var split=(namespaces||"").split(/[\s,]+/);var len=split.length;for(var i=0;i=d)return Math.round(ms/d)+"d";if(ms>=h)return Math.round(ms/h)+"h";if(ms>=m)return Math.round(ms/m)+"m";if(ms>=s)return Math.round(ms/s)+"s";return ms+"ms"}function long(ms){return plural(ms,d,"day")||plural(ms,h,"hour")||plural(ms,m,"minute")||plural(ms,s,"second")||ms+" ms"}function plural(ms,n,name){if(ms1){return{type:packetslist[type],data:data.substring(1)}}else{return{type:packetslist[type]}}}var asArray=new Uint8Array(data);var type=asArray[0];var rest=sliceBuffer(data,1);if(Blob&&binaryType==="blob"){rest=new Blob([rest])}return{type:packetslist[type],data:rest}};exports.decodeBase64Packet=function(msg,binaryType){var type=packetslist[msg.charAt(0)];if(!global.ArrayBuffer){return{type:type,data:{base64:true,data:msg.substr(1)}}}var data=base64encoder.decode(msg.substr(1));if(binaryType==="blob"&&Blob){data=new Blob([data])}return{type:type,data:data}};exports.encodePayload=function(packets,supportsBinary,callback){if(typeof supportsBinary=="function"){callback=supportsBinary;supportsBinary=null}var isBinary=hasBinary(packets);if(supportsBinary&&isBinary){if(Blob&&!dontSendBlobs){return exports.encodePayloadAsBlob(packets,callback)}return exports.encodePayloadAsArrayBuffer(packets,callback)}if(!packets.length){return callback("0:")}function setLengthHeader(message){return message.length+":"+message}function encodeOne(packet,doneCallback){exports.encodePacket(packet,!isBinary?false:supportsBinary,true,function(message){doneCallback(null,setLengthHeader(message))})}map(packets,encodeOne,function(err,results){return callback(results.join(""))})};function map(ary,each,done){var result=new Array(ary.length);var next=after(ary.length,done);var eachWithIndex=function(i,el,cb){each(el,function(error,msg){result[i]=msg;cb(error,result)})};for(var i=0;i0){var tailArray=new Uint8Array(bufferTail);var isString=tailArray[0]===0;var msgLength="";for(var i=1;;i++){if(tailArray[i]==255)break;if(msgLength.length>310){numberTooLong=true;break}msgLength+=tailArray[i]}if(numberTooLong)return callback(err,0,1);bufferTail=sliceBuffer(bufferTail,2+msgLength.length);msgLength=parseInt(msgLength);var msg=sliceBuffer(bufferTail,0,msgLength);if(isString){try{msg=String.fromCharCode.apply(null,new Uint8Array(msg))}catch(e){var typed=new Uint8Array(msg);msg="";for(var i=0;ibytes){end=bytes}if(start>=bytes||start>=end||bytes===0){return new ArrayBuffer(0)}var abv=new Uint8Array(arraybuffer);var result=new Uint8Array(end-start);for(var i=start,ii=0;i>2];base64+=chars[(bytes[i]&3)<<4|bytes[i+1]>>4];base64+=chars[(bytes[i+1]&15)<<2|bytes[i+2]>>6];base64+=chars[bytes[i+2]&63]}if(len%3===2){base64=base64.substring(0,base64.length-1)+"="}else if(len%3===1){base64=base64.substring(0,base64.length-2)+"=="}return base64};exports.decode=function(base64){var bufferLength=base64.length*.75,len=base64.length,i,p=0,encoded1,encoded2,encoded3,encoded4;if(base64[base64.length-1]==="="){bufferLength--;if(base64[base64.length-2]==="="){bufferLength--}}var arraybuffer=new ArrayBuffer(bufferLength),bytes=new Uint8Array(arraybuffer);for(i=0;i>4;bytes[p++]=(encoded2&15)<<4|encoded3>>2;bytes[p++]=(encoded3&3)<<6|encoded4&63}return arraybuffer}})("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")},{}],30:[function(_dereq_,module,exports){(function(global){var BlobBuilder=global.BlobBuilder||global.WebKitBlobBuilder||global.MSBlobBuilder||global.MozBlobBuilder;var blobSupported=function(){try{var a=new Blob(["hi"]);return a.size===2}catch(e){return false}}();var blobSupportsArrayBufferView=blobSupported&&function(){try{var b=new Blob([new Uint8Array([1,2])]);return b.size===2}catch(e){return false}}();var blobBuilderSupported=BlobBuilder&&BlobBuilder.prototype.append&&BlobBuilder.prototype.getBlob;function mapArrayBufferViews(ary){for(var i=0;i=55296&&value<=56319&&counter65535){value-=65536;output+=stringFromCharCode(value>>>10&1023|55296);value=56320|value&1023}output+=stringFromCharCode(value)}return output}function checkScalarValue(codePoint){if(codePoint>=55296&&codePoint<=57343){throw Error("Lone surrogate U+"+codePoint.toString(16).toUpperCase()+" is not a scalar value") +}}function createByte(codePoint,shift){return stringFromCharCode(codePoint>>shift&63|128)}function encodeCodePoint(codePoint){if((codePoint&4294967168)==0){return stringFromCharCode(codePoint)}var symbol="";if((codePoint&4294965248)==0){symbol=stringFromCharCode(codePoint>>6&31|192)}else if((codePoint&4294901760)==0){checkScalarValue(codePoint);symbol=stringFromCharCode(codePoint>>12&15|224);symbol+=createByte(codePoint,6)}else if((codePoint&4292870144)==0){symbol=stringFromCharCode(codePoint>>18&7|240);symbol+=createByte(codePoint,12);symbol+=createByte(codePoint,6)}symbol+=stringFromCharCode(codePoint&63|128);return symbol}function utf8encode(string){var codePoints=ucs2decode(string);var length=codePoints.length;var index=-1;var codePoint;var byteString="";while(++index=byteCount){throw Error("Invalid byte index")}var continuationByte=byteArray[byteIndex]&255;byteIndex++;if((continuationByte&192)==128){return continuationByte&63}throw Error("Invalid continuation byte")}function decodeSymbol(){var byte1;var byte2;var byte3;var byte4;var codePoint;if(byteIndex>byteCount){throw Error("Invalid byte index")}if(byteIndex==byteCount){return false}byte1=byteArray[byteIndex]&255;byteIndex++;if((byte1&128)==0){return byte1}if((byte1&224)==192){var byte2=readContinuationByte();codePoint=(byte1&31)<<6|byte2;if(codePoint>=128){return codePoint}else{throw Error("Invalid continuation byte")}}if((byte1&240)==224){byte2=readContinuationByte();byte3=readContinuationByte();codePoint=(byte1&15)<<12|byte2<<6|byte3;if(codePoint>=2048){checkScalarValue(codePoint);return codePoint}else{throw Error("Invalid continuation byte")}}if((byte1&248)==240){byte2=readContinuationByte();byte3=readContinuationByte();byte4=readContinuationByte();codePoint=(byte1&15)<<18|byte2<<12|byte3<<6|byte4;if(codePoint>=65536&&codePoint<=1114111){return codePoint}}throw Error("Invalid UTF-8 detected")}var byteArray;var byteCount;var byteIndex;function utf8decode(byteString){byteArray=ucs2decode(byteString);byteCount=byteArray.length;byteIndex=0;var codePoints=[];var tmp;while((tmp=decodeSymbol())!==false){codePoints.push(tmp)}return ucs2encode(codePoints)}var utf8={version:"2.0.0",encode:utf8encode,decode:utf8decode};if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){define(function(){return utf8})}else if(freeExports&&!freeExports.nodeType){if(freeModule){freeModule.exports=utf8}else{var object={};var hasOwnProperty=object.hasOwnProperty;for(var key in utf8){hasOwnProperty.call(utf8,key)&&(freeExports[key]=utf8[key])}}}else{root.utf8=utf8}})(this)}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],32:[function(_dereq_,module,exports){(function(global){var rvalidchars=/^[\],:{}\s]*$/;var rvalidescape=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;var rvalidtokens=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;var rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g;var rtrimLeft=/^\s+/;var rtrimRight=/\s+$/;module.exports=function parsejson(data){if("string"!=typeof data||!data){return null}data=data.replace(rtrimLeft,"").replace(rtrimRight,"");if(global.JSON&&JSON.parse){return JSON.parse(data)}if(rvalidchars.test(data.replace(rvalidescape,"@").replace(rvalidtokens,"]").replace(rvalidbraces,""))){return new Function("return "+data)()}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],33:[function(_dereq_,module,exports){exports.encode=function(obj){var str="";for(var i in obj){if(obj.hasOwnProperty(i)){if(str.length)str+="&";str+=encodeURIComponent(i)+"="+encodeURIComponent(obj[i])}}return str};exports.decode=function(qs){var qry={};var pairs=qs.split("&");for(var i=0,l=pairs.length;i1)))/4)-floor((year-1901+month)/100)+floor((year-1601+month)/400)}}if(!(isProperty={}.hasOwnProperty)){isProperty=function(property){var members={},constructor;if((members.__proto__=null,members.__proto__={toString:1},members).toString!=getClass){isProperty=function(property){var original=this.__proto__,result=property in(this.__proto__=null,this);this.__proto__=original;return result}}else{constructor=members.constructor;isProperty=function(property){var parent=(this.constructor||constructor).prototype;return property in this&&!(property in parent&&this[property]===parent[property])}}members=null;return isProperty.call(this,property)}}var PrimitiveTypes={"boolean":1,number:1,string:1,undefined:1};var isHostType=function(object,property){var type=typeof object[property];return type=="object"?!!object[property]:!PrimitiveTypes[type]};forEach=function(object,callback){var size=0,Properties,members,property;(Properties=function(){this.valueOf=0}).prototype.valueOf=0;members=new Properties;for(property in members){if(isProperty.call(members,property)){size++}}Properties=members=null;if(!size){members=["valueOf","toString","toLocaleString","propertyIsEnumerable","isPrototypeOf","hasOwnProperty","constructor"];forEach=function(object,callback){var isFunction=getClass.call(object)==functionClass,property,length;var hasProperty=!isFunction&&typeof object.constructor!="function"&&isHostType(object,"hasOwnProperty")?object.hasOwnProperty:isProperty;for(property in object){if(!(isFunction&&property=="prototype")&&hasProperty.call(object,property)){callback(property)}}for(length=members.length;property=members[--length];hasProperty.call(object,property)&&callback(property));}}else if(size==2){forEach=function(object,callback){var members={},isFunction=getClass.call(object)==functionClass,property;for(property in object){if(!(isFunction&&property=="prototype")&&!isProperty.call(members,property)&&(members[property]=1)&&isProperty.call(object,property)){callback(property)}}}}else{forEach=function(object,callback){var isFunction=getClass.call(object)==functionClass,property,isConstructor;for(property in object){if(!(isFunction&&property=="prototype")&&isProperty.call(object,property)&&!(isConstructor=property==="constructor")){callback(property)}}if(isConstructor||isProperty.call(object,property="constructor")){callback(property)}}}return forEach(object,callback)};if(!has("json-stringify")){var Escapes={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"};var leadingZeroes="000000";var toPaddedString=function(width,value){return(leadingZeroes+(value||0)).slice(-width)};var unicodePrefix="\\u00";var quote=function(value){var result='"',index=0,length=value.length,isLarge=length>10&&charIndexBuggy,symbols;if(isLarge){symbols=value.split("")}for(;index-1/0&&value<1/0){if(getDay){date=floor(value/864e5);for(year=floor(date/365.2425)+1970-1;getDay(year+1,0)<=date;year++);for(month=floor((date-getDay(year,0))/30.42);getDay(year,month+1)<=date;month++);date=1+date-getDay(year,month);time=(value%864e5+864e5)%864e5;hours=floor(time/36e5)%24;minutes=floor(time/6e4)%60;seconds=floor(time/1e3)%60;milliseconds=time%1e3}else{year=value.getUTCFullYear();month=value.getUTCMonth();date=value.getUTCDate();hours=value.getUTCHours();minutes=value.getUTCMinutes();seconds=value.getUTCSeconds();milliseconds=value.getUTCMilliseconds()}value=(year<=0||year>=1e4?(year<0?"-":"+")+toPaddedString(6,year<0?-year:year):toPaddedString(4,year))+"-"+toPaddedString(2,month+1)+"-"+toPaddedString(2,date)+"T"+toPaddedString(2,hours)+":"+toPaddedString(2,minutes)+":"+toPaddedString(2,seconds)+"."+toPaddedString(3,milliseconds)+"Z"}else{value=null}}else if(typeof value.toJSON=="function"&&(className!=numberClass&&className!=stringClass&&className!=arrayClass||isProperty.call(value,"toJSON"))){value=value.toJSON(property)}}if(callback){value=callback.call(object,property,value)}if(value===null){return"null"}className=getClass.call(value);if(className==booleanClass){return""+value}else if(className==numberClass){return value>-1/0&&value<1/0?""+value:"null"}else if(className==stringClass){return quote(""+value)}if(typeof value=="object"){for(length=stack.length;length--;){if(stack[length]===value){throw TypeError()}}stack.push(value);results=[];prefix=indentation;indentation+=whitespace;if(className==arrayClass){for(index=0,length=value.length;index0){for(whitespace="",width>10&&(width=10);whitespace.length=48&&charCode<=57||charCode>=97&&charCode<=102||charCode>=65&&charCode<=70)){abort()}}value+=fromCharCode("0x"+source.slice(begin,Index));break;default:abort()}}else{if(charCode==34){break}charCode=source.charCodeAt(Index);begin=Index;while(charCode>=32&&charCode!=92&&charCode!=34){charCode=source.charCodeAt(++Index)}value+=source.slice(begin,Index)}}if(source.charCodeAt(Index)==34){Index++;return value}abort();default:begin=Index;if(charCode==45){isSigned=true;charCode=source.charCodeAt(++Index)}if(charCode>=48&&charCode<=57){if(charCode==48&&(charCode=source.charCodeAt(Index+1),charCode>=48&&charCode<=57)){abort()}isSigned=false;for(;Index=48&&charCode<=57);Index++);if(source.charCodeAt(Index)==46){position=++Index;for(;position=48&&charCode<=57);position++);if(position==Index){abort()}Index=position}charCode=source.charCodeAt(Index);if(charCode==101||charCode==69){charCode=source.charCodeAt(++Index);if(charCode==43||charCode==45){Index++}for(position=Index;position=48&&charCode<=57);position++);if(position==Index){abort()}Index=position}return+source.slice(begin,Index)}if(isSigned){abort()}if(source.slice(Index,Index+4)=="true"){Index+=4;return true}else if(source.slice(Index,Index+5)=="false"){Index+=5;return false}else if(source.slice(Index,Index+4)=="null"){Index+=4;return null}abort()}}return"$"};var get=function(value){var results,hasMembers;if(value=="$"){abort()}if(typeof value=="string"){if((charIndexBuggy?value.charAt(0):value[0])=="@"){return value.slice(1)}if(value=="["){results=[];for(;;hasMembers||(hasMembers=true)){value=lex();if(value=="]"){break}if(hasMembers){if(value==","){value=lex();if(value=="]"){abort()}}else{abort()}}if(value==","){abort()}results.push(get(value))}return results}else if(value=="{"){results={};for(;;hasMembers||(hasMembers=true)){value=lex();if(value=="}"){break}if(hasMembers){if(value==","){value=lex();if(value=="}"){abort()}}else{abort()}}if(value==","||typeof value!="string"||(charIndexBuggy?value.charAt(0):value[0])!="@"||lex()!=":"){abort()}results[value.slice(1)]=get(lex())}return results}abort()}return value};var update=function(source,property,callback){var element=walk(source,property,callback);if(element===undef){delete source[property]}else{source[property]=element}};var walk=function(source,property,callback){var value=source[property],length;if(typeof value=="object"&&value){if(getClass.call(value)==arrayClass){for(length=value.length;length--;){update(value,length,callback)}}else{forEach(value,function(property){update(value,property,callback)})}}return callback.call(source,property,value)};JSON3.parse=function(source,callback){var result,value;Index=0;Source=""+source;result=get(lex());if(lex()!="$"){abort()}Index=Source=null;return callback&&getClass.call(callback)==functionClass?walk((value={},value[""]=result,value),"",callback):result}}}if(isLoader){define(function(){return JSON3})}})(this)},{}],48:[function(_dereq_,module,exports){module.exports=toArray;function toArray(list,index){var array=[];index=index||0;for(var i=index||0;in;n++){if(!t||"object"!=typeof t)return!1;t=t[o[n]]}return"undefined"==typeof t?!1:t}var r=t("./socket"),s=t("./emitter"),c=(t("./notify"),t("./tab"),t("./browser.utils")),a=function(t){this.options=t,this.socket=r,this.emitter=s,this.utils=c,this.tabHidden=!1;var e=this;r.on("options:set",function(t){s.emit("notify","Setting options..."),e.options=t.options}),s.on("tab:hidden",function(){e.tabHidden=!0}),s.on("tab:visible",function(){e.tabHidden=!1})};a.prototype.canSync=function(t,e){if(t=t||{},t.override)return!0;var n=!0;return e&&(n=this.getOption(e)),n&&t.url===window.location.pathname},a.prototype.getOption=function(t){if(t&&t.match(/\./))return i(this.options,t);var e=this.options[t];return o(e)?!1:e},e.exports=a},{"./browser.utils":2,"./emitter":5,"./notify":16,"./socket":17,"./tab":18}],2:[function(t,e,n){"use strict";var o=n;o.getWindow=function(){return window},o.getDocument=function(){return document},o.getBody=function(){return document.getElementsByTagName("body")[0]},o.getBrowserScrollPosition=function(){var t,e,o=n.getWindow(),i=n.getDocument(),r=i.documentElement,s=i.body;return void 0!==o.pageYOffset?(t=o.pageXOffset,e=o.pageYOffset):(t=r.scrollLeft||s.scrollLeft||0,e=r.scrollTop||s.scrollTop||0),{x:t,y:e}},o.getScrollSpace=function(){var t=n.getDocument(),e=t.documentElement,o=t.body;return{x:o.scrollHeight-e.clientWidth,y:o.scrollHeight-e.clientHeight}},o.saveScrollPosition=function(){var t=o.getBrowserScrollPosition();t=[t.x,t.y],o.getDocument.cookie="bs_scroll_pos="+t.join(",")},o.restoreScrollPosition=function(){var t=o.getDocument().cookie.replace(/(?:(?:^|.*;\s*)bs_scroll_pos\s*\=\s*([^;]*).*$)|^.*$/,"$1").split(",");o.getWindow().scrollTo(t[0],t[1])},o.getElementIndex=function(t,e){var n=o.getDocument().getElementsByTagName(t);return Array.prototype.indexOf.call(n,e)},o.forceChange=function(t){t.blur(),t.focus()},o.getElementData=function(t){var e=t.tagName,n=o.getElementIndex(e,t);return{tagName:e,index:n}},o.getSingleElement=function(t,e){var n=o.getDocument().getElementsByTagName(t);return n[e]},o.getBody=function(){return o.getDocument().getElementsByTagName("body")[0]},o.setScroll=function(t){o.getWindow().scrollTo(t.x,t.y)},o.reloadBrowser=function(){o.getWindow().location.reload(!0)},o.forEach=function(t,e){for(var n=0,o=t.length;o>n;n+=1)e(t[n],n,t)},o.isOldIe=function(){return"undefined"!=typeof o.getWindow().attachEvent}},{}],3:[function(t,e,n){"indexOf"in Array.prototype||(Array.prototype.indexOf=function(t,e){void 0===e&&(e=0),0>e&&(e+=this.length),0>e&&(e=0);for(var n=this.length;n>e;e+=1)if(e in this&&this[e]===t)return e;return-1})},{}],4:[function(t,e,n){"use strict";var o,i=t("./events"),r=t("./browser.utils"),s=t("./emitter"),c=n,a={tagNames:{css:"link",jpg:"img",jpeg:"img",png:"img",svg:"img",gif:"img",js:"script"},attrs:{link:"href",img:"src",script:"src"}},l="codeSync",u=function(){return window.location.pathname};c.init=function(t){t.options.tagNames&&(a.tagNames=t.options.tagNames),"window.name"===t.options.scrollRestoreTechnique?c.saveScrollInName(s):c.saveScrollInCookie(r.getWindow(),r.getDocument()),t.socket.on("file:reload",c.reload(t)),t.socket.on("browser:reload",function(){t.canSync({url:u()},l)&&c.reloadBrowser(!0,t)})},c.saveScrollInName=function(){var t="<>",e="<>",n=new RegExp(t+"(.+?)"+e),o=r.getWindow(),i={};s.on("browser:hardReload",function(n){var i=[o.name,t,JSON.stringify({bs:{hardReload:!0,scroll:n.scrollPosition}}),e].join("");o.name=i});try{var c=o.name.match(n);c&&(i=JSON.parse(c[1]))}catch(a){i={}}i.bs&&i.bs.hardReload&&i.bs.scroll&&r.setScroll(i.bs.scroll),o.name=o.name.replace(n,"")},c.saveScrollInCookie=function(t,e){r.isOldIe()&&("complete"===e.readyState?r.restoreScrollPosition():i.manager.addEvent(e,"readystatechange",function(){"complete"===e.readyState&&r.restoreScrollPosition()}),s.on("browser:hardReload",r.saveScrollPosition))},c.swapFile=function(t,e,n){var i=t[e],r=(new Date).getTime(),s="?rel="+r,a=c.getFilenameOnly(i);a&&(i=a[0]),n&&(n.timestamps||(s="")),t[e]=i+s;var l=document.body;return setTimeout(function(){o?(o.style.display="none",o.style.display="block"):(o=document.createElement("DIV"),l.appendChild(o))},200),{elem:t,timeStamp:r}},c.getFilenameOnly=function(t){return/^[^\?]+(?=\?)/.exec(t)},c.reload=function(t){return function(e){if(t.canSync({url:u()},l)){var n,o=t.options,i=t.emitter;if((e.url||!o.injectChanges)&&c.reloadBrowser(!0),e.basename&&e.ext){var r=c.getElems(e.ext),s=c.getMatches(r.elems,e.basename,r.attr);s.length&&o.notify&&i.emit("notify",{message:"Injected: "+e.basename});for(var a=0,d=s.length;d>a;a+=1)n=c.swapFile(s[a],r.attr,o)}return n}}},c.getTagName=function(t){return a.tagNames[t]},c.getAttr=function(t){return a.attrs[t]},c.getMatches=function(t,e,n){if("*"===e[0])return t;for(var o=[],i=0,r=t.length;r>i;i+=1)-1!==t[i][n].indexOf(e)&&o.push(t[i]);return o},c.getElems=function(t){var e=c.getTagName(t),n=c.getAttr(e);return{elems:document.getElementsByTagName(e),attr:n}},c.reloadBrowser=function(t){s.emit("browser:hardReload",{scrollPosition:r.getBrowserScrollPosition()}),t&&r.reloadBrowser()}},{"./browser.utils":2,"./emitter":5,"./events":6}],5:[function(t,e,n){"use strict";n.events={},n.emit=function(t,e){var o,i=n.events[t];if(i&&i.listeners){o=i.listeners;for(var r=0,s=o.length;s>r;r+=1)o[r](e)}},n.on=function(t,e){var o=n.events;o[t]?o[t].listeners.push(e):o[t]={listeners:[e]}}},{}],6:[function(t,e,n){n._ElementCache=function(){var t={},e=1,n="data"+(new Date).getTime();this.getData=function(o){var i=o[n];return i||(i=o[n]=e++,t[i]={}),t[i]},this.removeData=function(e){var o=e[n];if(o){delete t[o];try{delete e[n]}catch(i){e.removeAttribute&&e.removeAttribute(n)}}}},n._fixEvent=function(t){function e(){return!0}function n(){return!1}if(!t||!t.stopPropagation){var o=t||window.event;t={};for(var i in o)t[i]=o[i];if(t.target||(t.target=t.srcElement||document),t.relatedTarget=t.fromElement===t.target?t.toElement:t.fromElement,t.preventDefault=function(){t.returnValue=!1,t.isDefaultPrevented=e},t.isDefaultPrevented=n,t.stopPropagation=function(){t.cancelBubble=!0,t.isPropagationStopped=e},t.isPropagationStopped=n,t.stopImmediatePropagation=function(){this.isImmediatePropagationStopped=e,this.stopPropagation()},t.isImmediatePropagationStopped=n,null!=t.clientX){var r=document.documentElement,s=document.body;t.pageX=t.clientX+(r&&r.scrollLeft||s&&s.scrollLeft||0)-(r&&r.clientLeft||s&&s.clientLeft||0),t.pageY=t.clientY+(r&&r.scrollTop||s&&s.scrollTop||0)-(r&&r.clientTop||s&&s.clientTop||0)}t.which=t.charCode||t.keyCode,null!=t.button&&(t.button=1&t.button?0:4&t.button?1:2&t.button?2:0)}return t},n._EventManager=function(t){function e(e,n){function o(t){for(var e in t)return!1;return!0}var i=t.getData(e);0===i.handlers[n].length&&(delete i.handlers[n],document.removeEventListener?e.removeEventListener(n,i.dispatcher,!1):document.detachEvent&&e.detachEvent("on"+n,i.dispatcher)),o(i.handlers)&&(delete i.handlers,delete i.dispatcher),o(i)&&t.removeData(e)}var o=1;this.addEvent=function(e,i,r){var s=t.getData(e);s.handlers||(s.handlers={}),s.handlers[i]||(s.handlers[i]=[]),r.guid||(r.guid=o++),s.handlers[i].push(r),s.dispatcher||(s.disabled=!1,s.dispatcher=function(t){if(!s.disabled){t=n._fixEvent(t);var o=s.handlers[t.type];if(o)for(var i=0;io;o+=1)t.addEvent(n[o],"change",e)}var o=document.getElementsByTagName("select"),i=document.getElementsByTagName("input");n(o),n(i)},n.browserEvent=function(t){return function(e){if(n.canEmitEvents){var i,r=e.target||e.srcElement;("radio"===r.type||"checkbox"===r.type||"SELECT"===r.tagName)&&(i=t.utils.getElementData(r),i.type=r.type,i.value=r.value,i.checked=r.checked,t.socket.emit(o,i))}else n.canEmitEvents=!0}},n.socketEvent=function(t){return function(e){if(!t.canSync(e,i))return!1;n.canEmitEvents=!1;var o=t.utils.getSingleElement(e.tagName,e.index);return o?("radio"===e.type&&(o.checked=!0),"checkbox"===e.type&&(o.checked=e.checked),"SELECT"===e.tagName&&(o.value=e.value),o):!1}}},{}],12:[function(t,e,n){"use strict";var o=t("./events").manager;n.plugins={scroll:t("./ghostmode.scroll"),clicks:t("./ghostmode.clicks"),forms:t("./ghostmode.forms"),location:t("./ghostmode.location")},n.init=function(t){for(var e in n.plugins)n.plugins[e].init(t,o)}},{"./events":6,"./ghostmode.clicks":7,"./ghostmode.forms":9,"./ghostmode.location":13,"./ghostmode.scroll":14}],13:[function(t,e,n){"use strict";var o="browser:location",i="ghostMode.location";n.canEmitEvents=!0,n.init=function(t){t.socket.on(o,n.socketEvent(t))},n.socketEvent=function(t){return function(e){return t.canSync(e,i)?void(e.path?n.setPath(e.path):n.setUrl(e.url)):!1}},n.setUrl=function(t){window.location=t},n.setPath=function(t){window.location=window.location.protocol+"//"+window.location.host+t}},{}],14:[function(t,e,n){"use strict";var o,i="scroll",r="scroll:element",s="ghostMode.scroll";n.canEmitEvents=!0,n.init=function(t,e){function s(r,s){c[r]&&c[r].length&&"querySelectorAll"in document&&o.forEach(c[r],function(r){var c=document.querySelectorAll(r)||[];o.forEach(c,function(r){var c=o.getElementData(r);c.cacheSelector=c.tagName+":"+c.index,c.map=s,a[c.cacheSelector]=r,e.addEvent(r,i,n.browserEventForElement(t,r,c))})})}o=t.utils;var c=t.options;e.addEvent(window,i,n.browserEvent(t)),t.socket.on(i,n.socketEvent(t));var a={};s("scrollElements",!1),s("scrollElementMapping",!0),t.socket.on(r,n.socketEventForElement(t,a))},n.socketEvent=function(t){return function(e){if(!t.canSync(e,s))return!1;var i=o.getScrollSpace();return n.canEmitEvents=!1,t.options&&t.options.scrollProportionally?window.scrollTo(0,i.y*e.position.proportional):window.scrollTo(0,e.position.raw.y)}},n.socketEventForElement=function(t,e){return function(o){function i(t,n){e[t]&&(e[t].scrollTop=n)}return t.canSync(o,s)?(n.canEmitEvents=!1,o.map?Object.keys(e).forEach(function(t){i(t,o.position)}):void i(o.elem.cacheSelector,o.position)):!1}},n.browserEventForElement=function(t,e,o){return function(){var i=n.canEmitEvents;i&&t.socket.emit(r,{position:e.scrollTop,elem:o,map:o.map}),n.canEmitEvents=!0}},n.browserEvent=function(t){return function(){var e=n.canEmitEvents;e&&t.socket.emit(i,{position:n.getScrollPosition()}),n.canEmitEvents=!0}},n.getScrollPosition=function(){var t=o.getBrowserScrollPosition();return{raw:t,proportional:n.getScrollTopPercentage(t)}},n.getScrollPercentage=function(t,e){var n=e.x/t.x,o=e.y/t.y;return{x:n||0,y:o}},n.getScrollTopPercentage=function(t){var e=o.getScrollSpace(),i=n.getScrollPercentage(e,t);return i.y}},{}],15:[function(t,e,n){"use strict";var o=t("./socket"),i=(t("./client-shims"),t("./notify")),r=t("./code-sync"),s=t("./browser-sync"),c=t("./ghostmode"),a=(t("./emitter"),t("./events"),t("./browser.utils")),l=!1,u=!1;n.init=function(t){l&&t.reloadOnRestart&&a.reloadBrowser();var e=window.___browserSync___||{};if(!e.client){e.client=!0;var n=new s(t);c.init(n),r.init(n),i.init(n),t.notify&&i.flash("Connected to BrowserSync")}u||(o.on("disconnect",function(){t.notify&&i.flash("Disconnected from BrowserSync"),l=!0}),u=!0)},o.on("connection",n.init)},{"./browser-sync":1,"./browser.utils":2,"./client-shims":3,"./code-sync":4,"./emitter":5,"./events":6,"./ghostmode":12,"./ghostmode.clicks":7,"./ghostmode.forms":9,"./ghostmode.forms.input":8,"./ghostmode.forms.submit":10,"./ghostmode.forms.toggles":11,"./ghostmode.location":13,"./ghostmode.scroll":14,"./notify":16,"./socket":17}],16:[function(t,e,n){"use strict";var o,i,r,s=(t("./ghostmode.scroll"),t("./browser.utils")),c={display:"none",padding:"15px",fontFamily:"sans-serif",position:"fixed",fontSize:"0.9em",zIndex:9999,right:0,top:0,borderBottomLeftRadius:"5px",backgroundColor:"#1B2032",margin:0,color:"white",textAlign:"center"};n.init=function(t){i=t.options;var e=c;if(i.notify.styles)if("[object Array]"===Object.prototype.toString.call(i.notify.styles))e=i.notify.styles.join(";");else for(var r in i.notify.styles)i.notify.styles.hasOwnProperty(r)&&(e[r]=i.notify.styles[r]);if(o=document.createElement("DIV"),o.id="__bs_notify__","string"==typeof e)o.style.cssText=e;else for(var s in e)o.style[s]=e[s];var a=n.watchEvent(t);return t.emitter.on("notify",a),t.socket.on("browser:notify",a),o},n.watchEvent=function(t){return function(e){if(t.options.notify){if("string"==typeof e)return n.flash(e);n.flash(e.message,e.timeout)}}},n.getElem=function(){return o},n.flash=function(t,e){var o=n.getElem(),i=s.getBody();return o?(o.innerHTML=t,o.style.display="block",i.appendChild(o),r&&(clearTimeout(r),r=void 0),r=window.setTimeout(function(){o.style.display="none",o.parentNode&&i.removeChild(o)},e||2e3),o):!1}},{"./browser.utils":2,"./ghostmode.scroll":14}],17:[function(t,e,n){"use strict";var o=window.___browserSync___||{};n.socket=o.socket||{emit:function(){},on:function(){}},n.getPath=function(){return window.location.pathname},n.emit=function(t,e){var o=n.socket;o&&o.emit&&(e.url=n.getPath(),o.emit(t,e))},n.on=function(t,e){n.socket.on(t,e)}},{}],18:[function(t,e,n){function o(){a[i]?c.emit("tab:hidden"):c.emit("tab:visible")}var i,r,s=t("./browser.utils"),c=t("./emitter"),a=s.getDocument();"undefined"!=typeof a.hidden?(i="hidden",r="visibilitychange"):"undefined"!=typeof a.mozHidden?(i="mozHidden",r="mozvisibilitychange"):"undefined"!=typeof a.msHidden?(i="msHidden",r="msvisibilitychange"):"undefined"!=typeof a.webkitHidden&&(i="webkitHidden",r="webkitvisibilitychange"),"undefined"==typeof a.addEventListener||"undefined"==typeof a[i]||a.addEventListener(r,o,!1)},{"./browser.utils":2,"./emitter":5}]},{},[15]); \ No newline at end of file diff --git a/roncoo-pay-web-boss/src/main/webapp/common/scan/pay_files/common.js b/roncoo-pay-web-boss/src/main/webapp/common/scan/pay_files/common.js new file mode 100644 index 0000000000000000000000000000000000000000..1b22c8bab77a2c816bc0099d132fc26286944d72 --- /dev/null +++ b/roncoo-pay-web-boss/src/main/webapp/common/scan/pay_files/common.js @@ -0,0 +1,45996 @@ +//兼容IE8/9的console +;(function(global){ + 'use strict'; + global.console = global.console || {}; + var con = global.console; + var prop, method; + var empty = {}; + var dummy = function() {}; + var properties = 'memory'.split(','); + var methods = ('assert,clear,count,debug,dir,dirxml,error,exception,group,' + + 'groupCollapsed,groupEnd,info,log,markTimeline,profile,profiles,profileEnd,' + + 'show,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn').split(','); + while (prop = properties.pop()) if (!con[prop]) con[prop] = empty; + while (method = methods.pop()) if (!con[method]) con[method] = dummy; + + + var config = { + goods_img: 'http://jh-ljs-goods.oss-cn-shenzhen.aliyuncs.com/', + account_img:'http://jh-ljs-account.oss-cn-shenzhen.aliyuncs.com/' + }; + global.CFG = config; + +})(typeof window === 'undefined' ? this : window); + + +// // Console-polyfill. MIT license. +// // https://github.com/paulmillr/console-polyfill +// // Make it safe to do console.log() always. +// (function(global) { +// 'use strict'; +// global.console = global.console || {}; +// var con = global.console; +// var prop, method; +// var empty = {}; +// var dummy = function() {}; +// var properties = 'memory'.split(','); +// var methods = ('assert,clear,count,debug,dir,dirxml,error,exception,group,' + +// 'groupCollapsed,groupEnd,info,log,markTimeline,profile,profiles,profileEnd,' + +// 'show,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn').split(','); +// while (prop = properties.pop()) if (!con[prop]) con[prop] = empty; +// while (method = methods.pop()) if (!con[method]) con[method] = dummy; +// })(typeof window === 'undefined' ? this : window); +// // Using `this` for web workers while maintaining compatibility with browser +// // targeted script loaders such as Browserify or Webpack where the only way to +// // get to the global object is via `window`. + +/*! + * jQuery JavaScript Library v2.1.4 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-04-28T16:01Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// + +var arr = []; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + version = "2.1.4", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; + }, + + isPlainObject: function( obj ) { + // Not plain objects: + // - Any object or value whose internal [[Class]] property is not "[object Object]" + // - DOM nodes + // - window + if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.constructor && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + + // If the function hasn't returned already, we're confident that + // |obj| is a plain object, created by {} or constructed with new Object + return true; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + // Support: Android<4.0, iOS<6 (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call(obj) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + var script, + indirect = eval; + + code = jQuery.trim( code ); + + if ( code ) { + // If the code includes a valid, prologue position + // strict mode pragma, execute code by injecting a + // script tag into the document. + if ( code.indexOf("use strict") === 1 ) { + script = document.createElement("script"); + script.text = code; + document.head.appendChild( script ).parentNode.removeChild( script ); + } else { + // Otherwise, avoid the DOM node creation, insertion + // and removal by using an indirect global eval + indirect( code ); + } + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE9-11+ + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Support: Android<4.1 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + characterEncoding + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + nodeType = context.nodeType; + + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + if ( !seed && documentIsHTML ) { + + // Try to shortcut find operations when possible (e.g., not under DocumentFragment) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document (jQuery #6963) + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType !== 1 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + parent = doc.defaultView; + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent !== parent.top ) { + // IE11 does not have attachEvent, so all must suffer + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Support tests + ---------------------------------------------------------------------- */ + documentIsHTML = !isXML( doc ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (oldCache = outerCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + outerCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context !== document && context; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is no seed and only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) >= 0 ) !== not; + }); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); +}; + +jQuery.fn.extend({ + find: function( selector ) { + var i, + len = this.length, + ret = [], + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +}); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Support: Blackberry 4.6 + // gEBID returns nodes no longer in the document (#6963) + if ( elem && elem.parentNode ) { + // Inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof rootjQuery.ready !== "undefined" ? + rootjQuery.ready( selector ) : + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.extend({ + dir: function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; + }, + + sibling: function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; + } +}); + +jQuery.fn.extend({ + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter(function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.unique( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return elem.contentDocument || jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.unique( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +}); +var rnotwhite = (/\S+/g); + + + +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // Add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // If we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend({ + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +}); + +/** + * The ready event handler and self cleanup method + */ +function completed() { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + jQuery.ready(); +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // We once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + } else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + len ? fn( elems[0], key ) : emptyGet; +}; + + +/** + * Determines whether an object can have data + */ +jQuery.acceptData = function( owner ) { + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + /* jshint -W018 */ + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + +function Data() { + // Support: Android<4, + // Old WebKit does not have Object.preventExtensions/freeze method, + // return new empty object instead with no [[set]] accessor + Object.defineProperty( this.cache = {}, 0, { + get: function() { + return {}; + } + }); + + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; +Data.accepts = jQuery.acceptData; + +Data.prototype = { + key: function( owner ) { + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return the key for a frozen object. + if ( !Data.accepts( owner ) ) { + return 0; + } + + var descriptor = {}, + // Check if the owner object already has a cache key + unlock = owner[ this.expando ]; + + // If not, create one + if ( !unlock ) { + unlock = Data.uid++; + + // Secure it in a non-enumerable, non-writable property + try { + descriptor[ this.expando ] = { value: unlock }; + Object.defineProperties( owner, descriptor ); + + // Support: Android<4 + // Fallback to a less secure definition + } catch ( e ) { + descriptor[ this.expando ] = unlock; + jQuery.extend( owner, descriptor ); + } + } + + // Ensure the cache object + if ( !this.cache[ unlock ] ) { + this.cache[ unlock ] = {}; + } + + return unlock; + }, + set: function( owner, data, value ) { + var prop, + // There may be an unlock assigned to this node, + // if there is no entry for this "owner", create one inline + // and set the unlock as though an owner entry had always existed + unlock = this.key( owner ), + cache = this.cache[ unlock ]; + + // Handle: [ owner, key, value ] args + if ( typeof data === "string" ) { + cache[ data ] = value; + + // Handle: [ owner, { properties } ] args + } else { + // Fresh assignments by object are shallow copied + if ( jQuery.isEmptyObject( cache ) ) { + jQuery.extend( this.cache[ unlock ], data ); + // Otherwise, copy the properties one-by-one to the cache object + } else { + for ( prop in data ) { + cache[ prop ] = data[ prop ]; + } + } + } + return cache; + }, + get: function( owner, key ) { + // Either a valid cache is found, or will be created. + // New caches will be created and the unlock returned, + // allowing direct access to the newly created + // empty data object. A valid owner object must be provided. + var cache = this.cache[ this.key( owner ) ]; + + return key === undefined ? + cache : cache[ key ]; + }, + access: function( owner, key, value ) { + var stored; + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ((key && typeof key === "string") && value === undefined) ) { + + stored = this.get( owner, key ); + + return stored !== undefined ? + stored : this.get( owner, jQuery.camelCase(key) ); + } + + // [*]When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, name, camel, + unlock = this.key( owner ), + cache = this.cache[ unlock ]; + + if ( key === undefined ) { + this.cache[ unlock ] = {}; + + } else { + // Support array or space separated string of keys + if ( jQuery.isArray( key ) ) { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = key.concat( key.map( jQuery.camelCase ) ); + } else { + camel = jQuery.camelCase( key ); + // Try the string as a key before any manipulation + if ( key in cache ) { + name = [ key, camel ]; + } else { + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + name = camel; + name = name in cache ? + [ name ] : ( name.match( rnotwhite ) || [] ); + } + } + + i = name.length; + while ( i-- ) { + delete cache[ name[ i ] ]; + } + } + }, + hasData: function( owner ) { + return !jQuery.isEmptyObject( + this.cache[ owner[ this.expando ] ] || {} + ); + }, + discard: function( owner ) { + if ( owner[ this.expando ] ) { + delete this.cache[ owner[ this.expando ] ]; + } + } +}; +var data_priv = new Data(); + +var data_user = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + data_user.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend({ + hasData: function( elem ) { + return data_user.hasData( elem ) || data_priv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return data_user.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + data_user.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to data_priv methods, these can be deprecated. + _data: function( elem, name, data ) { + return data_priv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + data_priv.remove( elem, name ); + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = data_user.get( elem ); + + if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + data_priv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + data_user.set( this, key ); + }); + } + + return access( this, function( value ) { + var data, + camelKey = jQuery.camelCase( key ); + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + // Attempt to get data from the cache + // with the key as-is + data = data_user.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to get data from the cache + // with the key camelized + data = data_user.get( elem, camelKey ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, camelKey, undefined ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each(function() { + // First, attempt to store a copy or reference of any + // data that might've been store with a camelCased key. + var data = data_user.get( this, camelKey ); + + // For HTML5 data-* attribute interop, we have to + // store property names with dashes in a camelCase form. + // This might not apply to all properties...* + data_user.set( this, camelKey, value ); + + // *... In the case of properties that might _actually_ + // have dashes, we need to also store a copy of that + // unchanged property. + if ( key.indexOf("-") !== -1 && data !== undefined ) { + data_user.set( this, key, value ); + } + }); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each(function() { + data_user.remove( this, key ); + }); + } +}); + + +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = data_priv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = data_priv.access( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return data_priv.get( elem, key ) || data_priv.access( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + data_priv.remove( elem, [ type + "queue", key ] ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = data_priv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); + }; + +var rcheckableType = (/^(?:checkbox|radio)$/i); + + + +(function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Safari<=5.1 + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari<=5.1, Android<4.2 + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<=11+ + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +})(); +var strundefined = typeof undefined; + + + +support.focusinBubbles = "onfocusin" in window; + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = data_priv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = data_priv.hasData( elem ) && data_priv.get( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + data_priv.remove( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && jQuery.acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.disabled !== true || event.type !== "click" ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: Cordova 2.5 (WebKit) (#13255) + // All events should have a target; Cordova deviceready doesn't + if ( !event.target ) { + event.target = document; + } + + // Support: Safari 6.0+, Chrome<28 + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } +}; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + // Support: Android<4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && e.preventDefault ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && e.stopPropagation ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// Support: Chrome 15+ +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// Support: Firefox, Chrome, Safari +// Create "bubbling" focus and blur events +if ( !support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = data_priv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + data_priv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = data_priv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + data_priv.remove( doc, fix ); + + } else { + data_priv.access( doc, fix, attaches ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); + + +var + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rhtml = /<|&#?\w+;/, + rnoInnerhtml = /<(?:script|style|link)/i, + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /^$|\/(?:java|ecma)script/i, + rscriptTypeMasked = /^true\/(.*)/, + rcleanScript = /^\s*\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + + // Support: IE9 + option: [ 1, "" ], + + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] + }; + +// Support: IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: 1.x compatibility +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute("type"); + } + + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + data_priv.set( + elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) + ); + } +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( data_priv.hasData( src ) ) { + pdataOld = data_priv.access( src ); + pdataCur = data_priv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( data_user.hasData( src ) ) { + udataOld = data_user.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + data_user.set( dest, udataCur ); + } +} + +function getAll( context, tag ) { + var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : + context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : + []; + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], ret ) : + ret; +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + // Support: QtWebKit, PhantomJS + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: QtWebKit, PhantomJS + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; + }, + + cleanData: function( elems ) { + var data, elem, type, key, + special = jQuery.event.special, + i = 0; + + for ( ; (elem = elems[ i ]) !== undefined; i++ ) { + if ( jQuery.acceptData( elem ) ) { + key = elem[ data_priv.expando ]; + + if ( key && (data = data_priv.cache[ key ]) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + if ( data_priv.cache[ key ] ) { + // Discard any remaining `private` data + delete data_priv.cache[ key ]; + } + } + } + // Discard any remaining `user` data + delete data_user.cache[ elem[ data_user.expando ] ]; + } + } +}); + +jQuery.fn.extend({ + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each(function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + }); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + remove: function( selector, keepData /* Internal Use Only */ ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var arg = arguments[ 0 ]; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + arg = this.parentNode; + + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); + } + }); + + // Force removal if there was no new content (e.g., from empty arguments) + return arg && (arg.length || arg.nodeType) ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + self.domManip( args, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + // Support: QtWebKit + // jQuery.merge because push.apply(_, arraylike) throws + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); + } + } + } + } + } + } + + return this; + } +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: QtWebKit + // .get() because push.apply(_, arraylike) throws + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + + +var iframe, + elemdisplay = {}; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var style, + elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? + + // Use of this method is a temporary fix (more like optimization) until something better comes along, + // since it was removed from specification and supported only in FF + style.display : jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery( "').on('load', function() { + setTimeout(function() { + $iframe.off('load').remove() + }, 0) + }).appendTo($body) + } + + //app + //for ios 4 + //浏览器是否支持fixed + function isSupportFixed() { + var userAgent = window.navigator.userAgent, + ios = userAgent.match(/(iPad|iPhone|iPod)\s+OS\s([\d_\.]+)/), + ios5below = ios && ios[2] && (parseInt(ios[2].replace(/_/g, '.'), 10) < 5), + operaMini = /Opera Mini/i.test(userAgent), + body = document.body, + div, isFixed; + + div = document.createElement('div'); + div.style.cssText = 'display:none;position:fixed;z-index:100;'; + body.appendChild(div); + isFixed = window.getComputedStyle(div).position != 'fixed'; + body.removeChild(div); + div = null; + return !!(isFixed || ios5below || operaMini); + } + + module.exports = { + changeTitle: changeTitle, + isSupportFixed: isSupportFixed + } + + +/***/ }, +/* 11 */ +/***/ function(module, exports) { + + function DocmentView(){ + var doch = window.innerHeight||document.documentElement.offsetHeight||document.body.clientHieght; + var docw = window.innerWidth||document.documentElement.offsetWidth||document.body.clientWidth; + var docST = document.documentElement.scrollTop||document.body.scrollTop; + var docSL = document.documentElement.scrollLeft||document.body.scrollLeft; + return {width:docw,height:doch,scrollTop:docST,scrollLeft:docSL}; + }; + + //类数组对象转换成数组 + function arg2arr(s){ + try{ + return Array.prototype.slice.call(s); + } catch(e){ + var arr = []; + for(var i = 0,len = s.length; i < len; i++){ + //arr.push(s[i]); + arr[i] = s[i]; //据说这样比push快 + } + return arr; + } + } + + /* + * 消息弹出抽象函数 + * 实例实现 tipsItem / tipsBox / anim + */ + var tipsbox = function(){ + this.pop = function(mmm,stat,cb){ + if(!stat)stat='normal'; + pushmsg.call(this,mmm,stat); + var args = arg2arr(arguments); + args = args.slice(3); + // if(cb){ + // // add_action('tipsbox',[cb,kkkccc],cb.length,this); + // add_action('do_tipsbox',cb,cb.length,this); + // } + } + + //新建消息实例,可定制 + this.tipsItem = function(stat){}; + + //消息实例容器,可定制 + this.tipsBox = function(stat){}; + + //消息动画 实例化后必须定制 + this.anim = function(item,container){ if(!item) return;}; + + //组合执行方法 + function pushmsg(mm,stat){ + var item = this.tipsItem(stat); + var box = this.tipsBox(stat); + item.innerHTML = mm; + box.appendChild(item); + this.anim(item,box,stat); + return; + } + + } + + + /* + * msgtips 消息弹出窗,为tipsbox抽象的实例 + * @msg 传入的消息 + * @stat 传入状态,目前支持normal,alert + * @cb 动画结束后的回调函数 + */ + var msgtips = function(msg,stat,cb){ + var msg_left, msg_top; + var docRect = DocmentView(); + var scrollleft = docRect.scrollLeft; + var scrolltop = docRect.scrollTop; + var clientwidth = docRect.width; + var clientheight = docRect.height; + + + var msgtip = new tipsbox(); + //新建消息实例,可定制 + msgtip.tipsItem =function(stat){ + var tip = document.createElement('div'); + var subtip = document.createElement('div'); + var bgcolor='background-color:#4ba2f9;'; + tip.className = 'showmsg'; + if(stat=='alert'){ + bgcolor='background-color:rgb(211, 13, 21);'; + } + tip.style.cssText = 'display:none;width:100%;text-align:center; margin-top:10px;color:#fff;line-height:40px;font-size:16px;'+bgcolor; + return tip; + } + + //消息实例容器,可定制 + msgtip.tipsBox=function(stat){ + msg_left = Math.round((parseInt(clientwidth)-300)/2); + msg_top = 'top:0;'; + if(stat=='alert'){ + msg_top = Math.round((parseInt(clientheight)-150)/2); + msg_top = 'top:'+msg_top+'px;height:200px;overflow:hidden;'; + } + $('#msgcontainer').length ? '' : $('body').append('
'); + return $('#msgcontainer')[0]; + } + + msgtip.anim=function(item,container){ + clearTimeout(ggg); + $(item).fadeIn('slow').delay(2000).animate({'height':0,'opacity':0,'margin':0},300); + var ggg = setTimeout(function(){ + $(item).remove(); + if($('.showmsg').length==0) $(container).remove(); + // do_action('do_tipsbox'); + }, 4000); + } + + if(cb) msgtip.pop(msg,stat,cb); + else + msgtip.pop(msg,stat); + } + // window.tips = msgtips; + + module.exports = msgtips + + +/***/ }, +/* 12 */ +/***/ function(module, exports, __webpack_require__) { + + // var libs = require('libs/libs') + var qs = __webpack_require__(13); + var src = "/"; + var demoSrc = "http://mock.agzgz.com/"; + + function getObjType(object){ + return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1]; + }; + + var apiPath = { + base: src, + dirs: {}, + weixin: { + userlist: src+'wx/userlist', //?access_token=_cqch&next_openid= + userinfo: src+'wx/userinfo' + } + } + + function req( api, param, cb ){ + var url = apiPath.dirs[api]; + if( !url ) + url = api; + + if( getObjType(param)==='Object' ) { + var keys = Object.keys(param) + if( keys.length>0 ) + $.post( url, param, function( body, status ){ + if( status === 'success' ) cb( body ) ; + }, "json") + else + $.post( url, {test: '123'}, function( body, status ){ + if( status === 'success' ) cb( body ) ; + }, "json") + } + else{ + if( getObjType(param)==='Function' ){ + cb = param; + } + $.post( url, {test: '123'}, function( body, status ){ + if( status === 'success' ) cb( body ) ; + }, "json") + } + } + + // + // function wx( api, param, cb ){ + // var url = apiPath.weixin[api]; + // if( !param ) + // param = {test: "123"} + // if(url){ + // $.post( url, param, function( body, status ){ + // if( status === 'success' ) { + // cb( body ); + // } + // }, "json") + // } + // } + + module.exports = { + apiPath: apiPath, + req: req + // wx: wx + } + + +/***/ }, +/* 13 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.decode = exports.parse = __webpack_require__(14); + exports.encode = exports.stringify = __webpack_require__(15); + + +/***/ }, +/* 14 */ +/***/ function(module, exports) { + + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + 'use strict'; + + // If obj.hasOwnProperty has been overridden, then calling + // obj.hasOwnProperty(prop) will break. + // See: https://github.com/joyent/node/issues/1707 + function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + + module.exports = function(qs, sep, eq, options) { + sep = sep || '&'; + eq = eq || '='; + var obj = {}; + + if (typeof qs !== 'string' || qs.length === 0) { + return obj; + } + + var regexp = /\+/g; + qs = qs.split(sep); + + var maxKeys = 1000; + if (options && typeof options.maxKeys === 'number') { + maxKeys = options.maxKeys; + } + + var len = qs.length; + // maxKeys <= 0 means that we should not limit keys count + if (maxKeys > 0 && len > maxKeys) { + len = maxKeys; + } + + for (var i = 0; i < len; ++i) { + var x = qs[i].replace(regexp, '%20'), + idx = x.indexOf(eq), + kstr, vstr, k, v; + + if (idx >= 0) { + kstr = x.substr(0, idx); + vstr = x.substr(idx + 1); + } else { + kstr = x; + vstr = ''; + } + + k = decodeURIComponent(kstr); + v = decodeURIComponent(vstr); + + if (!hasOwnProperty(obj, k)) { + obj[k] = v; + } else if (isArray(obj[k])) { + obj[k].push(v); + } else { + obj[k] = [obj[k], v]; + } + } + + return obj; + }; + + var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; + }; + + +/***/ }, +/* 15 */ +/***/ function(module, exports) { + + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + 'use strict'; + + var stringifyPrimitive = function(v) { + switch (typeof v) { + case 'string': + return v; + + case 'boolean': + return v ? 'true' : 'false'; + + case 'number': + return isFinite(v) ? v : ''; + + default: + return ''; + } + }; + + module.exports = function(obj, sep, eq, name) { + sep = sep || '&'; + eq = eq || '='; + if (obj === null) { + obj = undefined; + } + + if (typeof obj === 'object') { + return map(objectKeys(obj), function(k) { + var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; + if (isArray(obj[k])) { + return map(obj[k], function(v) { + return ks + encodeURIComponent(stringifyPrimitive(v)); + }).join(sep); + } else { + return ks + encodeURIComponent(stringifyPrimitive(obj[k])); + } + }).join(sep); + + } + + if (!name) return ''; + return encodeURIComponent(stringifyPrimitive(name)) + eq + + encodeURIComponent(stringifyPrimitive(obj)); + }; + + var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; + }; + + function map (xs, f) { + if (xs.map) return xs.map(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + res.push(f(xs[i], i)); + } + return res; + } + + var objectKeys = Object.keys || function (obj) { + var res = []; + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key); + } + return res; + }; + + +/***/ }, +/* 16 */ +/***/ function(module, exports) { + + // 调用样例 + // var msgs = require('../_common/message'); + // $(".con-content .a").click(function(){ + // msgs.alert("默认中部提示窗"); + + // msgs.alert({ + // content:"弹窗内容", //不可为空 + // type:"confirm", //可以为空,默认为alert,可选值有tip, alert, confirm,为tip时3秒后自动关闭提示窗 + // title:"title名称", //可以为空,默认为"提示" + // button:"确认按钮名称", //可以为空,默认为"确认" + // callback:function(){ + // 可以为空,为空是默认为关闭窗口 + // console.log("点击确认回调函数") + // }, + // cancel:function(){ + // 可以为空,为空是默认为关闭窗口 + // console.log("点击取消回调函数") + // } + // }); + // }) + + // $(".con-content .b").click(function(){ + // msgs.tip({ + // content:"弹窗内容", //不可为空 + // type:"confirm", //可以为空,默认为tip,可选值有tip, alert, confirm,为tip时3秒后自动关闭提示窗 + // title:"title名称", //可以为空,默认为"提示" + // button:"确认按钮名称", //可以为空,默认为"确认" + // callback:function(){ + // 可以为空,为空是默认为关闭窗口 + // console.log("点击确认回调函数") + // }, + // cancel:function(){ + // 可以为空,为空是默认为关闭窗口 + // console.log("点击取消回调函数") + // } + // }); + // }) + + + var alert = function(mdata){ + if ($(".j-msg-center").length>0) { + $(".j-msg-center").stop().remove(); + }; + createHTML(mdata,"j-msg-center"); + }, + tip = function(mdata){ + + if ($(".j-msg-top").length>0) { + $(".j-msg-top").stop().remove(); + }; + createHTML(mdata,"j-msg-top"); + }, + getObjType = function(object) { + return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1]; + }, + createHTML = function(data,type){ + var panel ={ + content:data,//弹窗内容 + title:"提示",//弹窗标题 + button:"确认",//确认按钮的文字 + //alert默认的弹窗类型为alert,tip默认的弹窗类型为tip + type:(type=== "j-msg-center"?"alert":"tip")//弹窗类型,tip为自动关闭窗口,alert为普通弹窗有确认按钮,confirm为确认弹窗有确认和取消按钮 + } + var content = data; + if (getObjType(data) === 'Object') { + if (!!data.content) panel.content = data.content; + if (!!data.title) panel.title = data.title; + if (!!data.button) panel.button = data.button; + if (!!data.type) panel.type = data.type; + if (!!data.callback) panel.callback = data.callback; + if (!!data.cancel) panel.cancel = data.cancel; + }; + var btns = ""; + + if (panel.type === "alert") { + btns = ''; + }else if (panel.type === "confirm") { + btns = '' + +''; + }; + + var _html = '
' + +'
' + +'
' + +'
'+panel.title+'
' + +'
'+panel.content+'
' + +'
'+btns + +'
' + +'
' + +'
'; + $("body").append(_html); + if (type !== "j-msg-center" ) { + var pars = $(".j-msg-top"); + var box = pars.find(".msg-box"); + var hide_box = function(){ + box.animate({ + top:-box.height()-100 + },800,function(){ + pars.remove(); + }) + } + + $(".j-msg-top").show().find(".msg-box").animate({ + top:0 + },800); + + $(".j-msg-panel .close").on("click",function(){ + hide_box(); + }); + + + $(".j-msg-top .msg-btn").on("click",function(){ + var _this = $(this); + if (_this.hasClass("b-hlhover")) { + // 确认时回调 + if (!!panel.callback)panel.callback(); + }else{ + // 取消时回调 + if (!!panel.cancel)panel.cancel(); + + }; + hide_box(); + }) + + if (panel.type === "tip") { + setTimeout(function(){ + hide_box(); + },3000) + }; + + }else{ + $(".j-msg-center").show(); + $(".j-msg-center .close").on("click",function(){ + var pars = $(this).parents(".j-msg-panel"); + pars.fadeOut(500,function(){ + pars.remove(); + }) + }) + $(".j-msg-center .msg-btn").on("click",function(){ + var _this = $(this); + if (_this.hasClass("b-hlhover")) { + // 确认时回调 + if (!!panel.callback)panel.callback(); + }else{ + // 取消时回调 + if (!!panel.cancel)panel.cancel(); + + }; + var pars = $(this).parents(".j-msg-panel"); + pars.fadeOut(500,function(){ + pars.remove(); + }) + }) + + if (panel.type === "tip") { + setTimeout(function(){ + $(".j-msg-center").fadeOut(500,function(){ + $(".j-msg-center").remove(); + }) + },2000) + }; + + }; + } + + module.exports = { + tip : tip, + alert : alert + } + + +/***/ }, +/* 17 */, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + + var apis = __webpack_require__(3); + var faceUrl = $("#faceBox img").attr("src"); + $("#facePanel .pop-list>span").each(function(){ + if ($(this).find("img").attr("src") == faceUrl) { + $(this).addClass("on").siblings().removeClass("on"); + }; + }) + + $("#faceBox,#resetFace").click(function(){ + $("#facePanel").show(); + }); + $("#facePanel span").click(function(){ + $(this).addClass("on").siblings().removeClass("on"); + }); + $("#faceClose").click(function(){ + $("#facePanel").hide(); + }); + $("#faceClose").click(function(){ + $("#facePanel").hide(); + }); + $("#faceSave").click(function(){ + var pdata = {}; + pdata.type = "face"; + pdata.headImgUrl = $("#facePanel .on img").attr("src"); + console.log(pdata) + apis.req('userInfo',pdata,function(body){ + if (body.code == 0) { + //msgs.tip("成功更新头像"); + $("#facePanel").hide(); + location.reload(); + }else{ + console.log(body) + msgs.tip("更换头像失败!") + }; + }) + }); + +/***/ }, +/* 19 */, +/* 20 */, +/* 21 */ +/***/ function(module, exports) { + + function swipe(box,type){ + // type为1时轮播方式为无缝滚动 + var boxW = box.width(), + ul = box.find("ul"), + count = box.find("li").length, + index = 0, + longTimeout, + pagination, + swipeTimeout; + // box.swipeLeft(function(){ + // clearTimeout(longTimeout); + // index++; + // slide(); + // longTimeout=setTimeout(function(){ + // autoSlide(); + // },3000); + + // }); + + // box.swipeRight(function(){ + // clearTimeout(longTimeout); + // if (index>0) { + // index--; + // slide(); + // }else{ + // index=count-1; + // ul.css("marginLeft",-boxW*count); + // slide(); + // } + // longTimeout=setTimeout(function(){ + // autoSlide(); + // },3000); + + // }); + + function autoSlide(){ + longTimeout = setTimeout(function(){ + index++; + slide(); + autoSlide(); + },5000); + } + + function slide(){ + if (type == 1) { + ul.stop().animate({ + "marginLeft":-boxW*index + },1000,function(){ + if(index>count-1){ + index=0; + ul.css("marginLeft",0); + } + }); + }else{ + if(index>count-1){ + index=0; + } + }; + ul.find("li").eq(index).addClass("active").siblings().removeClass("active"); + pagination.find(".dots").eq(index).addClass("active").siblings().removeClass("active"); + } + function init(){ + var html = '
'; + for (var i = 0; i < count-1; i++) { + html+=''; + }; + html += "
"; + box.append(html); + pagination = box.find(".page_dots"); + if (type == 1){ + ul.append(ul.find("li").eq(0).clone()); + box.width(boxW).find("ul").width((count+1)*boxW).find("li").width(boxW); + }else{ + box.addClass("fade_slide"); + ul.find("li").eq(0).addClass("active"); + } + + box.find(".page_dots .dots").on("click",function(){ + index = $(this).index(); + slide(); + clearTimeout(longTimeout); + clearTimeout(swipeTimeout); + swipeTimeout = setTimeout(function(){ + autoSlide(); + },1000) + return false; + }) + } + + init(); + autoSlide(); + + + } + + module.exports = { + swipe : swipe + } + + +/***/ }, +/* 22 */, +/* 23 */, +/* 24 */ +/***/ function(module, exports, __webpack_require__) { + + /** + @jsx React.DOM + itemView + 放回 li 结构, 用于modules/list 调用,作为ul/li部分 + */ + + var libs = __webpack_require__(4); + + var fox = React.createClass({displayName: "fox", + componentDidMount: function () {}, + + render: function () { + var list = []; + var data = this.props.pageData; + + if (data.endPageIndex < 8 && data.endPageIndex != 1) { + for (var i = 1; i <= data.endPageIndex; i++) { + if (data.pageNum == i) list.push(React.createElement("a", {key: i, href: "", className: "active ipg", "data-id": i}, i)); + else list.push(React.createElement("a", {key: i, className: "ipg", "data-id": i}, i)) + }; + + }else if (data.endPageIndex >= 8) { + list.push(React.createElement("a", {key: "0", href: "", className: "ipg", "data-id": "1"}, "首页")); + if (data.pageNum != 1) list.push(React.createElement("a", {key: "-1", href: "", className: "ipg", "data-id": data.pageNum-1}, "上一页")); + for (var i = 1; i <= 8; i++) { + var _t = i; + if (data.pageNum>4) _t+=data.pageNum-4; + if (data.endPageIndex-data.pageNum<4) _t=data.endPageIndex-8+i; + if (data.pageNum == _t) list.push(React.createElement("a", {key: i, href: "", className: "active ipg", "data-id": _t}, _t)); + else list.push(React.createElement("a", {key: i, href: "", className: "ipg", "data-id": _t}, _t)); + }; + if (data.pageNum != data.endPageIndex) list.push(React.createElement("a", {key: "+1", href: "", className: "ipg", "data-id": data.pageNum+1}, "下一页")); + list.push(React.createElement("a", {key: "++1", href: "", className: "ipg", "data-id": data.endPageIndex}, "尾页")); + }; + + + return ( + React.createElement("div", {className: "page"}, list) + ) } + + }); + + module.exports = fox; + + +/***/ } +/******/ ]); +//# sourceMappingURL=_common.js.map \ No newline at end of file diff --git a/roncoo-pay-web-boss/src/main/webapp/common/scan/pay_files/face.png b/roncoo-pay-web-boss/src/main/webapp/common/scan/pay_files/face.png new file mode 100644 index 0000000000000000000000000000000000000000..5bfd6c81474ec2371f0a628a65e4e29584e6db19 Binary files /dev/null and b/roncoo-pay-web-boss/src/main/webapp/common/scan/pay_files/face.png differ diff --git a/roncoo-pay-web-boss/src/main/webapp/common/scan/pay_files/hm.js b/roncoo-pay-web-boss/src/main/webapp/common/scan/pay_files/hm.js new file mode 100644 index 0000000000000000000000000000000000000000..a2ec8d263fa40de7a1df3d685909632fe9128258 --- /dev/null +++ b/roncoo-pay-web-boss/src/main/webapp/common/scan/pay_files/hm.js @@ -0,0 +1,52 @@ +(function(){var h={},mt={},c={id:"00189ff5d02916f05686ce0413fe7427",dm:["roncoo.com"],js:"tongji.baidu.com/hm-web/js/",etrk:[],icon:'',ctrk:false,align:-1,nv:-1,vdur:1800000,age:31536000000,rec:0,rp:[],trust:0,vcard:0,qiao:0,lxb:0,conv:0,med:0,cvcc:'',cvcf:[],apps:''};var r=void 0,s=!0,t=null,w=!1;mt.j={};mt.j.T=/msie (\d+\.\d+)/i.test(navigator.userAgent);mt.j.ya=/msie (\d+\.\d+)/i.test(navigator.userAgent)?document.documentMode||+RegExp.$1:r;mt.j.cookieEnabled=navigator.cookieEnabled;mt.j.javaEnabled=navigator.javaEnabled();mt.j.language=navigator.language||navigator.browserLanguage||navigator.systemLanguage||navigator.userLanguage||"";mt.j.Da=(window.screen.width||0)+"x"+(window.screen.height||0);mt.j.colorDepth=window.screen.colorDepth||0;mt.cookie={}; +mt.cookie.set=function(a,b,f){var d;f.H&&(d=new Date,d.setTime(d.getTime()+f.H));document.cookie=a+"="+b+(f.domain?"; domain="+f.domain:"")+(f.path?"; path="+f.path:"")+(d?"; expires="+d.toGMTString():"")+(f.Za?"; secure":"")};mt.cookie.get=function(a){return(a=RegExp("(^| )"+a+"=([^;]*)(;|$)").exec(document.cookie))?a[2]:t};mt.r={};mt.r.ka=function(a){return document.getElementById(a)};mt.r.Sa=function(a,b){for(b=b.toUpperCase();(a=a.parentNode)&&1==a.nodeType;)if(a.tagName==b)return a;return t}; +(mt.r.Y=function(){function a(){if(!a.B){a.B=s;for(var b=0,e=d.length;ba?"0"+a:a}var f={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};return function(d){switch(typeof d){case "undefined":return"undefined";case "number":return isFinite(d)?String(d):"null";case "string":return a(d);case "boolean":return String(d); +default:if(d===t)return"null";if(d instanceof Array){var e=["["],f=d.length,n,g,k;for(g=0;g(new Date).getTime())return a.substring(b+1)}}else if(mt.localStorage.D())try{return mt.localStorage.g.load(document.location.hostname),mt.localStorage.g.getAttribute(a)}catch(d){}return t}; +mt.localStorage.remove=function(a){if(window.localStorage)window.localStorage.removeItem(a);else if(mt.localStorage.D())try{mt.localStorage.g.load(document.location.hostname),mt.localStorage.g.removeAttribute(a),mt.localStorage.g.save(document.location.hostname)}catch(b){}};mt.sessionStorage={};mt.sessionStorage.set=function(a,b){if(window.sessionStorage)try{window.sessionStorage.setItem(a,b)}catch(f){}}; +mt.sessionStorage.get=function(a){return window.sessionStorage?window.sessionStorage.getItem(a):t};mt.sessionStorage.remove=function(a){window.sessionStorage&&window.sessionStorage.removeItem(a)};mt.O={};mt.O.log=function(a,b){var f=new Image,d="mini_tangram_log_"+Math.floor(2147483648*Math.random()).toString(36);window[d]=f;f.onload=f.onerror=f.onabort=function(){f.onload=f.onerror=f.onabort=t;f=window[d]=t;b&&b(a)};f.src=a};mt.P={}; +mt.P.ra=function(){var a="";if(navigator.plugins&&navigator.mimeTypes.length){var b=navigator.plugins["Shockwave Flash"];b&&b.description&&(a=b.description.replace(/^.*\s+(\S+)\s+\S+$/,"$1"))}else if(window.ActiveXObject)try{if(b=new ActiveXObject("ShockwaveFlash.ShockwaveFlash"))(a=b.GetVariable("$version"))&&(a=a.replace(/^.*\s+(\d+),(\d+).*$/,"$1.$2"))}catch(f){}return a}; +mt.P.Qa=function(a,b,f,d,e){return''};mt.url={}; +mt.url.k=function(a,b){var f=a.match(RegExp("(^|&|\\?|#)("+b+")=([^&#]*)(&|$|#)",""));return f?f[3]:t};mt.url.Ua=function(a){return(a=a.match(/^(https?:)\/\//))?a[1]:t};mt.url.na=function(a){return(a=a.match(/^(https?:\/\/)?([^\/\?#]*)/))?a[2].replace(/.*@/,""):t};mt.url.R=function(a){return(a=mt.url.na(a))?a.replace(/:\d+$/,""):a};mt.url.Ta=function(a){return(a=a.match(/^(https?:\/\/)?[^\/]*(.*)/))?a[2].replace(/[\?#].*/,"").replace(/^$/,"/"):t}; +h.w={Va:"http://tongji.baidu.com/hm-web/welcome/ico",X:"hm.baidu.com/hm.gif",ba:"baidu.com",va:"hmmd",wa:"hmpl",ua:"hmkw",sa:"hmci",xa:"hmsr",ta:"hmcu",p:0,m:Math.round(+new Date/1E3),protocol:"https:"===document.location.protocol?"https:":"http:",Xa:0,Na:6E5,Oa:10,Pa:1024,Ma:1,L:2147483647,Z:"cc cf ci ck cl cm cp cu cw ds ep et fl ja ln lo lt nv rnd si st su v cv lv api u tt".split(" ")}; +(function(){var a={o:{},c:function(a,f){this.o[a]=this.o[a]||[];this.o[a].push(f)},z:function(a,f){this.o[a]=this.o[a]||[];for(var d=this.o[a].length,e=0;ea.length)){var d=a[1],e=a[4]||3;if(0d&&0e){g.C++;for(var p=(h.b.a.cv||"*").split("!"),q=p.length;q=encodeURIComponent(b).length&&(g.e|=64,h.b.a.rt=b))},_trackRTEvent:function(b){b=b[1];if(f.d(b,"Object")){a(b);b=encodeURIComponent(d.stringify(b));var l=function(a){var b=h.b.a.rt;g.e|=128;h.b.a.et=90;h.b.a.rt=a;h.b.i();h.b.a.rt=b},m=b.length;if(900>=m)l.call(this,b);else for(var m=Math.ceil(m/900),p="block|"+Math.round(Math.random()* +e.L).toString(16)+"|"+m+"|",q=[],u=0;uc.vdur?1:4;var a= +w;this.A(document.referrer)&&this.A(document.location.href)?a=s:(a=b.R(document.referrer),a=this.K(a||"",document.location.hostname));return a?l.m-l.p>c.vdur?1:4:3},getData:function(a){try{return m.get(a)||k.get(a)||g.get(a)}catch(b){}},setData:function(a,b,d){try{m.set(a,b,{domain:this.I(),path:this.Q(),H:d}),d?g.set(a,b,d):k.set(a,b)}catch(e){}},Ca:function(a){try{m.set(a,"",{domain:this.I(),path:this.Q(),H:-1}),k.remove(a),g.remove(a)}catch(b){}},Ia:function(){var a,b,d,e,f;l.p=this.getData("Hm_lpvt_"+ +c.id)||0;13===l.p.length&&(l.p=Math.round(l.p/1E3));b=this.qa();a=4!==b?1:0;if(d=this.getData("Hm_lvt_"+c.id)){e=d.split(",");for(f=e.length-1;0<=f;f--)13===e[f].length&&(e[f]=""+Math.round(e[f]/1E3));for(;2592E3e.length?2:3;for(1===a&&e.push(l.m);4=+new Date-g;);};if(c.med)m="/zoosnet",e="swt",n=/swt|zixun|call|chat|zoos|business|talk|kefu|openkf|online|\/LR\/Chatpre\.aspx/i,g={click:function(){for(var a=[],b=k(document.getElementsByTagName("a")),b=[].concat.apply(b,k(document.getElementsByTagName("area"))),b=[].concat.apply(b,k(document.getElementsByTagName("img"))),d,e,f=0,g=b.length;f=7){setupTypeNumber(test);} +if(_dataCache==null){_dataCache=createData(_typeNumber,_errorCorrectLevel,_dataList);} +mapData(_dataCache,maskPattern);};var setupPositionProbePattern=function(row,col){for(var r=-1;r<=7;r+=1){if(row+r<=-1||_moduleCount<=row+r)continue;for(var c=-1;c<=7;c+=1){if(col+c<=-1||_moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){_modules[row+r][col+c]=true;}else{_modules[row+r][col+c]=false;}}}};var getBestMaskPattern=function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i+=1){makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(_this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}} +return pattern;};var setupTimingPattern=function(){for(var r=8;r<_moduleCount-8;r+=1){if(_modules[r][6]!=null){continue;} +_modules[r][6]=(r%2==0);} +for(var c=8;c<_moduleCount-8;c+=1){if(_modules[6][c]!=null){continue;} +_modules[6][c]=(c%2==0);}};var setupPositionAdjustPattern=function(){var pos=QRUtil.getPatternPosition(_typeNumber);for(var i=0;i>i)&1)==1);_modules[Math.floor(i/3)][i%3+_moduleCount-8-3]=mod;} +for(var i=0;i<18;i+=1){var mod=(!test&&((bits>>i)&1)==1);_modules[i%3+_moduleCount-8-3][Math.floor(i/3)]=mod;}};var setupTypeInfo=function(test,maskPattern){var data=(_errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i+=1){var mod=(!test&&((bits>>i)&1)==1);if(i<6){_modules[i][8]=mod;}else if(i<8){_modules[i+1][8]=mod;}else{_modules[_moduleCount-15+i][8]=mod;}} +for(var i=0;i<15;i+=1){var mod=(!test&&((bits>>i)&1)==1);if(i<8){_modules[8][_moduleCount-i-1]=mod;}else if(i<9){_modules[8][15-i-1+1]=mod;}else{_modules[8][15-i-1]=mod;}} +_modules[_moduleCount-8][8]=(!test);};var mapData=function(data,maskPattern){var inc=-1;var row=_moduleCount-1;var bitIndex=7;var byteIndex=0;var maskFunc=QRUtil.getMaskFunction(maskPattern);for(var col=_moduleCount-1;col>0;col-=2){if(col==6)col-=1;while(true){for(var c=0;c<2;c+=1){if(_modules[row][col-c]==null){var dark=false;if(byteIndex>>bitIndex)&1)==1);} +var mask=maskFunc(row,col-c);if(mask){dark=!dark;} +_modules[row][col-c]=dark;bitIndex-=1;if(bitIndex==-1){byteIndex+=1;bitIndex=7;}}} +row+=inc;if(row<0||_moduleCount<=row){row-=inc;inc=-inc;break;}}}};var createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r=0)?modPoly.getAt(modIndex):0;}} +var totalCodeCount=0;for(var i=0;itotalDataCount*8){throw new Error('code length overflow. (' ++buffer.getLengthInBits() ++'>' ++totalDataCount*8 ++')');} +if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);} +while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);} +while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;} +buffer.put(PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;} +buffer.put(PAD1,8);} +return createBytes(buffer,rsBlocks);};_this.addData=function(data){var newData=qr8BitByte(data);_dataList.push(newData);_dataCache=null;};_this.isDark=function(row,col){if(row<0||_moduleCount<=row||col<0||_moduleCount<=col){throw new Error(row+','+col);} +return _modules[row][col];};_this.getModuleCount=function(){return _moduleCount;};_this.make=function(){makeImpl(false,getBestMaskPattern());};_this.createTableTag=function(cellSize,margin){cellSize=cellSize||2;margin=(typeof margin=='undefined')?cellSize*4:margin;var qrHtml='';qrHtml+='';qrHtml+='';for(var r=0;r<_this.getModuleCount();r+=1){qrHtml+='';for(var c=0;c<_this.getModuleCount();c+=1){qrHtml+='';} +qrHtml+='';qrHtml+='
';} +qrHtml+='
';return qrHtml;};_this.createImgTag=function(cellSize,margin){cellSize=cellSize||2;margin=(typeof margin=='undefined')?cellSize*4:margin;var size=_this.getModuleCount()*cellSize+margin*2;var min=margin;var max=size-margin;return createImgTag(size,size,function(x,y){if(min<=x&&x>>8);bytes.push(b&0xff);}}else{bytes.push(unknownChar);}}} +return bytes;};};var QRMode={MODE_NUMBER:1<<0,MODE_ALPHA_NUM:1<<1,MODE_8BIT_BYTE:1<<2,MODE_KANJI:1<<3};var QRErrorCorrectLevel={L:1,M:0,Q:3,H:2};var QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var QRUtil=function(){var PATTERN_POSITION_TABLE=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]];var G15=(1<<10)|(1<<8)|(1<<5)|(1<<4)|(1<<2)|(1<<1)|(1<<0);var G18=(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<5)|(1<<2)|(1<<0);var G15_MASK=(1<<14)|(1<<12)|(1<<10)|(1<<4)|(1<<1);var _this={};var getBCHDigit=function(data){var digit=0;while(data!=0){digit+=1;data>>>=1;} +return digit;};_this.getBCHTypeInfo=function(data){var d=data<<10;while(getBCHDigit(d)-getBCHDigit(G15)>=0){d^=(G15<<(getBCHDigit(d)-getBCHDigit(G15)));} +return((data<<10)|d)^G15_MASK;};_this.getBCHTypeNumber=function(data){var d=data<<12;while(getBCHDigit(d)-getBCHDigit(G18)>=0){d^=(G18<<(getBCHDigit(d)-getBCHDigit(G18)));} +return(data<<12)|d;};_this.getPatternPosition=function(typeNumber){return PATTERN_POSITION_TABLE[typeNumber-1];};_this.getMaskFunction=function(maskPattern){switch(maskPattern){case QRMaskPattern.PATTERN000:return function(i,j){return(i+j)%2==0;};case QRMaskPattern.PATTERN001:return function(i,j){return i%2==0;};case QRMaskPattern.PATTERN010:return function(i,j){return j%3==0;};case QRMaskPattern.PATTERN011:return function(i,j){return(i+j)%3==0;};case QRMaskPattern.PATTERN100:return function(i,j){return(Math.floor(i/2)+Math.floor(j/3))%2==0;};case QRMaskPattern.PATTERN101:return function(i,j){return(i*j)%2+(i*j)%3==0;};case QRMaskPattern.PATTERN110:return function(i,j){return((i*j)%2+(i*j)%3)%2==0;};case QRMaskPattern.PATTERN111:return function(i,j){return((i*j)%3+(i+j)%2)%2==0;};default:throw new Error('bad maskPattern:'+maskPattern);}};_this.getErrorCorrectPolynomial=function(errorCorrectLength){var a=qrPolynomial([1],0);for(var i=0;i5){lostPoint+=(3+sameCount-5);}}};for(var row=0;row=256){n-=255;} +return EXP_TABLE[n];};return _this;}();function qrPolynomial(num,shift){if(typeof num.length=='undefined'){throw new Error(num.length+'/'+shift);} +var _num=function(){var offset=0;while(offset>>(7-index%8))&1)==1;};_this.put=function(num,length){for(var i=0;i>>(length-i-1))&1)==1);}};_this.getLengthInBits=function(){return _length;};_this.putBit=function(bit){var bufIndex=Math.floor(_length/8);if(_buffer.length<=bufIndex){_buffer.push(0);} +if(bit){_buffer[bufIndex]|=(0x80>>>(_length%8));} +_length+=1;};return _this;};var qr8BitByte=function(data){var _mode=QRMode.MODE_8BIT_BYTE;var _data=data;var _bytes=qrcode.stringToBytes(data);var _this={};_this.getMode=function(){return _mode;};_this.getLength=function(buffer){return _bytes.length;};_this.write=function(buffer){for(var i=0;i<_bytes.length;i+=1){buffer.put(_bytes[i],8);}};return _this;};var byteArrayOutputStream=function(){var _bytes=new Array();var _this={};_this.writeByte=function(b){_bytes.push(b&0xff);};_this.writeShort=function(i){_this.writeByte(i);_this.writeByte(i>>>8);};_this.writeBytes=function(b,off,len){off=off||0;len=len||b.length;for(var i=0;i0){s+=',';} +s+=_bytes[i];} +s+=']';return s;};return _this;};var base64EncodeOutputStream=function(){var _buffer=0;var _buflen=0;var _length=0;var _base64='';var _this={};var writeEncoded=function(b){_base64+=String.fromCharCode(encode(b&0x3f));};var encode=function(n){if(n<0){}else if(n<26){return 0x41+n;}else if(n<52){return 0x61+(n-26);}else if(n<62){return 0x30+(n-52);}else if(n==62){return 0x2b;}else if(n==63){return 0x2f;} +throw new Error('n:'+n);};_this.writeByte=function(n){_buffer=(_buffer<<8)|(n&0xff);_buflen+=8;_length+=1;while(_buflen>=6){writeEncoded(_buffer>>>(_buflen-6));_buflen-=6;}};_this.flush=function(){if(_buflen>0){writeEncoded(_buffer<<(6-_buflen));_buffer=0;_buflen=0;} +if(_length%3!=0){var padlen=3-_length%3;for(var i=0;i=_str.length){if(_buflen==0){return-1;} +throw new Error('unexpected end of file./'+_buflen);} +var c=_str.charAt(_pos);_pos+=1;if(c=='='){_buflen=0;return-1;}else if(c.match(/^\s$/)){continue;} +_buffer=(_buffer<<6)|decode(c.charCodeAt(0));_buflen+=6;} +var n=(_buffer>>>(_buflen-8))&0xff;_buflen-=8;return n;};var decode=function(c){if(0x41<=c&&c<=0x5a){return c-0x41;}else if(0x61<=c&&c<=0x7a){return c-0x61+26;}else if(0x30<=c&&c<=0x39){return c-0x30+52;}else if(c==0x2b){return 62;}else if(c==0x2f){return 63;}else{throw new Error('c:'+c);}};return _this;};var gifImage=function(width,height){var _width=width;var _height=height;var _data=new Array(width*height);var _this={};_this.setPixel=function(x,y,pixel){_data[y*_width+x]=pixel;};_this.write=function(out){out.writeString('GIF87a');out.writeShort(_width);out.writeShort(_height);out.writeByte(0x80);out.writeByte(0);out.writeByte(0);out.writeByte(0x00);out.writeByte(0x00);out.writeByte(0x00);out.writeByte(0xff);out.writeByte(0xff);out.writeByte(0xff);out.writeString(',');out.writeShort(0);out.writeShort(0);out.writeShort(_width);out.writeShort(_height);out.writeByte(0);var lzwMinCodeSize=2;var raster=getLZWRaster(lzwMinCodeSize);out.writeByte(lzwMinCodeSize);var offset=0;while(raster.length-offset>255){out.writeByte(255);out.writeBytes(raster,offset,255);offset+=255;} +out.writeByte(raster.length-offset);out.writeBytes(raster,offset,raster.length-offset);out.writeByte(0x00);out.writeString(';');};var bitOutputStream=function(out){var _out=out;var _bitLength=0;var _bitBuffer=0;var _this={};_this.write=function(data,length){if((data>>>length)!=0){throw new Error('length over');} +while(_bitLength+length>=8){_out.writeByte(0xff&((data<<_bitLength)|_bitBuffer));length-=(8-_bitLength);data>>>=(8-_bitLength);_bitBuffer=0;_bitLength=0;} +_bitBuffer=(data<<_bitLength)|_bitBuffer;_bitLength=_bitLength+length;};_this.flush=function(){if(_bitLength>0){_out.writeByte(_bitBuffer);}};return _this;};var getLZWRaster=function(lzwMinCodeSize){var clearCode=1<
-
-

- - - -

-