diff --git a/pom.xml b/pom.xml index 3e453ab71..c2f98efe1 100644 --- a/pom.xml +++ b/pom.xml @@ -5,11 +5,11 @@ au.com.royalpay.payment payment-parent - 2.1.13 + 2.1.25 4.0.0 manage - 2.1.11 + 2.2.0 UTF-8 1.8.0 diff --git a/src/document/cn/apidoc.json b/src/document/cn/apidoc.json index 567b6e3d3..c07257310 100644 --- a/src/document/cn/apidoc.json +++ b/src/document/cn/apidoc.json @@ -22,6 +22,10 @@ "Miniprogram_Payment", "NewMobileH5Pay", "MobileH5Pay", + "CardPayment", + "CardPreOrder", + "CardInputView", + "CardOrder", "RetailPay", "RetailMicroPay", "RetailQRCode", diff --git a/src/document/cn/apis.js b/src/document/cn/apis.js index c17b3f773..f709e6288 100644 --- a/src/document/cn/apis.js +++ b/src/document/cn/apis.js @@ -230,7 +230,119 @@ * @apiError (ERROR_CODE) ORDER_NOT_EXIST 订单不存在 * @apiError (ERROR_CODE) ORDER_MISMATCH 订单号与商户不匹配 */ - +/** + * @api {PUT} /api/v1.0/gateway/partners/{partner_code}/pre_card_orders/{order_id} 创建卡支付预订单 + * @apiName CardPreOrder + * @apiGroup CardPayment + * @apiVersion 1.0.0 + * @apiDescription + * + * 卡支付即消费者输入银行卡信息进行下单的接口,接入卡支付需要额外的合规流程。
+ * 卡支付预订单是先下单,然后跳转royalpay支付页由消费者输入卡信息并完成支付
+ * 卡支付预订单允许消费者多次尝试输入,因此除非主动关闭订单,订单有效期会一直持续到有效期结束。 + * + * @apiHeader Accept application/json + * @apiHeader Content-Type application/json + * @apiParam (PathVariable) {String} partner_code 必填,商户编码,由4位大写字母或数字构成 + * @apiParam (PathVariable) {String} order_id 必填,商户支付订单号,要求同一商户唯一 + * @apiUse Sign + * @apiParam (JSON) {String} description 必填,订单标题(最大长度128字符,超出自动截取) + * @apiParam (JSON) {int} price 必填,金额,单位为货币最小单位,例如使用100表示AUD1.00 + * @apiParam (JSON) {String=AUD,CNY} currency=AUD 币种代码,卡支付仅支持AUD下单 + * @apiParam (JSON) {String} notify_url 支付通知url,详见支付通知api,不填则不会推送支付通知 + * @apiParam (JSON) {String} operator 操作人员标识 + * @apiParam (JSON) {Boolean} domestic_only 默认为false,是否只允许本国卡。由于境内境外卡支付手续费差异巨大,可在此限制。 + * @apiParam (JSON) {Boolean} disable_credit_card 默认为false,如果希望限制消费者使用信用卡支付可传入true + * @apiParam (JSON) {String} customer_id 可选参数,如果事先进行了tokenize操作可提供customer id,消费者随后仅需输入cvv信息 + * @apiParam (JSON) {JSON} customer 可选参数,提交消费者基本信息,可为charge back发生时提供依据 + * + * @apiParam (customer) {String} name 姓名,可选,如果未提供会自动使用card holder name + * @apiParam (customer) {String} postcode 邮编,可选,4位数字 + * @apiParam (customer) {String} address 地址,可选 + * @apiParam (customer) {String} city 城市,如Sydney + * @apiParam (customer) {String} state 州,可选,三位大写代码,如VIC + * @apiParam (customer) {String} country 国家,可选,ISO-3600-1标准收录的两位国家代码 + * + * @apiSuccess {String} return_code 执行结果 + * @apiSuccess {String} result_code SUCCESS表示创建订单成功,EXISTS表示订单已存在 + * @apiSuccess {String} partner_code 商户编码 + * @apiSuccess {String} channel 支付渠道 + * @apiSuccess {String} full_name 商户注册全名 + * @apiSuccess {String} partner_name 商户名称 + * @apiSuccess {String} order_id RoyalPay订单ID,同时也是支付渠道订单ID,最终支付成功的订单ID可能不同 + * @apiSuccess {String} partner_order_id 商户订单ID + * @apiSuccess {String} pay_url 跳转URL + * + * @apiUse GlobalError + * @apiError (ERROR_CODE) ORDER_MISMATCH 订单号与商户不匹配 + * @apiError (ERROR_CODE) ORDER_PAID 订单已支付 + * + */ +/** + * @api {PUT} /api/v1.0/gateway/partners/{partner_code}/card_orders/{order_id} 创建卡支付订单 + * @apiName CardOrder + * @apiGroup CardPayment + * @apiVersion 1.0.0 + * @apiDescription + * + * 卡支付即消费者输入银行卡信息进行下单的接口,接入卡支付需要额外的合规流程。
+ * 卡支付订单需要在商户页面引入js sdk并生成加密卡输入界面,消费者输入卡信息后通过回调将加密后的卡信息返回,商户请求时带上加密卡信息
+ * 卡支付下单无需后续消费者交互,直接可查询下单结果 + * + * @apiHeader Accept application/json + * @apiHeader Content-Type application/json + * @apiParam (PathVariable) {String} partner_code 必填,商户编码,由4位大写字母或数字构成 + * @apiParam (PathVariable) {String} order_id 必填,商户支付订单号,要求同一商户唯一 + * @apiUse Sign + * @apiParam (JSON) {String} description 必填,订单标题(最大长度128字符,超出自动截取) + * @apiParam (JSON) {int} price 必填,金额,单位为货币最小单位,例如使用100表示AUD1.00 + * @apiParam (JSON) {String=AUD,CNY} currency=AUD 币种代码,卡支付仅支持AUD下单 + * @apiParam (JSON) {String} notify_url 支付通知url,详见支付通知api,不填则不会推送支付通知 + * @apiParam (JSON) {String} operator 操作人员标识 + * @apiParam (JSON) {Boolean} domestic_only 默认为false,是否只允许本国卡。由于境内境外卡支付手续费差异巨大,可在此限制。 + * @apiParam (JSON) {Boolean} disable_credit_card 默认为false,如果希望限制消费者使用信用卡支付可传入true + * @apiParam (JSON) {String} key_id 必填,加密卡信息key id + * @apiParam (JSON) {String} card_info 必填,加密卡信息secret + * @apiParam (JSON) {JSON} customer 可选参数,提交消费者基本信息,可为charge back发生时提供依据 + * + * @apiParam (customer) {String} name 姓名,可选,如果未提供会自动使用card holder name + * @apiParam (customer) {String} postcode 邮编,可选,4位数字 + * @apiParam (customer) {String} address 地址,可选 + * @apiParam (customer) {String} city 城市,如Sydney + * @apiParam (customer) {String} state 州,可选,三位大写代码,如VIC + * @apiParam (customer) {String} country 国家,可选,ISO-3600-1标准收录的两位国家代码 + * + * @apiSuccess {String} return_code 执行结果 + * @apiSuccess {String} result_code SUCCESS表示创建订单成功,EXISTS表示订单已存在 + * @apiSuccess {String} partner_code 商户编码 + * @apiSuccess {String} channel 支付渠道 + * @apiSuccess {String} full_name 商户注册全名 + * @apiSuccess {String} partner_name 商户名称 + * @apiSuccess {String} order_id RoyalPay订单ID,同时也是支付渠道订单ID,最终支付成功的订单ID可能不同 + * @apiSuccess {String} partner_order_id 商户订单ID + * @apiSuccess {String} pay_url 跳转URL + * + * @apiUse GlobalError + * @apiError (ERROR_CODE) ORDER_MISMATCH 订单号与商户不匹配 + * @apiError (ERROR_CODE) ORDER_PAID 订单已支付 + * + */ +/** + * @api {GET} /api/v1.0/card_payment_view/partners/{partner_code}/orders/{order_id}/view 卡支付跳转页 + * @apiName CardInputView + * @apiDescription 必须先调用创建卡支付预订单接口再进行跳转。优先使用接口返回地址。 + * 建议在用户回调到对应页时通过后台查询订单状态接口确认订单的支付状态。 + * @apiVersion 1.0.0 + * @apiGroup CardPayment + * @apiParam (PathVariable) {String} partner_code 必填,商户编码,由4位大写字母或数字构成 + * @apiParam (PathVariable) {String} order_id 必填,商户支付订单号,要求已预先创建 + * @apiUse Sign + * @apiParam (QueryParam) {String} redirect 必填,支付成功后跳转页面,回调时会带上签名参数用于校验 + * + * @apiUse GlobalError + * @apiError (ERROR_CODE) ORDER_NOT_EXIST 订单不存在 + * @apiError (ERROR_CODE) ORDER_MISMATCH 订单号与商户不匹配 + */ /** * @api {PUT} /api/v1.0/jsapi_gateway/partners/{partner_code}/orders/{order_id} 创建JSAPI订单 * @apiName NewJSAPI @@ -1015,6 +1127,7 @@ * @apiError (ERROR_CODE) ORDER_MISMATCH 订单号与商户不匹配 * */ + /** * @api {PUT} /api/v1.0/customs/partners/{partner_code}/redeclare/report/{client_report_id} 重新提交报关单 * @apiName redeclare_report diff --git a/src/document/en/apidoc.json b/src/document/en/apidoc.json index 374c76566..4039388f3 100644 --- a/src/document/en/apidoc.json +++ b/src/document/en/apidoc.json @@ -22,6 +22,10 @@ "Miniprogram_Payment", "NewMobileH5Pay", "MobileH5Pay", + "CardPayment", + "CardPreOrder", + "CardInputView", + "CardOrder", "RetailPay", "RetailMicroPay", "RetailQRCode", diff --git a/src/document/en/apis.js b/src/document/en/apis.js index d2973ad56..1e0a2d51c 100644 --- a/src/document/en/apis.js +++ b/src/document/en/apis.js @@ -235,7 +235,119 @@ * @apiError (ERROR_CODE) ORDER_NOT_EXIST Order does not exist * @apiError (ERROR_CODE) ORDER_MISMATCH Order is not belong to this partner */ - +/** + * @api {PUT} /api/v1.0/gateway/partners/{partner_code}/pre_card_orders/{order_id} Create Card Pre Order + * @apiName CardPreOrder + * @apiGroup CardPayment + * @apiVersion 1.0.0 + * @apiDescription + * + * Card payment method is that customer provider their card information to finish payments. Enable card payment require addition compliance process.
+ * Card Pre Order is the way merchant create order first and then redirect to the page on royalpay to ask customer input card information and finish payment.
+ * Card Pre Order allows customer retry multiple times. So unless merchant call the closing api. Order will exists available until hit the expire time. + * + * @apiHeader Accept application/json + * @apiHeader Content-Type application/json + * @apiParam (PathVariable) {String} partner_code Required, Partner code + * @apiParam (PathVariable) {String} order_id Required, Partner order id + * @apiUse Sign + * @apiParam (JSON) {String} description Required, Order description + * @apiParam (JSON) {int} price Required, Price of the order. Use the base unit of the currency. + * @apiParam (JSON) {String=AUD,CNY} currency=AUD currency, Only AUD supported + * @apiParam (JSON) {String} notify_url System will call the notify url if provided when the payment succeeds + * @apiParam (JSON) {String} operator Note for the operator who created this order. + * @apiParam (JSON) {Boolean} domestic_only Default is false, Due to there is a huge rate difference between domestic cards and international cards. merchants can disable international cards + * @apiParam (JSON) {Boolean} disable_credit_card Default is false, if merchants want to limit customers not using credit cards. this parameter can be helpful + * @apiParam (JSON) {String} customer_id Optional, if merchants tokenized customer's card with a customer id, it can reference the card information and customers will only provide cvv2 code then. + * @apiParam (JSON) {JSON} customer Optional, json object, provide customer's basic information in case there were a charge back happened + * + * @apiParam (customer) {String} name customer's name. optional. if not provided system will use card holder name + * @apiParam (customer) {String} postcode optional + * @apiParam (customer) {String} address optional + * @apiParam (customer) {String} city optional,like Sydney + * @apiParam (customer) {String} state optional, 3-character state name. like NSW + * @apiParam (customer) {String} country optional, nation code, use 2-character code in ISO-3600-1 + * + * @apiSuccess {String} return_code Execution result + * @apiSuccess {String} result_code SUCCESS means order created successfully, EXISTS means order has already existed. + * @apiSuccess {String} partner_code Partner code + * @apiSuccess {String} channel Payment channel + * @apiSuccess {String} full_name Partner's full company name when registered + * @apiSuccess {String} partner_name Partner's name + * @apiSuccess {String} order_id Order id in RoyalPay, which is also payment channel(Wechat/Alipay) order id. + * @apiSuccess {String} partner_order_id Partner order id + * @apiSuccess {String} pay_url Payment page in RoyalPay. + * + * @apiUse GlobalError + * @apiError (ERROR_CODE) ORDER_MISMATCH Order is not belong to this partner + * @apiError (ERROR_CODE) ORDER_PAID Order has already been paid + * + */ +/** + * @api {PUT} /api/v1.0/gateway/partners/{partner_code}/card_orders/{order_id} 创建卡支付订单 + * @apiName CardOrder + * @apiGroup CardPayment + * @apiVersion 1.0.0 + * @apiDescription + * + * Card payment method is that customer provider their card information to finish payments. Enable card payment require addition compliance process.
+ * Card Order is the way merchant import our sdk in payment page and display a encrypting card input view. then collect the encrypted card info from callback and then pass them to royalpay to create order and finish payments
+ * Card Order api do not need customers reaction any more. merchants can check payment result directly after created order. + * + * @apiHeader Accept application/json + * @apiHeader Content-Type application/json + * @apiParam (PathVariable) {String} partner_code Required, Partner code + * @apiParam (PathVariable) {String} order_id Required, Partner order id + * @apiUse Sign + * @apiParam (JSON) {String} description Required, Order description + * @apiParam (JSON) {int} price Required, Price of the order. Use the base unit of the currency. + * @apiParam (JSON) {String=AUD,CNY} currency=AUD currency, Only AUD supported + * @apiParam (JSON) {String} notify_url System will call the notify url if provided when the payment succeeds + * @apiParam (JSON) {String} operator Note for the operator who created this order. + * @apiParam (JSON) {String} key_id Required, key_id of encrypted callback + * @apiParam (JSON) {String} card_info Required, secret of encrypted callback + * @apiParam (JSON) {Boolean} domestic_only Default is false, Due to there is a huge rate difference between domestic cards and international cards. merchants can disable international cards + * @apiParam (JSON) {Boolean} disable_credit_card Default is false, if merchants want to limit customers not using credit cards. this parameter can be helpful + * @apiParam (JSON) {JSON} customer Optional, json object, provide customer's basic information in case there were a charge back happened + * + * @apiParam (customer) {String} name customer's name. optional. if not provided system will use card holder name + * @apiParam (customer) {String} postcode optional + * @apiParam (customer) {String} address optional + * @apiParam (customer) {String} city optional,like Sydney + * @apiParam (customer) {String} state optional, 3-character state name. like NSW + * @apiParam (customer) {String} country optional, nation code, use 2-character code in ISO-3600-1 + * + * @apiSuccess {String} return_code Execution result + * @apiSuccess {String} result_code SUCCESS means order created successfully, EXISTS means order has already existed. + * @apiSuccess {String} partner_code Partner code + * @apiSuccess {String} channel Payment channel + * @apiSuccess {String} full_name Partner's full company name when registered + * @apiSuccess {String} partner_name Partner's name + * @apiSuccess {String} order_id Order id in RoyalPay, which is also payment channel(Wechat/Alipay) order id. + * @apiSuccess {String} partner_order_id Partner order id + * @apiSuccess {String} pay_url Payment page in RoyalPay. + * + * @apiUse GlobalError + * @apiError (ERROR_CODE) ORDER_MISMATCH Order is not belong to this partner + * @apiError (ERROR_CODE) ORDER_PAID Order has already been paid + * + */ +/** + * @api {GET} /api/v1.0/card_payment_view/partners/{partner_code}/orders/{order_id}/view 卡支付跳转页 + * @apiName CardInputView + * @apiDescription This page mush be called after payment order has been created. + * When jumping back to redirection URL, it is recommended to call the order query API to make sure the payment has succeeded. + * @apiVersion 1.0.0 + * @apiGroup CardPayment + * @apiParam (PathVariable) {String} partner_code Required, Partner code + * @apiParam (PathVariable) {String} order_id Required, Partner order id. It shall have already been created + * @apiUse Sign + * @apiParam (QueryParam) {String} redirect Required, Redirect url when payment succeeded. Contain sign parameters for validation. + * + * @apiUse GlobalError + * @apiError (ERROR_CODE) ORDER_NOT_EXIST Order does not exist + * @apiError (ERROR_CODE) ORDER_MISMATCH Order is not belong to this partner + */ /** * @api {PUT} /api/v1.0/jsapi_gateway/partners/{partner_code}/orders/{order_id} Create JSAPI Payment Order * @apiName NewJSAPI diff --git a/src/main/java/au/com/royalpay/payment/manage/PaymentManageApplication.java b/src/main/java/au/com/royalpay/payment/manage/PaymentManageApplication.java index 3fcbe051a..b84648e5f 100644 --- a/src/main/java/au/com/royalpay/payment/manage/PaymentManageApplication.java +++ b/src/main/java/au/com/royalpay/payment/manage/PaymentManageApplication.java @@ -1,5 +1,6 @@ package au.com.royalpay.payment.manage; +import com.alibaba.fastjson.parser.ParserConfig; import com.google.code.kaptcha.Producer; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; @@ -33,6 +34,7 @@ import java.util.concurrent.ScheduledExecutorService; public class PaymentManageApplication { public static void main(String[] args) { + ParserConfig.getGlobalInstance().setAutoTypeSupport(true); SpringApplication.run(PaymentManageApplication.class, args); } diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/ChannelsAnalysisServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/ChannelsAnalysisServiceImpl.java index ad30c4049..402707f30 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/ChannelsAnalysisServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/ChannelsAnalysisServiceImpl.java @@ -5,7 +5,6 @@ import au.com.royalpay.payment.manage.analysis.mappers.CustomerAndOrdersStatisti import com.alibaba.fastjson.JSONObject; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.time.DateFormatUtils; -import org.apache.commons.lang3.time.DateUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; @@ -17,7 +16,6 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; -import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; @@ -45,6 +43,8 @@ public class ChannelsAnalysisServiceImpl implements ChannelsAnalysisService { listChannel.add(putParam(params,"Rpay")); listChannel.add(putParam(params,"Yeepay")); listChannel.add(putParam(params,"LakalaPay")); + listChannel.add(putParam(params,"rpaypmt_card")); + listChannel.add(putParam(params,"rpaypmt_dd")); return listChannel; } @@ -55,7 +55,7 @@ public class ChannelsAnalysisServiceImpl implements ChannelsAnalysisService { } List list = new ArrayList<>(); Map analysisMap = new TreeMap<>(); - String[] channels = {"Wechat","Bestpay","Alipay","jd","AlipayOnline","hf", "Rpay","Yeepay","LakalaPay"}; + String[] channels = {"Wechat","Bestpay","Alipay","jd","AlipayOnline","hf", "Rpay","Yeepay","LakalaPay","rpaypmt_card","rpaypmt_dd"}; for (String channel:channels){ analysisChannelCustomers(params, analysisMap, channel); } diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/CustomersAnalysisServiceImp.java b/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/CustomersAnalysisServiceImp.java index e130ad037..f17ae2af1 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/CustomersAnalysisServiceImp.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/CustomersAnalysisServiceImp.java @@ -11,7 +11,6 @@ import au.com.royalpay.payment.manage.mappers.system.ClientMapper; import au.com.royalpay.payment.manage.mappers.system.CustomerMapper; import au.com.royalpay.payment.manage.mappers.system.ManagerCustomerRelationAlipayMapper; import au.com.royalpay.payment.manage.merchants.core.ClientManager; -import au.com.royalpay.payment.manage.tradelog.beans.TradeLogQuery; import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApi; import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApiProvider; import au.com.royalpay.payment.tools.connections.mpsupport.beans.TemplateMessage; @@ -28,7 +27,6 @@ import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -100,6 +98,8 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService { channels.add("hf"); channels.add("jd"); channels.add("LakalaPay"); + channels.add("rpaypmt_card"); + channels.add("rpaypmt_dd"); params.put("channels", channels); } result.put("channels", customerAndOrdersStatisticsMapper.getCBBankChannelAmount(params)); diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/DashboardServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/DashboardServiceImpl.java index b4d267dec..b248cb2e6 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/DashboardServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/DashboardServiceImpl.java @@ -334,6 +334,12 @@ public class DashboardServiceImpl implements DashboardService,DashboardAnalysisT res.put("today",today); res.put("yes",yes); res.put("not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params))); + params.put("channel", "system"); + res.put("sys_not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params))); + params.put("channel", "rpaypmt_card"); + res.put("rpaypmt_card_not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params))); + params.put("channel", "rpaypmt_dd"); + res.put("rpaypmt_dd_not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params))); res.put("trade_amount_rise",yes.getBigDecimal("trade_amount").compareTo(BigDecimal.ZERO)>0 ? (today.getBigDecimal("trade_amount").subtract(yes.getBigDecimal("trade_amount"))).divide(yes.getBigDecimal("trade_amount"), 4, RoundingMode.HALF_UP):BigDecimal.ZERO); res.put("trade_count_rise", yes.getIntValue("trade_count") > 0 ? (today.getBigDecimal("trade_count").subtract(yes.getBigDecimal("trade_count"))).divide(yes.getBigDecimal("trade_count"), 4, RoundingMode.HALF_UP) : 0); res.put("customers_rise", yes.getIntValue("customers") > 0 ? (today.getBigDecimal("customers").subtract(yes.getBigDecimal("customers"))).divide(yes.getBigDecimal("customers"), 4, RoundingMode.HALF_UP) : 0); @@ -604,7 +610,7 @@ public class DashboardServiceImpl implements DashboardService,DashboardAnalysisT } } private JSONObject getTodayChannelCount(JSONObject params){ - String[] channels = new String[]{"Bestpay","Wechat","Alipay","jd","AlipayOnline","hf", "Rpay","Yeepay","LakalaPay"}; + String[] channels = new String[]{"Bestpay", "Wechat", "Alipay", "jd", "AlipayOnline", "hf", "Rpay", "Yeepay", "LakalaPay", "rpaypmt_card", "rpaypmt_dd"}; JSONObject resp = new JSONObject(); for(String channel:channels) { params.put("channel", channel); diff --git a/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java index a7bbdcd00..786156343 100644 --- a/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java @@ -15,11 +15,9 @@ import au.com.royalpay.payment.tools.exceptions.ServerErrorException; import au.com.royalpay.payment.tools.lock.Locker; import au.com.royalpay.payment.tools.permission.enums.ManagerRole; import au.com.royalpay.payment.tools.utils.TimeZoneUtils; - import com.alibaba.fastjson.JSONObject; import com.github.miemiedev.mybatis.paginator.domain.Order; import com.github.miemiedev.mybatis.paginator.domain.PageBounds; - import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateUtils; @@ -36,21 +34,16 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; - /** * Created by yixian on 2017-02-07. */ @@ -88,7 +81,7 @@ public class BDPrizeServiceImpl implements BDPrizeService { private static BigDecimal percent = new BigDecimal(100); - private static String[] channels = new String[]{"Wechat", "Alipay", "Bestpay", "jd", "AlipayOnline","hf", "Rpay","Yeepay","LakalaPay"}; + private static String[] channels = new String[]{"Wechat", "Alipay", "Bestpay", "jd", "AlipayOnline","hf", "Rpay","Yeepay","LakalaPay", "rpaypmt_card", "rpaypmt_dd"}; private static Logger logger = LoggerFactory.getLogger(BDPrizeServiceImpl.class); @Override diff --git a/src/main/java/au/com/royalpay/payment/manage/billqrcode/core/impl/PartnerBillServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/billqrcode/core/impl/PartnerBillServiceImpl.java index 7029bc925..5e8d3ecd3 100644 --- a/src/main/java/au/com/royalpay/payment/manage/billqrcode/core/impl/PartnerBillServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/billqrcode/core/impl/PartnerBillServiceImpl.java @@ -76,6 +76,14 @@ public class PartnerBillServiceImpl implements PartnerBillService { String code_url = getQRCodeImg(record); record.put("code_url",code_url); directedBillCodeMapper.update(record); + if("v1".equals(client.getString("billcode_version"))){ + record.put("code_urls",code_url); + record.put("code_url",QRCodeUtils.qrcodeImageCode(code_url, 250, false)); + }else{ + String url = PlatformEnvironment.getEnv().concatUrl("api/v1.0/share_code/business/bills/"+record.getString("bill_code_id")+"/link/payment"); + record.put("code_urls",url); + record.put("code_url",QRCodeUtils.qrcodeImageCode(url, 250, false)); + } return QRCodeUtils.qrcodeImageCode(code_url, 250, false); } @@ -93,7 +101,18 @@ public class PartnerBillServiceImpl implements PartnerBillService { JSONObject params = queryBillBean.toJson(); params.put("client_id",client_id); List bills = directedBillCodeMapper.findByClientId(params,new PageBounds(queryBillBean.getPage(),queryBillBean.getLimit(), Order.formString("create_time.desc"))); - bills.stream().filter(t->StringUtils.isNotEmpty(t.getString("code_url"))).forEach(t->t.put("code_url",QRCodeUtils.qrcodeImageCode(t.getString("code_url"), 250, false))); +// bills.stream().filter(t->StringUtils.isNotEmpty(t.getString("code_url"))).forEach(t->t.put("code_url",QRCodeUtils.qrcodeImageCode(t.getString("code_url"), 250, false))); + for (JSONObject bill : bills) { + switch (client.getString("billcode_version")){ + case "v1": + bill.put("code_urls",bill.getString("code_url")); + break; + case "v2": + bill.put("code_urls", PlatformEnvironment.getEnv().concatUrl("api/v1.0/share_code/business/bills/"+bill.getString("bill_code_id")+"/link/payment")); + break; + } + bill.put("code_url",QRCodeUtils.qrcodeImageCode(bill.getString("code_urls"), 250, false)); + } return bills; } diff --git a/src/main/java/au/com/royalpay/payment/manage/dev/core/impl/ManualServiceimpl.java b/src/main/java/au/com/royalpay/payment/manage/dev/core/impl/ManualServiceimpl.java index 485c09450..fb3a04fd6 100644 --- a/src/main/java/au/com/royalpay/payment/manage/dev/core/impl/ManualServiceimpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/dev/core/impl/ManualServiceimpl.java @@ -6,12 +6,9 @@ import au.com.royalpay.payment.manage.mappers.system.ClientAccountMapper; import au.com.royalpay.payment.manage.mappers.system.ClientMapper; import au.com.royalpay.payment.manage.mappers.system.ClientRateMapper; import au.com.royalpay.payment.manage.merchants.core.ClientModifySupport; -import au.com.royalpay.payment.manage.merchants.entity.impls.SwitchPermissionModify; import au.com.royalpay.payment.manage.task.PostponeClientTask; import au.com.royalpay.payment.tools.scheduler.SynchronizedScheduler; - import com.alibaba.fastjson.JSONObject; - import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateUtils; import org.slf4j.Logger; @@ -20,13 +17,12 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import javax.annotation.Resource; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.annotation.Resource; - /** * @author kira * @date 2018/8/2 @@ -103,9 +99,9 @@ public class ManualServiceimpl implements ManualService { record.put("manager_name", "System"); record.put("remark", "费率到期系统自动延期1年"); clientRateMapper.saveRate(record); - if ("Rpay".equals(o.getString("rate_name"))) { - rpayApi.modifySurchargeConfig(clientMapper.findClient(client_id)); - } +// if ("Rpay".equals(o.getString("rate_name"))) { +// rpayApi.modifySurchargeConfig(clientMapper.findClient(client_id)); +// } }); } diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMWFilesMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMWFilesMapper.java new file mode 100644 index 000000000..88efbe614 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMWFilesMapper.java @@ -0,0 +1,26 @@ +package au.com.royalpay.payment.manage.mappers.system; + +import com.alibaba.fastjson.JSONObject; +import com.yixsoft.support.mybatis.autosql.annotations.AdvanceSelect; +import com.yixsoft.support.mybatis.autosql.annotations.AutoMapper; +import com.yixsoft.support.mybatis.autosql.annotations.AutoSql; +import com.yixsoft.support.mybatis.autosql.annotations.SqlType; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Created by yishuqian on 06/03/2017. + */ +@AutoMapper(tablename = "sys_merchant_warrior_files", pkName = "file_id") +public interface ClientMWFilesMapper { + @AutoSql(SqlType.INSERT) + void save(JSONObject partner); + + @AutoSql(SqlType.UPDATE) + void update(JSONObject partner); + + @AutoSql(SqlType.SELECT) + @AdvanceSelect(addonWhereClause = "is_valid = 1") + List findClientFile(@Param("client_id") int clientId); +} diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientMWAuthFilesInfo.java b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientMWAuthFilesInfo.java new file mode 100644 index 000000000..51d263c92 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientMWAuthFilesInfo.java @@ -0,0 +1,88 @@ +package au.com.royalpay.payment.manage.merchants.beans; + +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; + +/** + * Created by yishuqian on 07/03/2017. + */ +public class ClientMWAuthFilesInfo { + private String upay_application_form; + private String upay_agreement_file; + private String upay_offer_letter; + private String upay_driver_license; + private String upay_residence_certificate; + private String upay_risk_level; + private String upay_risk_remark; + + public JSONObject toJson(){ + return (JSONObject)JSONObject.toJSON(this); + } + + public JSONObject toRiskInfoJson() { + JSONObject params = new JSONObject(); + if (StringUtils.isNotBlank(upay_risk_level)) { + params.put("upay_risk_level", upay_risk_level); + } + if (StringUtils.isNotBlank(upay_risk_remark)) { + params.put("upay_risk_remark", upay_risk_remark); + } + return params; + } + + public String getUpay_agreement_file() { + return upay_agreement_file; + } + + public String getUpay_application_form() { + return upay_application_form; + } + + public String getUpay_driver_license() { + return upay_driver_license; + } + + public String getUpay_offer_letter() { + return upay_offer_letter; + } + + public void setUpay_agreement_file(String upay_agreement_file) { + this.upay_agreement_file = upay_agreement_file; + } + + public void setUpay_application_form(String upay_application_form) { + this.upay_application_form = upay_application_form; + } + + public String getUpay_residence_certificate() { + return upay_residence_certificate; + } + + public String getUpay_risk_level() { + return upay_risk_level; + } + + public void setUpay_driver_license(String upay_driver_license) { + this.upay_driver_license = upay_driver_license; + } + + public void setUpay_offer_letter(String upay_offer_letter) { + this.upay_offer_letter = upay_offer_letter; + } + + public void setUpay_residence_certificate(String upay_residence_certificate) { + this.upay_residence_certificate = upay_residence_certificate; + } + + public String getUpay_risk_remark() { + return upay_risk_remark; + } + + public void setUpay_risk_level(String upay_risk_level) { + this.upay_risk_level = upay_risk_level; + } + + public void setUpay_risk_remark(String upay_risk_remark) { + this.upay_risk_remark = upay_risk_remark; + } +} diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRateConfig.java b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRateConfig.java index ea9e1acf8..00226b22c 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRateConfig.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRateConfig.java @@ -4,8 +4,8 @@ import au.com.royalpay.payment.tools.exceptions.BadRequestException; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; import org.apache.commons.lang3.time.DateUtils; -import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.Calendar; import java.util.Date; @@ -39,6 +39,8 @@ public class ClientRateConfig { @NotNull(message = "error.payment.valid.param_missing") private Integer cleanDays = 3; private String remark; + @JSONField(name = "ext_rates") + private String extRates; public JSONObject toJSON() { if (expiryTime.before(activeTime)) { @@ -102,4 +104,12 @@ public class ClientRateConfig { public void setTransactionFee(Double transactionFee) { this.transactionFee = transactionFee; } + + public String getExtRates() { + return extRates; + } + + public void setExtRates(String extRates) { + this.extRates = extRates; + } } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java index 47c26e099..e78be6bb6 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java @@ -1,5 +1,6 @@ package au.com.royalpay.payment.manage.merchants.core; +import au.com.royalpay.payment.channels.rpaypaymentsvc.runtime.request.entities.RPayMerchantEntity; import au.com.royalpay.payment.core.exceptions.EmailException; import au.com.royalpay.payment.manage.appclient.beans.AppClientBean; import au.com.royalpay.payment.manage.appclient.beans.AppMerchantBean; @@ -29,6 +30,8 @@ public interface ClientManager { JSONObject getSysRateConfig(); + JSONObject getSysCardRateConfig(); + JSONObject getClientInfo(int clientId); JSONObject getClientInfoIgnoreInvalid(int clientId); @@ -252,12 +255,16 @@ public interface ClientManager { void updateClientIdInfo(String clientMoniker,JSONObject params, JSONObject manager); + void updateMWRiskInfoByClient(String clientMoniker,JSONObject params, JSONObject manager); + JSONObject getAuthFiles(JSONObject manager, String clientMoniker); JSONObject getClientViewAuthFiles(JSONObject manager, String clientMoniker); JSONObject getAllAuthFiles(JSONObject manager, String clientMoniker); + JSONObject getMWAuthFiles(JSONObject manager, String clientMoniker); + JSONObject getAllKycFiles(JSONObject manager, String clientMoniker); JSONObject getSourceAgreeFiles(JSONObject manage, String clientMoniker); @@ -270,6 +277,8 @@ public interface ClientManager { void uploadAuthFilesManager(JSONObject manager, String clientMoniker, ClientAuthFilesInfo filesInfo); + void uploadMWAuthFilesManager(JSONObject manager, String clientMoniker, ClientMWAuthFilesInfo filesInfo); + void uploadKycFiles(JSONObject manager, String clientMoniker, ClientKycFilesInfo filesInfo); List uploadKycFilesForWaitCompliance(JSONObject manager, String clientMoniker, ClientKycFilesInfo filesInfo); @@ -376,6 +385,8 @@ public interface ClientManager { void downloadComplianceZip(@PathVariable String clientMoniker, HttpServletResponse response) throws Exception; + void downloadMWComplianceZip(@PathVariable String clientMoniker, HttpServletResponse response) throws Exception; + void configMasterMerchant(JSONObject manager, String clientMoniker, String master_merchant); JSONObject getSettlementLog(JSONObject manager, String clientMoniker, TradeLogQuery query); @@ -564,4 +575,13 @@ public interface ClientManager { boolean getMergeSettleStatus(JSONObject client); void changeExtParams(String clientMoniker,JSONObject manager, JSONObject params); + + RPayMerchantEntity applyMWMerchantId(String clientMoniker, JSONObject manager); + + RPayMerchantEntity queryMWMerchantIdStatus(String clientMoniker, JSONObject manager); + + RPayMerchantEntity queryMWMerchantInfo(String clientMoniker, JSONObject manager); + + void selectBillCodeVersion(JSONObject manager, String clientMoniker, String version); + } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 149495ab2..9e3f7fac3 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -5,6 +5,9 @@ import au.com.royalpay.payment.channels.alipay.config.AlipayEnvironment; import au.com.royalpay.payment.channels.alipay.runtime.AlipayClient; import au.com.royalpay.payment.channels.rpay.runtime.RpayApi; import au.com.royalpay.payment.channels.rpay.runtime.beans.SubRpayMerchantInfo; +import au.com.royalpay.payment.channels.rpaypaymentsvc.mappers.RPayMerchantMapper; +import au.com.royalpay.payment.channels.rpaypaymentsvc.runtime.RPayPaymentCardSvcApi; +import au.com.royalpay.payment.channels.rpaypaymentsvc.runtime.request.entities.RPayMerchantEntity; import au.com.royalpay.payment.channels.wechat.config.WeChatPayConfig; import au.com.royalpay.payment.channels.wechat.config.WechatPayEnvironment; import au.com.royalpay.payment.channels.wechat.runtime.MpPaymentApi; @@ -14,6 +17,8 @@ import au.com.royalpay.payment.channels.yeepay.config.YeePayConfig; import au.com.royalpay.payment.channels.yeepay.mappers.YeePayClientConfigMapper; import au.com.royalpay.payment.channels.yeepay.runtime.YeePayClient; import au.com.royalpay.payment.core.PaymentChannelApi; +import au.com.royalpay.payment.core.beans.EmptyMerchantApplication; +import au.com.royalpay.payment.core.beans.MerchantApplicationResult; import au.com.royalpay.payment.core.exceptions.EmailException; import au.com.royalpay.payment.core.exceptions.InvalidShortIdException; import au.com.royalpay.payment.core.mappers.SysClientMapper; @@ -40,6 +45,7 @@ import au.com.royalpay.payment.manage.mappers.system.*; import au.com.royalpay.payment.manage.merchants.beans.*; import au.com.royalpay.payment.manage.merchants.core.*; import au.com.royalpay.payment.manage.merchants.entity.impls.*; +import au.com.royalpay.payment.manage.merchants.enums.UPayAuthFileEnum; import au.com.royalpay.payment.manage.notice.core.MailService; import au.com.royalpay.payment.manage.permission.utils.OrgCheckUtils; import au.com.royalpay.payment.manage.rservices.core.RServicesApplyService; @@ -232,6 +238,8 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid @Resource private ClientFilesMapper clientFilesMapper; + @Resource + private ClientMWFilesMapper clientMWAuthFilesInfo; @Resource private TransactionMapper transactionMapper; @@ -314,6 +322,10 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid private RetailRSvcService retailRSvcService; @Resource private RServicesApplyService rServicesApplyService; + @Resource + private RPayPaymentCardSvcApi rPayPaymentCardSvcApi; + @Resource + private RPayMerchantMapper rPayMerchantMapper; @Resource @@ -352,6 +364,12 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid return JSONObject.parseObject(rateConfig); } + @Override + public JSONObject getSysCardRateConfig() { + String rateConfig = sysConfigManager.getSysConfig().getString("sys_card_rates"); + return JSONObject.parseObject(rateConfig); + } + @Override @Cacheable(value = ":app_client_info:", key = "''+#clientId", unless = "#result == null") public JSONObject getClientInfo(int clientId) { @@ -1940,6 +1958,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (rate.get("clean_days") == null) { rate.put("clean_days", clientConfig.getIntValue("clean_days")); } + if (StringUtils.equalsIgnoreCase("rpaypmt_card", rate.getString("rate_name"))) { + rate.put("ext_rates", JSONObject.parseObject(rate.getString("ext_rates"))); + } } } catch (Exception ignore) { } @@ -2000,6 +2021,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid config.put("active_time", DateFormatUtils.format(config.getDate("active_time"), "yyyy-MM-dd")); config.put("expiry_time", DateFormatUtils.format(config.getDate("expiry_time"), "yyyy-MM-dd")); + if (isAddCardPaymentRate(config, clientId)) { + return; + } checkAddRate(config, "Wechat", "wechat_rate_value", org, "min_wechat_rate"); checkAddRate(config, "Alipay", "alipay_rate_value", org, "min_alipay_rate"); checkAddRate(config, "AlipayOnline", "alipayonline_rate_value", org, "min_alipayonline_rate"); @@ -2039,6 +2063,13 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid rateLog.put("expiry_time", DateUtils.addDays(config.getDate("active_time"), -1)); clientRateMapper.updateConfig(rateLog); } + if (StringUtils.equalsIgnoreCase("rpaypmt_card", config.getString("type"))) { + JSONObject extRateParams = new JSONObject(){{ + put("domestic_rate_value", config.getBigDecimal("rate_value")); + put("overseas_rate_value", config.getJSONObject("ext_rates").getBigDecimal("international_rate_value")); + }}; + newConfig.put("ext_rates", extRateParams.toJSONString()); + } clientRateMapper.saveRate(newConfig); logger.info(clientId + "的" + channel + "费率设置成功"); } @@ -2064,13 +2095,13 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid configJson.put("manager_name", manager.getString("username")); configJson.put("update_time", new Date()); clientRateMapper.updateConfig(configJson); - if ("Rpay".equals(configJson.getString("rate_name"))) { - rpayApi.modifySurchargeConfig(client); - } +// if ("Rpay".equals(configJson.getString("rate_name"))) { +// rpayApi.modifySurchargeConfig(client); +// } int clientId = client.getIntValue("client_id"); JSONObject changeRate = merchantInfoProvider.clientCurrentRate(clientId, new Date(), "Wechat"); int cleanDays = changeRate.getIntValue("clean_days"); - if (cleanDays != client.getIntValue("clean_days")) { + if (cleanDays != client.getIntValue("clean_days") && StringUtils.equalsIgnoreCase("Wechat",config.getRateName())) { clientModifySupport.processClientConfigModify(new ClearDaysModify(manager, clientMoniker, cleanDays)); } // clientMapper.updateCleanDays(clientId, config.getCleanDays()); @@ -3348,6 +3379,46 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } } + @Override + public void downloadMWComplianceZip(String clientMoniker, HttpServletResponse response) throws Exception { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + List files = clientMWAuthFilesInfo.findClientFile(client.getIntValue("client_id")); + if (files != null && files.size() > 0) { + List filePaths = new ArrayList<>(); + for (JSONObject file : files) { + filePaths.add(file.getString("file_value")); + } + try { + String downloadFilename = clientMoniker + "_Compliance_Files_" + DateFormatUtils.format(new Date(), "dd/MM/yyyy HH:mm:ss").toString() + ".zip";// 文件的名称 + logger.info("正在下载合规文件=====>" + downloadFilename); + // downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");//转换中文否则可能会产生乱码 + response.setContentType("application/octet-stream");// 指明response的返回对象是文件流 + response.setHeader("Content-Disposition", "attachment;filename=" + downloadFilename);// 设置在下载框默认显示的文件名 + ZipOutputStream zos = new ZipOutputStream(response.getOutputStream()); + for (String file : filePaths) { + URL url = new URL(file); + zos.putNextEntry(new ZipEntry(file.substring(file.lastIndexOf("/")))); + InputStream fis = url.openConnection().getInputStream(); + byte[] buffer = new byte[1024]; + int r = 0; + while ((r = fis.read(buffer)) != -1) { + zos.write(buffer, 0, r); + } + fis.close(); + } + zos.flush(); + zos.close(); + logger.info("合规文件下载成功=====>" + downloadFilename); + } catch (IOException e) { + logger.error("合规文件下载失败", e); + + } + } + } + @Override public void configMasterMerchant(JSONObject manager, String clientMoniker, String master_merchant) { @@ -3512,6 +3583,17 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid clientApproveIdInfo(params,client); } + @Override + public void updateMWRiskInfoByClient(String clientMoniker, JSONObject params, JSONObject manager) { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + int clientId = client.getIntValue("client_id"); + params.put("client_id", client.getIntValue("client_id")); + clientConfigMapper.update(params); + } + @Override public void checkTodo(JSONObject manager, List notices) { if (ManagerRole.OPERATOR.hasRole(manager.getIntValue("role"))) { @@ -3621,6 +3703,20 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid return fileJson; } + @Override + public JSONObject getMWAuthFiles(JSONObject manager, String clientMoniker) { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + List clientFiles = clientMWAuthFilesInfo.findClientFile(client.getIntValue("client_id")); + JSONObject fileJson = new JSONObject(); + for (JSONObject file : clientFiles) { + fileJson.put(file.getString("file_name"), file.getString("file_value")); + } + return fileJson; + } + @Override public JSONObject getAllKycFiles(JSONObject manager, String clientMoniker) { JSONObject client = getClientInfoByMoniker(clientMoniker); @@ -3762,6 +3858,25 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } } + @Override + @Transactional + public void uploadMWAuthFilesManager(JSONObject manager, String clientMoniker, ClientMWAuthFilesInfo filesInfo) { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + int clientId = client.getIntValue("client_id"); + try { + updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_APPLICATION_FORM.getFileName(), filesInfo.getUpay_application_form()); + updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_AGREEMENT_FILE.getFileName(), filesInfo.getUpay_agreement_file()); + updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_OFFER_LETTER.getFileName(), filesInfo.getUpay_offer_letter()); + updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_DRIVER_LICENSE.getFileName(), filesInfo.getUpay_driver_license()); + updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_RESIDENCE_CERTIFICATE.getFileName(), filesInfo.getUpay_residence_certificate()); + } catch (Exception e) { + logger.error("上传合规文件失败", e); + } + } + @Override @Transactional public void uploadKycFiles(JSONObject manager, String clientMoniker, ClientKycFilesInfo filesInfo) { @@ -4211,6 +4326,20 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } } + public void updateSysMWClientFiles(JSONObject manager, int clientId, String fileType, String fileValue) { + if (fileValue != null) { + JSONObject fileJson = new JSONObject(); + fileJson.put("client_id", clientId); + fileJson.put("last_update_date", new Date()); + fileJson.put("last_update_by", manager.getString("display_name")); + fileJson.put("file_name", fileType); + fileJson.put("file_value", fileValue); + fileJson.put("is_valid", 1); + clientMWAuthFilesInfo.save(fileJson); + logger.info(clientId + "的fileType文件上传成功"); + } + } + public void updateSysClientFilesWithoutRepeat(JSONObject manager, int clientId, String fileType, String fileValue) { List repetitiveFiles = clientFilesMapper.findRepetitiveFilesForDelete(clientId,fileType); if (fileValue != null) { @@ -6255,9 +6384,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid record.put("manager_name", "System"); record.put("remark", "费率到期系统自动延期1年"); clientRateMapper.saveRate(record); - if ("Rpay".equals(o.getString("rate_name"))) { - rpayApi.modifySurchargeConfig(clientMapper.findClient(client_id)); - } +// if ("Rpay".equals(o.getString("rate_name"))) { +// rpayApi.modifySurchargeConfig(clientMapper.findClient(client_id)); +// } } adminAccounts.forEach(o -> { sendClientPostponeNotify(o, expireDate); @@ -6812,4 +6941,56 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid clientMapper.update(client); } + @Override + public RPayMerchantEntity applyMWMerchantId(String clientMoniker, JSONObject manager) { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + MerchantApplicationResult result = rPayPaymentCardSvcApi.apply(client, new EmptyMerchantApplication(), manager); + if (result == null) { + throw new ServerErrorException("Failed To Apply For Merchant Warrior Sub Merchant ID"); + } + return rPayMerchantMapper.findMerchant(client.getIntValue("client_id")); + } + + @Override + public RPayMerchantEntity queryMWMerchantIdStatus(String clientMoniker, JSONObject manager) { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + return rPayPaymentCardSvcApi.findMerchant(client); + } + + @Override + public RPayMerchantEntity queryMWMerchantInfo(String clientMoniker, JSONObject manager) { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + JSONObject bankAccount = getBankAccountByClientId(client.getIntValue("client_id")); + return (new RPayMerchantEntity()).applyClientInfo(client).applyBankAccount(bankAccount); + } + + private boolean isAddCardPaymentRate(JSONObject config, int clientId) { + if (!StringUtils.equalsIgnoreCase("rpaypmt_card", config.getString("type")) + && !StringUtils.equalsIgnoreCase("rpaypmt_dd", config.getString("type"))) { + return false; + } + configNewClientRate(config, clientId, config.getString("type"), "rate_value", null, null); + return true; + } + + @Override + public void selectBillCodeVersion(JSONObject manager, String clientMoniker, String version){ + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + client.put("billcode_version", version); + clientMapper.update(client); + clientInfoCacheSupport.clearClientCache(client.getIntValue("client_id")); + } + } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/enums/UPayAuthFileEnum.java b/src/main/java/au/com/royalpay/payment/manage/merchants/enums/UPayAuthFileEnum.java new file mode 100644 index 000000000..4118df321 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/enums/UPayAuthFileEnum.java @@ -0,0 +1,28 @@ +package au.com.royalpay.payment.manage.merchants.enums; + +public enum UPayAuthFileEnum { + ALL(""), + UPAY_APPLICATION_FORM("upay_application_form"), + UPAY_AGREEMENT_FILE("upay_agreement_file"), + UPAY_OFFER_LETTER("upay_offer_letter"), + UPAY_DRIVER_LICENSE("upay_driver_license"), + UPAY_RESIDENCE_CERTIFICATE("upay_residence_certificate"); + + private final String fileName; + + public String getFileName() { + return fileName; + } + + UPayAuthFileEnum(String fileName) { + this.fileName = fileName; + } + + public String[] getFileNameArrays() { + return new String[]{UPAY_APPLICATION_FORM.getFileName(), + UPAY_AGREEMENT_FILE.getFileName(), + UPAY_OFFER_LETTER.getFileName(), + UPAY_DRIVER_LICENSE.getFileName(), + UPAY_RESIDENCE_CERTIFICATE.getFileName()}; + } +} diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java index 190f6d1aa..8a0fa3db1 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java @@ -1,5 +1,6 @@ package au.com.royalpay.payment.manage.merchants.web; +import au.com.royalpay.payment.channels.rpaypaymentsvc.runtime.request.entities.RPayMerchantEntity; import au.com.royalpay.payment.manage.dev.core.MerchantLocationService; import au.com.royalpay.payment.manage.merchants.beans.*; import au.com.royalpay.payment.manage.merchants.core.ClientManager; @@ -95,6 +96,11 @@ public class PartnerManageController { clientManager.updateClientIdInfo(clientMoniker, params, manager); } + @ManagerMapping(value = "/{clientMoniker}/mw_risk_info", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) + public void updateMWRiskInfoByClient(@PathVariable String clientMoniker, @RequestBody JSONObject params, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + clientManager.updateMWRiskInfoByClient(clientMoniker, params, manager); + } + @ManagerMapping(value = "/{clientMoniker}/qrcode", method = RequestMethod.GET) public JSONObject getQrCodeImg(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, QRCodeConfig config) { return clientManager.getQRCode(manager, clientMoniker, config); @@ -298,6 +304,11 @@ public class PartnerManageController { clientManager.switchPermission(manager, clientMoniker, "common_sub_merchant_id", pass.getBooleanValue("allow")); } + @ManagerMapping(value = "/{clientMoniker}/selectBillVersion", method = RequestMethod.POST, role = {ManagerRole.OPERATOR, ManagerRole.BD_USER}) + public void selectBillVersion(@PathVariable String clientMoniker, @RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + clientManager.selectBillCodeVersion(manager, clientMoniker, pass.getString("version")); + } + /** * 父商户全局管理子商户 * @@ -493,6 +504,11 @@ public class PartnerManageController { return clientManager.getSysRateConfig(); } + @GetMapping("/sys_card_rates") + public JSONObject getSysCardRate() { + return clientManager.getSysCardRateConfig(); + } + @ManagerMapping(value = "/{clientMoniker}/rates/{rateId}", method = RequestMethod.PUT, role = {ManagerRole.OPERATOR, ManagerRole.FINANCIAL_STAFF}) public void updateRate(@PathVariable String clientMoniker, @PathVariable int rateId, @RequestBody @Valid ClientRateConfig config, Errors errors, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { @@ -553,6 +569,11 @@ public class PartnerManageController { return clientManager.getAllAuthFiles(manager, clientMoniker); } + @ManagerMapping(value = "/{clientMoniker}/mw_file", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.BD_USER, ManagerRole.SERVANT}) + public JSONObject getMWAuthFiles(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + return clientManager.getMWAuthFiles(manager, clientMoniker); + } + @ManagerMapping(value = "/{clientMoniker}/kycFile", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.BD_USER, ManagerRole.SERVANT}) public JSONObject getKycFiles(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { return clientManager.getAllKycFiles(manager, clientMoniker); @@ -574,6 +595,12 @@ public class PartnerManageController { clientManager.uploadAuthFilesManager(manager, clientMoniker, filesInfo); } + @ManagerMapping(value = "/{clientMoniker}/mw_file", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.BD_USER}) + public void uploadMWAuthFiles(@PathVariable String clientMoniker, @RequestBody ClientMWAuthFilesInfo filesInfo, + @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + clientManager.uploadMWAuthFilesManager(manager, clientMoniker, filesInfo); + } + @ManagerMapping(value = "/{clientMoniker}/kycFile", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.BD_USER}) public void uploadKycFiles(@PathVariable String clientMoniker, @RequestBody ClientKycFilesInfo filesInfo, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { @@ -636,6 +663,11 @@ public class PartnerManageController { clientManager.downloadComplianceZip(clientMoniker, response); } + @ManagerMapping(value = "/{clientMoniker}/download/MWcomplianceAsZIP", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) + public void downloadMWComplianceZip(@PathVariable String clientMoniker, HttpServletResponse response) throws Exception { + clientManager.downloadMWComplianceZip(clientMoniker, response); + } + @ManagerMapping(value = "/{clientMoniker}/master_configuration", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) public void configMasterMerchant(@PathVariable String clientMoniker, @RequestBody JSONObject merchant, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { clientManager.configMasterMerchant(manager, clientMoniker, merchant.getString("master_merchant")); @@ -880,4 +912,21 @@ public class PartnerManageController { @RequestBody JSONObject params){ clientManager.changeExtParams(clientMoniker,manager,params); } + + @ManagerMapping(value = "/{clientMoniker}/applyMWMerchantId",method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) + public RPayMerchantEntity applyMWMerchantId(@PathVariable("clientMoniker")String clientMoniker, + @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager){ + return clientManager.applyMWMerchantId(clientMoniker,manager); + } + + @ManagerMapping(value = "/{clientMoniker}/queryMWMerchantIdStatus",method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) + public RPayMerchantEntity queryMWMerchantIdStatus(@PathVariable("clientMoniker")String clientMoniker, + @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager){ + return clientManager.queryMWMerchantIdStatus(clientMoniker,manager); + } + + @ManagerMapping(value = "/{clientMoniker}/query/mw_info", method = RequestMethod.GET, role = {ManagerRole.OPERATOR, ManagerRole.ADMIN}) + public RPayMerchantEntity queryMWMerchantInfo(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + return clientManager.queryMWMerchantInfo(clientMoniker, manager); + } } diff --git a/src/main/java/au/com/royalpay/payment/manage/organizations/beans/OrgInfo.java b/src/main/java/au/com/royalpay/payment/manage/organizations/beans/OrgInfo.java index 2fce91187..1377d2723 100644 --- a/src/main/java/au/com/royalpay/payment/manage/organizations/beans/OrgInfo.java +++ b/src/main/java/au/com/royalpay/payment/manage/organizations/beans/OrgInfo.java @@ -28,10 +28,9 @@ public class OrgInfo { private Double wechat_rate_value; private Double bestpay_rate_value; private Double alipayonline_rate_value; - private Double jd_rate_value; - private Double hf_rate_value; - private Double yeepay_rate_value; private Double cb_bankpay_rate_value; + private Double rpaypmt_card_rate_value; + private Double rpaypmt_dd_rate_value; private int is_valid; private String search_text; private int page = 1; @@ -41,12 +40,10 @@ public class OrgInfo { private String commission_type; private Double min_wechat_rate; private Double min_alipay_rate; - private Double min_bestpay_rate; - private Double min_jd_rate; private Double min_alipayonline_rate; - private Double min_hf_rate; - private Double min_yeepay_rate; private Double min_cb_bankpay_rate; + private Double min_rpaypmt_card_rate; + private Double min_rpaypmt_dd_rate; private String state; private String senior_parent_org_id; @@ -201,14 +198,6 @@ public class OrgInfo { this.alipayonline_rate_value = alipayonline_rate_value; } - public Double getJd_rate_value() { - return jd_rate_value; - } - - public void setJd_rate_value(Double jd_rate_value) { - this.jd_rate_value = jd_rate_value; - } - public String getSearch_text() { return search_text; } @@ -273,22 +262,6 @@ public class OrgInfo { this.min_alipay_rate = min_alipay_rate; } - public Double getMin_bestpay_rate() { - return min_bestpay_rate; - } - - public void setMin_bestpay_rate(Double min_bestpay_rate) { - this.min_bestpay_rate = min_bestpay_rate; - } - - public Double getMin_jd_rate() { - return min_jd_rate; - } - - public void setMin_jd_rate(Double min_jd_rate) { - this.min_jd_rate = min_jd_rate; - } - public Double getMin_alipayonline_rate() { return min_alipayonline_rate; } @@ -297,22 +270,6 @@ public class OrgInfo { this.min_alipayonline_rate = min_alipayonline_rate; } - public Double getHf_rate_value() { - return hf_rate_value; - } - - public void setHf_rate_value(Double hf_rate_value) { - this.hf_rate_value = hf_rate_value; - } - - public Double getMin_hf_rate() { - return min_hf_rate; - } - - public void setMin_hf_rate(Double min_hf_rate) { - this.min_hf_rate = min_hf_rate; - } - public String getState() { return state; } @@ -328,22 +285,6 @@ public class OrgInfo { this.senior_parent_org_id = senior_parent_org_id; } - public Double getYeepay_rate_value() { - return yeepay_rate_value; - } - - public void setYeepay_rate_value(Double yeepay_rate_value) { - this.yeepay_rate_value = yeepay_rate_value; - } - - public Double getMin_yeepay_rate() { - return min_yeepay_rate; - } - - public void setMin_yeepay_rate(Double min_yeepay_rate) { - this.min_yeepay_rate = min_yeepay_rate; - } - public Double getCb_bankpay_rate_value() { return cb_bankpay_rate_value; } @@ -360,4 +301,35 @@ public class OrgInfo { this.min_cb_bankpay_rate = min_cb_bankpay_rate; } + public Double getRpaypmt_card_rate_value() { + return rpaypmt_card_rate_value; + } + + public Double getRpaypmt_dd_rate_value() { + return rpaypmt_dd_rate_value; + } + + public void setRpaypmt_card_rate_value(Double rpaypmt_card_rate_value) { + this.rpaypmt_card_rate_value = rpaypmt_card_rate_value; + } + + public void setRpaypmt_dd_rate_value(Double rpaypmt_dd_rate_value) { + this.rpaypmt_dd_rate_value = rpaypmt_dd_rate_value; + } + + public Double getMin_rpaypmt_card_rate() { + return min_rpaypmt_card_rate; + } + + public Double getMin_rpaypmt_dd_rate() { + return min_rpaypmt_dd_rate; + } + + public void setMin_rpaypmt_card_rate(Double min_rpaypmt_card_rate) { + this.min_rpaypmt_card_rate = min_rpaypmt_card_rate; + } + + public void setMin_rpaypmt_dd_rate(Double min_rpaypmt_dd_rate) { + this.min_rpaypmt_dd_rate = min_rpaypmt_dd_rate; + } } diff --git a/src/main/java/au/com/royalpay/payment/manage/signin/core/impls/SignInAccountServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/signin/core/impls/SignInAccountServiceImpl.java index a34be1651..47176c010 100644 --- a/src/main/java/au/com/royalpay/payment/manage/signin/core/impls/SignInAccountServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/signin/core/impls/SignInAccountServiceImpl.java @@ -498,7 +498,7 @@ public class SignInAccountServiceImpl implements SignInAccountService, Applicati "company_phone", "suburb", "postcode", "state", "contact_person", "contact_phone", "contact_email", "short_name", "logo_url", "enable_refund", "enable_refund_auth", "retail_surcharge", "require_custinfo", "require_remark", "logo_thumbnail", "creator", "create_time", "approver", "approve_result", "approve_time", "open_status", "timezone", "has_children", "source", "customer_surcharge_rate", "enable_alipay", "enable_wechat", - "enable_bestpay", "manual_settle", "skip_clearing", "mail_confirm", "surcharge_mode", "company_photo", "store_photo", "company_website", "contact_job", "sub_manage"}; + "enable_bestpay", "manual_settle", "skip_clearing", "mail_confirm", "surcharge_mode", "company_photo", "store_photo", "company_website", "contact_job", "sub_manage","enable_rpaypmt_card","enable_rpaypmt_dd"}; for (String col : columns) { simpleClient.put(col, client.get(col)); } diff --git a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java index d11771583..8d06b70dc 100644 --- a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java @@ -434,6 +434,13 @@ public class TradeLogServiceImpl implements TradeLogService { break; } order.put("status_str", statusStr); + if (StringUtils.equalsIgnoreCase("rpaypmt_card", order.getString("channel")) + || StringUtils.equalsIgnoreCase("rpaypmt_dd", order.getString("channel"))) { + JSONObject extParams = JSONObject.parseObject(order.getString("ext_params")); + if (extParams != null) { + order.putAll(extParams); + } + } return order; } diff --git a/src/main/java/au/com/royalpay/payment/manage/tradelog/refund/impls/RefundServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/tradelog/refund/impls/RefundServiceImpl.java index 8512b1582..4a6623cbc 100644 --- a/src/main/java/au/com/royalpay/payment/manage/tradelog/refund/impls/RefundServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/tradelog/refund/impls/RefundServiceImpl.java @@ -229,7 +229,7 @@ public class RefundServiceImpl implements RefundService, ApplicationEventPublish } boolean requireAudit = type == OperatorType.PARTNER && PartnerRole.getRole(partnerAccount.getIntValue("role")) == PartnerRole.CASHIER && clientConfig.getBooleanValue("enable_refund_auth"); - logger.debug("applyer type=" + type + "; require audit=" + requireAudit); + logger.debug("applyer type={}; require audit={}",type, requireAudit); return paymentApi.refundOrder(null, orderId, null, amount, remark, operator, type, requireAudit); } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index eefc48e24..3beef053f 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -1,15 +1,15 @@ spring: datasource: master: - host: 192.168.0.4:3306 + host: 192.168.0.84:3306 jdbc-url: jdbc:mysql://${spring.datasource.master.host}/${spring.datasource.master.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false - password: taylor - schema-name: royalpay_production - username: taylor + password: rpayplus + schema-name: royalpay + username: root slave: - host: 192.168.0.4:3306 + host: 192.168.0.84:3306 jdbc-url: jdbc:mysql://${spring.datasource.slave.host}/${spring.datasource.slave.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false - password: taylor - schema-name: royalpay_production - username: taylor + password: rpayplus + schema-name: royalpay + username: root type: com.zaxxer.hikari.HikariDataSource diff --git a/src/main/resources/application-officedev.yml b/src/main/resources/application-officedev.yml index 587cd4368..41b67c62f 100644 --- a/src/main/resources/application-officedev.yml +++ b/src/main/resources/application-officedev.yml @@ -18,6 +18,4 @@ spring: redis: database: 9 host: 192.168.0.84 - port: 6379 -app: - debug: true \ No newline at end of file + port: 6379 \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index fb95b16c4..15821043a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -3,6 +3,8 @@ android: appkey: '' secret: '' app: + crossapp: + enable: true agreetemplate: aggregate: path: https://file.royalpay.com.au/open/2020/04/08/1586313342533_41vI3w9R8OHrhAVYWvdv7S2IyQra4z.pdf @@ -100,7 +102,6 @@ logging: Statement: debug pattern: console: '[%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){blue}] %clr(%-5level) %logger: %msg%n' - mail: mailgun: api_key: api:key-2e67b891a1a7974bf3a40ea440d5a77f diff --git a/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/CustomerAndOrdersStatisticsMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/CustomerAndOrdersStatisticsMapper.xml index 1c8eadd2e..0cd8a813d 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/CustomerAndOrdersStatisticsMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/CustomerAndOrdersStatisticsMapper.xml @@ -356,6 +356,12 @@ ifnull(sum(CASE WHEN s.channel = 'LakalaPay' THEN s.total ELSE 0 END),0) lakalapayamount, ifnull(sum(CASE WHEN s.channel = 'LakalaPay' THEN s.orders ELSE 0 END),0) lakalapay_order_count, ifnull(COUNT(DISTINCT s.client_id,IF(s.channel = 'LakalaPay',TRUE,NULL)),0) lakala_client_count, + ifnull(sum(CASE WHEN s.channel = 'rpaypmt_card' THEN s.total ELSE 0 END),0) rpaypmt_cardamount, + ifnull(sum(CASE WHEN s.channel = 'rpaypmt_card' THEN s.orders ELSE 0 END),0) rpaypmt_card_order_count, + ifnull(COUNT(DISTINCT s.client_id,IF(s.channel = 'rpaypmt_card',TRUE,NULL)),0) rpaypmt_card_client_count, + ifnull(sum(CASE WHEN s.channel = 'rpaypmt_dd' THEN s.total ELSE 0 END),0) rpaypmt_ddamount, + ifnull(sum(CASE WHEN s.channel = 'rpaypmt_dd' THEN s.orders ELSE 0 END),0) rpaypmt_dd_order_count, + ifnull(COUNT(DISTINCT s.client_id,IF(s.channel = 'rpaypmt_dd',TRUE,NULL)),0) rpaypmt_dd_client_count, ifnull(sum(s.orders), 0) all_count, ifnull(sum(s.total), 0) all_amount, ifnull(COUNT(DISTINCT s.client_id),0) all_client_count @@ -409,12 +415,16 @@ ifnull(SUM(IF(channel='jd' and transaction_type='Credit',clearing_amount,0)),0) jdamount, ifnull(SUM(IF(channel='LakalaPay' and transaction_type='Credit',1,0)),0) lakala_order_count, ifnull(SUM(IF(channel='LakalaPay' and transaction_type='Credit',clearing_amount,0)),0) lakalapayamount, + ifnull(SUM(IF(channel='rpaypmt_card' and transaction_type='Credit',1,0)),0) rpaypmt_card_order_count, + ifnull(SUM(IF(channel='rpaypmt_card' and transaction_type='Credit',clearing_amount,0)),0) rpaypmt_cardamount, + ifnull(SUM(IF(channel='rpaypmt_dd' and transaction_type='Credit',1,0)),0) rpaypmt_dd_order_count, + ifnull(SUM(IF(channel='rpaypmt_dd' and transaction_type='Credit',clearing_amount,0)),0) rpaypmt_ddamount, count(distinct order_id) all_count, count(distinct client_id) all_client_count, ifnull(SUM(IF(transaction_type='Credit',clearing_amount,0)),0) all_amount FROM pmt_transactions WHERE channel IN - ('Bestpay','Yeepay','Rpay','hf','jd','LakalaPay') + ('Bestpay','Yeepay','Rpay','hf','jd','LakalaPay','rpaypmt_card','rpaypmt_dd') and create_time >= #{begin} and create_time < #{end} diff --git a/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/TransactionAnalysisMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/TransactionAnalysisMapper.xml index ca47f7dbf..4076c12db 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/TransactionAnalysisMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/TransactionAnalysisMapper.xml @@ -152,7 +152,8 @@ + id="alipay_rate_value_input" name="alipay_rate_value" max="100" min="0" required> % @@ -136,32 +136,7 @@
- % -
-
- - -
- -
-
- - % -
-
-
- -
- -
-
- + id="wechat_rate_value_input" name="wechat_rate_value" max="100" min="0" required> %
@@ -174,35 +149,11 @@
+ max="100" min="0" required> %
- -
@@ -210,107 +161,104 @@
+ max="100" min="0" required> %
- - -
- + ng-class="{'has-error':org_form.rpaypmt_card_rate_value.$invalid && org_form.rpaypmt_card_rate_value.$dirty}"> +
- + %
- + ng-class="{'has-error':org_form.rpaypmt_dd_rate_value.$invalid && org_form.rpaypmt_dd_rate_value.$dirty}"> +
- + %
+
+
- + ng-class="{'has-error':org_form.min_wechat_rate.$invalid && org_form.min_wechat_rate.$dirty}"> +
- + %
-
- + ng-class="{'has-error':org_form.min_alipay_rate.$invalid && org_form.min_alipay_rate.$dirty}"> +
- + %
-
- +
+ min="0"> %
- - +
- + ng-class="{'has-error':org_form.min_rpaypmt_dd_rate.$invalid && org_form.min_rpaypmt_dd_rate.$dirty}"> +
- + %
diff --git a/src/main/ui/static/config/organizations/templates/org_detail.html b/src/main/ui/static/config/organizations/templates/org_detail.html index af53d7d00..c0f17829d 100644 --- a/src/main/ui/static/config/organizations/templates/org_detail.html +++ b/src/main/ui/static/config/organizations/templates/org_detail.html @@ -113,34 +113,18 @@
-
- -
- - % -
-
-
- + %
-
- -
- - % -
-
- -
- +
+
- + %
@@ -148,28 +132,28 @@
- + %
- -
- +
+
+
- + %
@@ -179,7 +163,7 @@
- +
@@ -188,7 +172,7 @@
- +
@@ -196,104 +180,46 @@
-
- -
- - % -
-
- -
- -
- - % -
-
-
- +
%
- +
+
- + ng-class="{'has-error':org_form.min_rpaypmt_dd_rate.$invalid && org_form.min_rpaypmt_dd_rate.$dirty}"> +
- + %
- - -
@@ -766,12 +692,6 @@ - - - - - - {{clientExtracts.channel}} diff --git a/src/main/ui/static/css/cardpay.css b/src/main/ui/static/css/cardpay.css index de5d4d11a..2f0755782 100644 --- a/src/main/ui/static/css/cardpay.css +++ b/src/main/ui/static/css/cardpay.css @@ -1,177 +1,187 @@ -.qrpay-background { - position: fixed; - background: #f2f2f2; - top: 0; - bottom: 0; - right: 0; - left: 0; - z-index: -1; -} - -section.content { - position: absolute; - top: 70px; - bottom: 64px; +.logo-container { width: 100%; - overflow: auto; - left: 0; + text-align: center; + padding: 30px 0px; } -.qrpay-container { - width: 700px; - position: relative; - display: block; - margin: 40px auto; - background: #fff; - overflow: visible; - box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.30); +.logo { + width: 137px; + height: 29px; } -.qrpay-container .qr-brand { - width: 100%; - height: 80px; - padding-top: 20px; +.price { + color: #FF6600; + letter-spacing: 0; + text-align: center; + margin-top: 15px; } -.qrpay-container .qr-brand.wechat { - background: #09bb07; +.card-pay-table { + padding: 15px; } -.qrpay-container .qr-brand.alipay { - background: #1eabeb; +.card-pay-title { + font-size: 14px; + color: #9B9B9B; + letter-spacing: 0; } -.qrpay-container .qr-brand > .wechat-logo { - display: block; - margin: auto; - height: 40px; +.card-pay-content { + font-size: 14px; + color: #202020; + letter-spacing: 0; } -.qrpay-container .price-box { - position: relative; - display: block; - margin: 15px auto; - width: 240px; +.row-height { + margin-bottom: 10px; } -.qrpay-container .price-box:after { - content: ''; - display: block; - clear: both; +.card-pay-footer { + position: fixed; + font-family: PingFangSC-Regular; + font-size: 14px; + color: #DDDDDD; + letter-spacing: 0; + bottom: 15px; + width: 100%; + text-align: center; } -.qrpay-container .price-box .exchange-rate { - font-size: 16px; - display: block; -} +@media screen and (max-width: 768px) { + .form-container { + width: 100%; + padding: 22px 20px; + } + + .form-content { + width: 100%; + } -.qrpay-container .price-box .price { - font-size: 22px; - float: left; - line-height: 28px; + .card-pay-table-container { + width: 100%; + margin: 0 auto; + } + + .card-line { + width: 92%; + margin: 0 auto; + border-bottom: 1px solid #DDDDDD; + } + + .form-button { + width: 92%; + margin: 30px 0; + border-radius: 4px; + height: 50px; + } } -.qrpay-container .price-box .price-left { - font-weight: bold; - border-right: 2px solid #666; - padding-right: 10px; +@media screen and (min-width: 768px) { + .form-container { + width: 50%; + margin: 0 auto; + padding: 22px 20px; + } + + .form-content { + width: 50%; + margin: 0 auto; + } + + .card-pay-table-container { + width: 40%; + margin: 0 auto; + } + + .card-line { + width: 100%; + margin: 0 auto; + border-bottom: 1px solid #DDDDDD; + } + + .form-button { + width: 60%; + margin: 30px 0; + border-radius: 4px; + height: 50px; + } } -.qrpay-container .price-box .price-right { - padding-left: 10px; - width: 49%; - white-space: nowrap; - text-align: left; +.btn-warning { + color: #fff; + background-color: #FF6600 !important; + border-color: #FF6600 !important; } -.qrpay-container .card-input-box { +.card-input-box { width: 100%; text-align: center; border: none; } -.qrpay-container .qrcode-img { - width: 140px; - height: 140px; - position: relative; +.loading-container { + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: rgba(255, 255, 255, .8); display: block; - margin: auto; +} +.loading-container.hide{ + display: none; } -.qrpay-container .qr-footer { +.loading-container > .loading-box { position: relative; - bottom: 0; - border-radius: 0 0 10px 10px; - width: 100%; - padding: 10px; - background: #f7f7f7; - color: #000; + margin: auto; + top: 50%; + transform: translateY(-50%); } -.qrpay-container .qr-footer .form-group { - margin-bottom: 2px; - font-size: 12px; - line-height: 12px; +.loading-container > .loading-box > .loading-text { + display: block; + text-align: center; + font-size: 2em; + color: #aaa; + text-shadow: 2px -1px 4px; } -.qrpay-container .qr-desc { - position: absolute; - height: 150px; - z-index: 999; - top: 140px; - right: 30px; +.loading-container .loading { + position: relative; + margin: 0 auto; + width: 100px; + height: 100px; } -.qrpay-container .btn{ - border-radius: 0; +.loading-container .loading span { + display: inline-block; + width: 20px; + height: 20px; + border-radius: 100%; + background-color: #ff6600; + margin: 35px 5px; + opacity: 0; } -#footer { - position: absolute; - width: 100%; - bottom: 0; +.loading-container .loading span:nth-child(1) { + animation: opacitychange 1s ease-in-out infinite; } -@media (max-width: 997px) { - section.content { - width: 100%; - position: relative; - bottom: 0; - top: 0; - overflow: visible; - } - - .qrpay-container { - width: 100%; - } - - #footer { - position: relative; - } - - .qr-desc { - display: none; - } +.loading-container .loading span:nth-child(2) { + animation: opacitychange 1s ease-in-out 0.33s infinite; } -@media (min-width: 768px) { - .dl-horizontal dd { - margin-left: 180px; - line-height: 32px; - } +.loading-container .loading span:nth-child(3) { + animation: opacitychange 1s ease-in-out 0.66s infinite; } -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - line-height: 32px; +@keyframes opacitychange { + 0%, 100% { + opacity: 0; } -} - + 60% { + opacity: 1; + } +} \ No newline at end of file diff --git a/src/main/ui/static/css/img/logo.png b/src/main/ui/static/css/img/logo.png new file mode 100644 index 000000000..51032a5db Binary files /dev/null and b/src/main/ui/static/css/img/logo.png differ diff --git a/src/main/ui/static/dashboard/partner-dashboard.js b/src/main/ui/static/dashboard/partner-dashboard.js index 2e5cf5cc7..01a34eb07 100644 --- a/src/main/ui/static/dashboard/partner-dashboard.js +++ b/src/main/ui/static/dashboard/partner-dashboard.js @@ -575,8 +575,12 @@ define(['angular','decimal', 'uiRouter', 'uiBootstrap', 'angularEcharts'], funct }]); app.controller('partnerDashboardCtrl', ['$scope', '$http', '$filter', '$uibModal','$timeout', 'chartParser','clearingDetailService','commonDialog','company_info', function ($scope, $http, $filter, $uibModal,$timeout, chartParser,clearingDetailService,commonDialog,company_info) { + $scope.showUnSettleDetail = false; $scope.company_info = company_info.data || {}; $scope.sendMailCount = 0; + $scope.hideNotSettleDetail = function () { + $scope.showUnSettleDetail = !$scope.showUnSettleDetail; + }; $scope.scales = [ { key: 'today', diff --git a/src/main/ui/static/dashboard/templates/dashboard.html b/src/main/ui/static/dashboard/templates/dashboard.html index 7eeb8d42c..83647b3b9 100644 --- a/src/main/ui/static/dashboard/templates/dashboard.html +++ b/src/main/ui/static/dashboard/templates/dashboard.html @@ -200,7 +200,32 @@
LakalaPay
- +
+
+
交易额: + +
+
订单数: + +
+
Card Payment
+
+
+
+
+
交易额: + +
+
订单数: + +
+
Direct Debit
+
+
diff --git a/src/main/ui/static/dashboard/templates/partner_dashboard.html b/src/main/ui/static/dashboard/templates/partner_dashboard.html index 7da27f9cf..805e0603d 100644 --- a/src/main/ui/static/dashboard/templates/partner_dashboard.html +++ b/src/main/ui/static/dashboard/templates/partner_dashboard.html @@ -357,8 +357,19 @@
- {{transcommon.not_settled|currency:'AUD '}} + {{transcommon.not_settled|currency:'AUD '}} +
+ + Cross-border Payment : {{transcommon.sys_not_settled|currency:'AUD '}} + + + Card Payment : {{transcommon.rpaypmt_card_not_settled|currency:'AUD '}} + + + Direct Debit : {{transcommon.rpaypmt_dd_not_settled|currency:'AUD '}} + +
UNSETTLED
diff --git a/src/main/ui/static/data/mw_industry.json b/src/main/ui/static/data/mw_industry.json new file mode 100644 index 000000000..4c7181fce --- /dev/null +++ b/src/main/ui/static/data/mw_industry.json @@ -0,0 +1,498 @@ + [ + { + "children": [ + { + "children": [], + "label": "Veterinary Services", + "mccCode": "0742" + }, + { + "children": [], + "label": "Agricultural Cooperatives", + "mccCode": "0763" + }, + { + "children": [], + "label": "Horticultural and Landscaping Services", + "mccCode": "0780" + }, + { + "children": [], + "label": "General Contractors—Residential and Commercial", + "mccCode": "1520" + }, + { + "children": [], + "label": "Air Conditioning, Heating, and Plumbing Contractors", + "mccCode": "1711" + }, + { + "children": [], + "label": "Electrical Contractors", + "mccCode": "1731" + }, + { + "children": [], + "label": "Insulation, Masonry, Plastering, Stonework, and Tile Setting", + "mccCode": "1740" + } + ], + "label": "Extended", + "mccCode": "1" + }, + { + "children": [ + { + "children": [], + "label": "Carpentry Contractors", + "mccCode": "1750" + }, + { + "children": [], + "label": "Roofing and Siding, Sheet Metal Work Contractors", + "mccCode": "1761" + }, + { + "children": [], + "label": "Concrete Work Contractors", + "mccCode": "1771" + }, + { + "children": [], + "label": "Contractors, Special Trade—not elsewhere classified", + "mccCode": "1799" + }, + { + "children": [], + "label": "Miscellaneous Publishing and Printing", + "mccCode": "2741" + }, + { + "children": [], + "label": "Typesetting, Plate Making, and Related Services", + "mccCode": "2791" + }, + { + "children": [], + "label": "Sanitation, Polishing, and Specialty Cleaning Preparations", + "mccCode": "2842" + }, + { + "children": [], + "label": "Airlines, Air Carriers", + "mccCode": "3000" + }, + { + "children": [], + "label": "Car Rental Agencies", + "mccCode": "3351" + }, + { + "children": [], + "label": "Lodging—Hotels, Motels, Resorts", + "mccCode": "3501" + }, + { + "children": [], + "label": "Railroads—Freight", + "mccCode": "4011" + }, + { + "children": [], + "label": "Transportation—Suburban and Local Commuter Passenger, including", + "mccCode": "4111" + } + ], + "label": "Contractors", + "mccCode": "2" + }, + { + "children": [ + { + "children": [], + "label": "培训类", + "mccCode": "30001" + }, + { + "children": [], + "label": "移民留学", + "mccCode": "30002" + }, + { + "children": [], + "label": "私人幼儿园", + "mccCode": "30003" + }, + { + "children": [], + "label": "舞厅、舞蹈房和舞蹈学校", + "mccCode": "30004" + } + ], + "label": "教育", + "mccCode": "3" + }, + { + "children": [ + { + "children": [], + "label": "换汇", + "mccCode": "40001" + }, + { + "children": [], + "label": "房产", + "mccCode": "40002" + }, + { + "children": [], + "label": "会计、审计和记账服务", + "mccCode": "40003" + }, + { + "children": [], + "label": "律师,法律服务", + "mccCode": "40004" + }, + { + "children": [], + "label": "租房中介", + "mccCode": "40005" + } + ], + "label": "商务咨询", + "mccCode": "4" + }, + { + "children": [ + { + "children": [], + "label": "公众号服务商", + "mccCode": "50001" + }, + { + "children": [], + "label": "各种媒体类宣传", + "mccCode": "50002" + }, + { + "children": [], + "label": "广告服务", + "mccCode": "50003" + } + ], + "label": "传媒", + "mccCode": "5", + "value": "{\"category\":\"SERVICE\",\"code\":\"7542\",\"description\":\"Car Washes\",\"parentCode\":\"S10\"}" + }, + { + "children": [ + { + "children": [], + "label": "美容院", + "mccCode": "60001" + }, + { + "children": [], + "label": "医疗美容", + "mccCode": "60002" + }, + { + "children": [], + "label": "药店、药房", + "mccCode": "60003" + }, + { + "children": [], + "label": "牙科/实验室/医疗/眼科医院器材和用品", + "mccCode": "60004" + } + ], + "label": "医美", + "mccCode": "6" + }, + { + "children": [ + { + "label": "超市", + "mccCode": "70001" + }, + { + "children": [], + "label": "服装店", + "mccCode": "70002" + }, + { + "children": [], + "label": "鞋店", + "mccCode": "70003" + }, + { + "children": [], + "label": "珠宝店", + "mccCode": "70004" + },{ + "children": [], + "label": "箱包", + "mccCode": "70005" + }, + { + "children": [], + "label": "自动售卖机", + "mccCode": "70006" + }, + { + "children": [], + "label": "文具用品商店、各类办公用品商店", + "mccCode": "70007" + }, + { + "children": [], + "label": "报亭、报摊", + "mccCode": "70008" + }, + { + "children": [], + "label": "花店", + "mccCode": "70009" + }, + { + "children": [], + "label": "宠物商店、宠物食品及用品", + "mccCode": "70010" + }, + { + "children": [], + "label": "各类杂货店、便利店", + "mccCode": "70011" + }, + { + "children": [], + "label": "电子设备商店", + "mccCode": "70012" + }, + { + "children": [], + "label": "礼品、卡片、装饰品、纪念品商店", + "mccCode": "70013" + }, + { + "children": [], + "label": "化妆品商店", + "mccCode": "70014" + }, + { + "children": [], + "label": "免税店", + "mccCode": "70015" + } + ], + "label": "零售", + "mccCode": "7" + }, + { + "children": [ + { + "children": [], + "label": "桌游吧", + "mccCode": "80001" + }, + { + "children": [], + "label": "演唱会", + "mccCode": "80002" + }, + { + "children": [], + "label": "马术训练", + "mccCode": "80003" + }, + { + "children": [], + "label": "瑜伽", + "mccCode": "80004" + }, + { + "children": [], + "label": "健身", + "mccCode": "80005" + }, + { + "children": [], + "label": "社团", + "mccCode": "80006" + }, + { + "children": [], + "label": "网吧", + "mccCode": "80007" + }, + { + "children": [], + "label": "KTV", + "mccCode": "80008" + }, + { + "children": [], + "label": "电影", + "mccCode": "80009" + }, + { + "children": [], + "label": "按摩店", + "mccCode": "80010" + }, + { + "children": [], + "label": "游乐园、马戏团、嘉年华、占卜", + "mccCode": "80011" + }, + { + "children": [], + "label": "大型游戏机和游戏场所", + "mccCode": "80012" + }, + { + "children": [], + "label": "玩具、游戏店", + "mccCode": "80013" + } + ], + "label": "休闲娱乐", + "mccCode": "8" + }, + { + "children": [ + { + "children": [], + "label": "摄影", + "mccCode": "90001" + }, + { + "children": [], + "label": "massage", + "mccCode": "90002" + }, + { + "children": [], + "label": "通讯运营商", + "mccCode": "90003" + }, + { + "children": [], + "label": "车行", + "mccCode": "90004" + }, + { + "children:":[], + "label":"软件服务", + "mccCode":"90005" + }, + { + "children:":[], + "label":"计算机网络/信息服务", + "mccCode":"90006" + }, + { + "children:":[], + "label":"使领馆", + "mccCode":"90007" + }, + { + "children:":[], + "label":"汽车零配件商店", + "mccCode":"90008" + }, + { + "children:":[], + "label":"车体维修店", + "mccCode":"90009" + }, + { + "children:":[], + "label":"电子修理店", + "mccCode":"90010" + } + ], + "label": "其他服务类", + "mccCode": "9" + }, + { + "children": [ + { + "children": [], + "label": "Hotel", + "mccCode": "100001" + }, + { + "children": [], + "label": "Motel", + "mccCode": "100002" + }, + { + "children": [], + "label": "住宿服务(旅馆、酒店、汽车旅馆、度假村等)", + "mccCode": "100003" + } + ], + "label": "酒店", + "mccCode": "10" + }, + { + "children": [ + { + "children": [], + "label": "代购", + "mccCode": "110001" + }, + { + "children": [], + "label": "物流(大宗出口贸易)", + "mccCode": "110002" + }, + { + "children": [], + "label": "红酒出口", + "mccCode": "110003" + }, + { + "children": [], + "label": "综合电商", + "mccCode": "110004" + }, + { + "children": [], + "label": "酒庄", + "mccCode": "110005" + } + ], + "label": "出口贸易", + "mccCode": "11" + }, + { + "children": [ + { + "children": [], + "label": "建材", + "mccCode": "120001" + }, + { + "children": [], + "label": "家居", + "mccCode": "120002" + }, + { + "children": [], + "label": "太阳能板", + "mccCode": "120003" + }, + { + "children": [], + "label": "五金器具店", + "mccCode": "120004" + } + ], + "label": "家居建材", + "mccCode": "12" + } +] diff --git a/src/main/ui/static/images/card_payment_sign.png b/src/main/ui/static/images/card_payment_sign.png new file mode 100644 index 000000000..3baeef8a5 Binary files /dev/null and b/src/main/ui/static/images/card_payment_sign.png differ diff --git a/src/main/ui/static/images/card_payment_sign_lg.png b/src/main/ui/static/images/card_payment_sign_lg.png new file mode 100644 index 000000000..da67e58e2 Binary files /dev/null and b/src/main/ui/static/images/card_payment_sign_lg.png differ diff --git a/src/main/ui/static/images/direct_debit_sign.png b/src/main/ui/static/images/direct_debit_sign.png new file mode 100644 index 000000000..95d6a8169 Binary files /dev/null and b/src/main/ui/static/images/direct_debit_sign.png differ diff --git a/src/main/ui/static/images/direct_debit_sign_lg.png b/src/main/ui/static/images/direct_debit_sign_lg.png new file mode 100644 index 000000000..4ad860101 Binary files /dev/null and b/src/main/ui/static/images/direct_debit_sign_lg.png differ diff --git a/src/main/ui/static/incrementalService/templates/partner_incremental_service_info.html b/src/main/ui/static/incrementalService/templates/partner_incremental_service_info.html index 6ef529447..ff9ee8463 100644 --- a/src/main/ui/static/incrementalService/templates/partner_incremental_service_info.html +++ b/src/main/ui/static/incrementalService/templates/partner_incremental_service_info.html @@ -176,7 +176,11 @@ Yeepay | LakalaPay + ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay | + Card Payment | + Direct Debit

@@ -371,6 +375,8 @@ + + {{trade.order_id}} diff --git a/src/main/ui/static/payment/cashiers/templates/cashiers.html b/src/main/ui/static/payment/cashiers/templates/cashiers.html index 09514bf1f..491ab97e3 100644 --- a/src/main/ui/static/payment/cashiers/templates/cashiers.html +++ b/src/main/ui/static/payment/cashiers/templates/cashiers.html @@ -75,13 +75,13 @@ | - | - Disable - Enable + Disable + Enable diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index fa662776c..d0394b4a5 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -167,6 +167,15 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter return $http.get('/sys/partners/' + $stateParams.clientMoniker + '/file'); }] } + }).state('partners.detail.MW_files', { + url: '/mw_files', + templateUrl: '/static/payment/partner/templates/partner_mw_auth_files.html', + controller: 'partnerMWAuthFileCtrl', + resolve: { + file: ['$http', '$stateParams', function ($http, $stateParams) { + return $http.get('/sys/partners/' + $stateParams.clientMoniker + '/mw_file'); + }] + } }).state('partners.detail.kyc_files', { url: '/kyc_files', templateUrl: '/static/payment/kyc/templates/partner_kyc_files.html', @@ -2487,6 +2496,21 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }) }; + $scope.changeBillCodeVersion = function() { + if (!$scope.paymentInfo) { + return; + } + $http.post('/sys/partners/' + $scope.partner.client_moniker + '/selectBillVersion', {version: $scope.paymentInfo.billcode_version}).then(function () { + $scope.loadPartnerPaymentInfo(); + }, function (resp) { + commonDialog.alert({ + title: 'failed to change require bill version permission status', + content: resp.data.message, + type: 'error' + }) + }) + }; + $scope.extChangeParam = function(name,value){ var flag = true; $scope.convertExtParams.forEach(function (params) { @@ -2643,9 +2667,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } }; - $scope.getBalance(); - $scope.getBankAccount(); $scope.getRates = function () { $http.get('/sys/partners/' + $scope.partner.client_moniker + '/rates').then(function (resp) { @@ -2656,7 +2678,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }) }); }; - $scope.skipClearing = function (skipClearing) { if (!$scope.init.skip_clearing) { $scope.init.skip_clearing = true; @@ -2688,7 +2709,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }) } }; - $scope.surchargeAccountDetail = function () { $uibModal.open({ templateUrl: '/static/payment/surchargeaccount/templates/partner_surcharge_account_dialog.html', @@ -2711,7 +2731,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.getBalance(); }); }; - $scope.allowSurchargeCredit = function (allowSurchargeCredit) { if (!$scope.init.allow_surcharge_credit) { $scope.init.allow_surcharge_credit = true; @@ -2729,7 +2748,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.getBankAccount(); }) }; - $scope.switchPreSettle = function (presettle) { if (!$scope.init.enable_presettle) { $scope.init.enable_presettle = true; @@ -2739,7 +2757,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.getBankAccount(); }) }; - $scope.customerTaxFree = function (customerTaxFree) { if (!$scope.init.customer_tax_free) { $scope.init.customer_tax_free = true; @@ -2791,6 +2808,25 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}) }) }; + $scope.newCardPaymentRates = function () { + $uibModal.open({ + templateUrl: '/static/payment/partner/templates/partner_new_card_payment_rate.html', + controller: 'newCardPaymentRateDialogCtrl', + resolve: { + sys_common_rate: function () { + return $http.get('/sys/partners/sys_card_rates'); + }, + clientMoniker: function () { + return $scope.partner.client_moniker; + }, + cost_rate_channel: function () { + return $scope.cost_rate_channel; + } + } + }).result.then(function () { + $scope.getRates(); + }); + }; $scope.newRate = function () { var name = $scope.bankCtrl.rate_name; $uibModal.open({ @@ -2889,6 +2925,74 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } + }]); + app.controller('newCardPaymentRateDialogCtrl', ['$scope', '$http', 'sys_common_rate', 'clientMoniker', function ($scope, $http, sys_common_rate, clientMoniker) { + $scope.rate = {}; + $scope.card_payment_normal = true; + $scope.card_payment_switch_title = "Direct Debit"; + $scope.card_payment = [ + { + type: "rpaypmt_card", + title: "Card Payment" + }, { + type: "rpaypmt_dd", + title: "Direct Debit" + }]; + $scope.cardRateConfig = $scope.card_payment[0]; + $scope.switchCardRateConfig = function () { + $scope.card_payment_normal = !$scope.card_payment_normal; + $scope.rate = {}; + if ($scope.card_payment_normal) { + $scope.cardRateConfig = $scope.card_payment[0]; + $scope.card_payment_switch_title = "Direct Debit"; + }else { + $scope.cardRateConfig = $scope.card_payment[1]; + $scope.card_payment_switch_title = "Card Payment"; + } + }; + $scope.sysRateConfig = angular.copy(sys_common_rate.data); + $scope.ctrl = {sending: false}; + $scope.saveRate = function (form) { + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true; + } + }); + return; + } + $scope.errmsg = null; + $scope.ctrl.sending = true; + $scope.rate.type = $scope.cardRateConfig.type; + $http.post('/sys/partners/' + clientMoniker + '/rates', $scope.rate).then(function () { + $scope.ctrl.sending = false; + $scope.$close(); + }, function (resp) { + $scope.ctrl.sending = false; + $scope.errmsg = resp.data.message; + }) + } + $scope.changeDays = function () { + if ($scope.rate.clean_days && $scope.card_payment_normal) { + switch ($scope.rate.clean_days) { + case '1': { + $scope.rate.rate_value = parseFloat($scope.sysRateConfig.t1.domestic_rate); + $scope.rate.transaction_fee = parseFloat($scope.sysRateConfig.t1.transaction_fee); + break; + } + case '2': { + $scope.rate.rate_value = parseFloat($scope.sysRateConfig.t2.domestic_rate); + $scope.rate.transaction_fee = parseFloat($scope.sysRateConfig.t2.transaction_fee); + break; + } + case '3': { + $scope.rate.rate_value = parseFloat($scope.sysRateConfig.t3.domestic_rate); + $scope.rate.transaction_fee = parseFloat($scope.sysRateConfig.t3.transaction_fee); + break; + } + } + } + }; }]); app.controller('newRateDialogCtrl', ['$scope', '$http', 'rate', 'sys_common_rate', 'clientMoniker', function ($scope, $http, rate, sys_common_rate, clientMoniker) { $scope.rate = angular.copy(rate); @@ -4283,6 +4387,253 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }]); + app.controller('partnerMWAuthFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', 'Upload', 'file', function ($scope, $http, $rootScope, commonDialog, $state, Upload, file) { + $scope.id_info_form = {edit: false}; + $scope.file = file.data || {}; + $scope.file.upay_risk_level = $scope.partner.upay_risk_level; + $scope.file.upay_risk_remark = $scope.partner.upay_risk_remark; + $scope.uploadApplyFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + } else { + $scope.bankFileProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.bankFileProgress; + $scope.file.upay_application_form = resp.data.url; + $scope.updateFile(); + if ($scope.file.upay_application_form.endsWith('pdf')) { + $scope.bankIsImage = false; + } else { + $scope.bankIsImage = true; + } + }, function (resp) { + delete $scope.bankFileProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.bankFileProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + $scope.agreeIsImage = true; + if ($scope.file.file_agreement_info && $scope.file.file_agreement_info.endsWith('pdf')) { + $scope.agreeIsImage = false; + } + $scope.bankIsImage = true; + if ($scope.file.upay_application_form && $scope.file.upay_application_form.endsWith('pdf')) { + $scope.bankIsImage = false; + } + $scope.companyIsImage = true; + if ($scope.file.file_company_info && $scope.file.file_company_info.endsWith('pdf')) { + $scope.companyIsImage = false; + } + $scope.applyIsImage = true; + if ($scope.file.file_apply_info && $scope.file.file_apply_info.endsWith('pdf')) { + $scope.applyIsImage = false; + } + $scope.idIsImage = true; + if ($scope.file.file_id_info && $scope.file.file_id_info.endsWith('pdf')) { + $scope.idIsImage = false; + } + + $scope.uploadAgreementFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + } else { + $scope.companyFileProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.companyFileProgress; + $scope.file.upay_agreement_file = resp.data.url; + $scope.updateFile(); + if ($scope.file.upay_agreement_file.endsWith('pdf')) { + $scope.companyIsImage = false; + } else { + $scope.companyIsImage = true; + } + }, function (resp) { + delete $scope.companyFileProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.companyFileProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + $scope.uploadOfferFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + } else { + $scope.idFileProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.idFileProgress; + $scope.file.upay_offer_letter = resp.data.url; + $scope.updateFile(); + if ($scope.file.upay_offer_letter.endsWith('pdf')) { + $scope.idIsImage = false; + } else { + $scope.idIsImage = true; + } + }, function (resp) { + delete $scope.idFileProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.idFileProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + $scope.uploadDriverFile = function (file) { + if (file != null) { + if (file.size > 10 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过10MB,请压缩后重试', type: 'error'}) + } else { + $scope.agreementFileProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.agreementFileProgress; + $scope.file.upay_driver_license = resp.data.url; + $scope.updateFile(); + if ($scope.file.upay_driver_license.endsWith('pdf')) { + $scope.agreeIsImage = false; + } else { + $scope.agreeIsImage = true; + } + }, function (resp) { + delete $scope.agreementFileProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.agreementFileProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + $scope.uploadResidenceFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + } else { + $scope.applyFileProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.applyFileProgress; + $scope.file.upay_residence_certificate = resp.data.url; + $scope.updateFile(); + if ($scope.file.upay_residence_certificate.endsWith('pdf')) { + $scope.applyIsImage = false; + } else { + $scope.applyIsImage = true; + } + }, function (resp) { + delete $scope.applyFileProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.applyFileProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + + } + } + }; + $scope.saveIdInfo = function () { + if (!$scope.file.upay_risk_level) { + commonDialog.alert({title: 'Error', content: '请选择商户风险等级', type: 'error'}); + return; + } + var config = {}; + config.upay_risk_level = $scope.file.upay_risk_level; + config.upay_risk_remark = $scope.file.upay_risk_remark; + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/mw_risk_info', config).then(function (resp) { + commonDialog.alert({title: 'Success', content: 'Risk Info Updated', type: 'success'}) + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}) + $state.reload(); + }); + }; + + $scope.cancelIdInfo = function () { + $state.reload(); + $scope.id_info_form.edit=false + }; + + $scope.downloadAsZip = function () { + var url = '/sys/partners/' + $scope.partner.client_moniker + '/download/MWcomplianceAsZIP'; + return url; + }; + + + $scope.deleteComplianceFiles = function (file_id) { + commonDialog.confirm({ + title: 'Warning', + content: 'This operation will delete the file, Are you sure?' + }).then(function () { + $http.put('/sys/partners/auth_file/' + file_id + '/delete').then(function (resp) { + commonDialog.alert({ + title: 'Success', + content: 'Delete Successful', + type: 'success' + }); + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }) + }; + + + $scope.updateFile = function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/mw_file', $scope.file).then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Upload Successful', + type: 'success' + }); + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + } + + function commitError() { + commonDialog.alert({ + title: 'Error', + content: 'Missing file', + type: 'error' + }); + }; + $scope.complianceCheck = function () { + if (!$rootScope.complianceCheck) { + $rootScope.complianceCheck = {}; + } + $rootScope.complianceCheck.client_id = $scope.partner.client_id; + $rootScope.complianceCheck.authFile = true; + }; + $scope.complianceChangeCheck = function () { + if ($rootScope.complianceCheck) { + if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) { + delete $rootScope.complianceCheck; + } + } + }; + $scope.complianceChangeCheck(); + + }]); + app.controller('partnerKycFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', 'Upload', 'file', function ($scope, $http, $rootScope, commonDialog, $state, Upload, file) { $scope.file = file.data || {}; @@ -4810,17 +5161,25 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } } }]); - app.controller('subMerchantIdApplicaitonsCtrl', ['$scope', '$http', '$uibModal', '$state', 'commonDialog', function ($scope, $http, $uibModal, $state, commonDialog) { + app.controller('subMerchantIdApplicaitonsCtrl', ['$scope', '$http', '$uibModal', '$state', 'commonDialog', '$sce', function ($scope, $http, $uibModal, $state, commonDialog, $sce) { + $scope.showMoreMerchantInfo = false; + + $scope.hideMerchantInfo = function () { + $scope.showMoreMerchantInfo = !$scope.showMoreMerchantInfo; + }; $scope.loadSubMerchantInfos = function () { $http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_sub_applices', {params: {}}).then(function (resp) { $scope.subMerchantInfos = resp.data; }); - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_rpay_sub_applices', {params: {}}).then(function (resp) { - $scope.subRpayMerchantInfos = resp.data; - }); - - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_yeepay_sub_applices', {params: {}}).then(function (resp) { - $scope.subYeepayMerchantInfos = resp.data; + // $http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_rpay_sub_applices', {params: {}}).then(function (resp) { + // $scope.subRpayMerchantInfos = resp.data; + // }); + // + // $http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_yeepay_sub_applices', {params: {}}).then(function (resp) { + // $scope.subYeepayMerchantInfos = resp.data; + // }); + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/queryMWMerchantIdStatus').then(function (resp) { + $scope.partner.cardInfo = resp.data; }); }; $scope.useSubMerchantId = function (sub_merchant_id) { @@ -4875,6 +5234,26 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.loadSubMerchantInfos(); }) }; + $scope.applyMWSubMerchantId = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/mw_info').then(function (resp) { + commonDialog.confirm({ + title: 'Apply Merchant Warrior Sub Merchant Id', + contentHtml: $sce.trustAsHtml('Are you sure to apply merchant Warrior sub merchant id for [' + $scope.partner.company_name + ']?'), + json: resp.data + }).then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/applyMWMerchantId').then(function (res) { + commonDialog.alert({ + title: 'Success', + content: 'Apply Merchant Warrior Sub Merchant ID successfully', + type: 'success' + }); + $scope.partner.cardInfo = res.data; + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }) + }); + }; $scope.applyRpaySubMerchantId = function () { $uibModal.open({ templateUrl: '/static/payment/partner/templates/apply_rpay_sub_merchant_id.html', diff --git a/src/main/ui/static/payment/partner/templates/client_bankaccounts.html b/src/main/ui/static/payment/partner/templates/client_bankaccounts.html index f9864685b..2306f054f 100644 --- a/src/main/ui/static/payment/partner/templates/client_bankaccounts.html +++ b/src/main/ui/static/payment/partner/templates/client_bankaccounts.html @@ -108,26 +108,38 @@
  • CB BankPay
  • +
  • + Card Payment +
  • +
  • + Direct Debit +
  • - + + + + - + - + + + + - + diff --git a/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html b/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html index 8a88b7b27..81a134cc8 100644 --- a/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html +++ b/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html @@ -212,17 +212,24 @@
  • Rpay+
  • CB_BankPay
  • +
  • Card Payment
  • +
  • Direct Debit
  • +
    Rate NameRate ValueRate ValueDomestic Rate ValueInternational Rate ValueTransaction Fee Active Time Expire TimeClean DaysClean Days Remark
    T+{{rate.clean_days}}T+{{rate.clean_days}}
    - + + + - + @@ -233,11 +240,13 @@ - + + + - + diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index 934bdd78c..220dc763a 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -277,6 +277,9 @@
  • Compliance Files
  • +
  • + Merchant Warrior Compliance Files +
  • diff --git a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html new file mode 100644 index 000000000..079916613 --- /dev/null +++ b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html @@ -0,0 +1,194 @@ + +
    +
    Audit Files     + + 一键下载 + +
    +
    +
    +
    +

    + Merchant Warrior商户风险评级 + + +

    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + 低风险 + 中风险 + 高风险 +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + + + +
    + +
    Rate NameRate ValueRate ValueDomestic Rate ValueInternational Rate Value Transaction Fee Active Time Expire TimeClean DaysClean Days Update Time Operator Remark
    T+{{rate.clean_days}}T+{{rate.clean_days}}
    + + + + + +
    + + +
    +
    + + +
    + +
    +
    + + + +
    + + + + + + +
    + + +
    +
    +
    + +
    + +
    +
    + + + +
    + + + + + +
    + + +
    +
    +
    + +
    +
    + +
    +
    + + + +
    + + + + + + +
    + + +
    +
    +
    +
    + +
    +
    + +
    +
    + + + +
    + + + + + + +
    + + +
    +
    +
    +
    + + + diff --git a/src/main/ui/static/payment/partner/templates/partner_new_card_payment_rate.html b/src/main/ui/static/payment/partner/templates/partner_new_card_payment_rate.html new file mode 100644 index 000000000..18f5807c8 --- /dev/null +++ b/src/main/ui/static/payment/partner/templates/partner_new_card_payment_rate.html @@ -0,0 +1,147 @@ + + + diff --git a/src/main/ui/static/payment/partner/templates/partner_pay_logs.html b/src/main/ui/static/payment/partner/templates/partner_pay_logs.html index eddcdbc13..70dd618a8 100644 --- a/src/main/ui/static/payment/partner/templates/partner_pay_logs.html +++ b/src/main/ui/static/payment/partner/templates/partner_pay_logs.html @@ -154,7 +154,11 @@ Yeepay | LakalaPay + ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay | + Card Payment | + Direct Debit

    @@ -357,6 +361,8 @@ + + diff --git a/src/main/ui/static/payment/partner/templates/partner_payment_info.html b/src/main/ui/static/payment/partner/templates/partner_payment_info.html index c42607419..80df579ba 100644 --- a/src/main/ui/static/payment/partner/templates/partner_payment_info.html +++ b/src/main/ui/static/payment/partner/templates/partner_payment_info.html @@ -242,6 +242,19 @@ +
    + +
    + +
    +
    +
    + +
    + +
    +
    + @@ -591,6 +604,16 @@ switch-change="toggleRequireRemark()"> +
    + +
    + +
    +
    diff --git a/src/main/ui/static/payment/partner/templates/rate_config_dialog.html b/src/main/ui/static/payment/partner/templates/rate_config_dialog.html index d95950528..5c916e182 100644 --- a/src/main/ui/static/payment/partner/templates/rate_config_dialog.html +++ b/src/main/ui/static/payment/partner/templates/rate_config_dialog.html @@ -14,7 +14,9 @@
    - +
    %
    - - -
    No less than 0.6%
    @@ -35,6 +34,29 @@
    +
    + +
    +
    + +
    %
    +
    +
    +
    + No more than 5.0% +
    +
    + No less than 0.0% +
    +
    + Required Field +
    +
    + +
    +
    @@ -46,9 +68,6 @@
    $
    - - -
    No less than 0
    @@ -78,7 +97,9 @@ datepicker-options="{minDate:rate.active_time}">
    -
    +
    @@ -100,4 +121,4 @@ \ No newline at end of file +
    diff --git a/src/main/ui/static/payment/partner/templates/sub_merchant_id_apply.html b/src/main/ui/static/payment/partner/templates/sub_merchant_id_apply.html index 08c50f821..8fee5858c 100644 --- a/src/main/ui/static/payment/partner/templates/sub_merchant_id_apply.html +++ b/src/main/ui/static/payment/partner/templates/sub_merchant_id_apply.html @@ -95,53 +95,100 @@
    -

    - Rpay+ Sub Merchant Id : {{partner.rpay_enterprise_id}} - +

    + Merchant Warrior Sub Merchant Id : + + 审核通过 + 审核中 + 打回 + ({{partner.cardInfo.rpMerchantId}}) + 未申请

    -
    -
    -
    -
    -

    List of Sub Merchant Id

    -
    -
    -
      -
    • - Sub Merchant Id - (当前使用){{id_apply.sub_merchant_id}} -
    • -
    • - Apply Time - -
    • -
    • - Company Short Name - {{id_apply.merchant_shortname | cut:true:20:' ...'}} -
    • -
    • - Business Category - {{id_apply.business_category | partner_royalpay_industry}} -
    • -
    • - Operator - -
    • -
    -
    -
    - -
    +
    +
    +
      +
    • + Sub Merchant Id + + {{partner.cardInfo.rpMerchantId}} +
    • +
    • + Name + +
    • +
    • + Company Name + {{partner.cardInfo.company_name}} +
    • +
    • + Address + {{partner.cardInfo.address}} +
    • +
    • + Suburb + {{partner.cardInfo.suburb}} +
    • +
    • + Postcode + +
    • +
    • + More..... +
    • +
    • + State + +
    • +
    • + Abn + +
    • +
    • + Email + +
    • +
    • + Contact Name + +
    • +
    • + Phone + +
    • +
    • + BSB + +
    • +
    • + Account No + +
    • +
    • + Account Name + +
    • +
    • + Website + +
    • +
    • + Timezone + +
    • +
    • + Category + +
    • +
    • + Hide..... +
    • +
    @@ -150,72 +197,135 @@
    -
    -
    -
    -
    -
    -
    -

    - Yeepay Sub Merchant Id : {{partner.yeepay_sub_merchant_id}} -

    - - -
    -
    -
    -
    -

    List of Sub Merchant Id

    -
    -
    -
      -
    • - Sub Merchant Id - (当前使用){{id_apply.sub_merchant_id}} -
    • -
    • - Apply Time - -
    • -
    • - Business Content - {{id_apply.business_content | yeepayBusinessContent}} -
    • -
    • - Business Category - {{id_apply.industry | yeepayIndustry}} -
    • -
    • - Operator - -
    • -
    -
    -
    - - -
    -
    -
    -
    -
    -
    -
    -
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/src/main/ui/static/payment/tradelog/templates/balance_report.html b/src/main/ui/static/payment/tradelog/templates/balance_report.html index 0cb9a5e59..aa142c3cd 100644 --- a/src/main/ui/static/payment/tradelog/templates/balance_report.html +++ b/src/main/ui/static/payment/tradelog/templates/balance_report.html @@ -165,7 +165,11 @@ Yeepay | LakalaPay + ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay | + Card Payment | + Direct Debit

    @@ -537,6 +541,10 @@ uib-tooltip="Yeepay" ng-if="trade.channel=='Yeepay'"/> + + {{trade.order_id2}} diff --git a/src/main/ui/static/payment/tradelog/templates/incremental_trade_logs.html b/src/main/ui/static/payment/tradelog/templates/incremental_trade_logs.html index 369be61a6..3c31dcade 100644 --- a/src/main/ui/static/payment/tradelog/templates/incremental_trade_logs.html +++ b/src/main/ui/static/payment/tradelog/templates/incremental_trade_logs.html @@ -166,7 +166,11 @@ Yeepay | LakalaPay + ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay | + Card Payment | + Direct Debit

    @@ -384,6 +388,10 @@ uib-tooltip="Yeepay" ng-if="trade.channel=='Yeepay'"/> + + {{trade.order_id}} diff --git a/src/main/ui/static/payment/tradelog/templates/partner_incremental_trade_logs.html b/src/main/ui/static/payment/tradelog/templates/partner_incremental_trade_logs.html index 8d8e063e0..4a78f5a94 100644 --- a/src/main/ui/static/payment/tradelog/templates/partner_incremental_trade_logs.html +++ b/src/main/ui/static/payment/tradelog/templates/partner_incremental_trade_logs.html @@ -146,7 +146,11 @@ Yeepay | LakalaPay + ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay | + Card Payment | + Direct Debit

    @@ -341,6 +345,8 @@ + + {{trade.order_id}} diff --git a/src/main/ui/static/payment/tradelog/templates/partner_trade_detail_edit.html b/src/main/ui/static/payment/tradelog/templates/partner_trade_detail_edit.html index d91c3e058..16d03d7ba 100644 --- a/src/main/ui/static/payment/tradelog/templates/partner_trade_detail_edit.html +++ b/src/main/ui/static/payment/tradelog/templates/partner_trade_detail_edit.html @@ -1,3 +1,11 @@ + + @@ -140,6 +148,19 @@ +
    +
    +

    +
    +
    +

    {{order.card_bank}}

    +

    {{order.card_type}}

    +

    {{order.card_alias}}

    +

    {{order.card_scheme}}

    +

    {{order.card_country}}

    +
    +
    + @@ -191,4 +212,4 @@ - \ No newline at end of file + diff --git a/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html b/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html index 7b5a7d028..b715730be 100644 --- a/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html +++ b/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html @@ -219,7 +219,11 @@ Yeepay | LakalaPay + ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay | + Card Payment | + Direct Debit

    @@ -641,6 +645,10 @@ ng-if="trade.channel=='Yeepay'"/> + + {{trade.order_id}} diff --git a/src/main/ui/static/payment/tradelog/templates/trade_logs.html b/src/main/ui/static/payment/tradelog/templates/trade_logs.html index e22dea465..714798fa0 100644 --- a/src/main/ui/static/payment/tradelog/templates/trade_logs.html +++ b/src/main/ui/static/payment/tradelog/templates/trade_logs.html @@ -203,7 +203,11 @@ Yeepay | LakalaPay + ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay | + Card Payment | + Direct Debit

    @@ -486,6 +490,10 @@ uib-tooltip="Yeepay" ng-if="trade.channel=='Yeepay'"/> + + {{trade.order_id}} diff --git a/src/main/ui/static/templates/billCode/css/billCode_mobile.css b/src/main/ui/static/templates/billCode/css/billCode_mobile.css new file mode 100644 index 000000000..5a8457836 --- /dev/null +++ b/src/main/ui/static/templates/billCode/css/billCode_mobile.css @@ -0,0 +1,47 @@ +.commit-button{ + width: 100%; + border-radius: 25px; + background-color: #ED2424; + color: #FFFFFF; + font-size: 16px; + line-height: 40px; + border: 0px; + margin-top: 20px; +} + +label{ + color: #9B9B9B; + margin-bottom: 0px; +} + +.bill-info-right{ + float: right; +} + +.margin-body{ + margin: 15px +} + +.row-line-height{ + height: 20px; + margin: 15px 0px 15px -15px; +} + +.row-line-height-plus{ + height: 60px; + line-height: 60px; +} + +.border-top-line{ + border-top: 1px solid #EEEEEE +} + +.border-button-line{ + border-bottom: 1px solid #EEEEEE; + +} + +#timer{ + font-weight: 600; + color: #ED2424; +} \ No newline at end of file diff --git a/src/main/ui/static/templates/billCode/css/billCode_pc.css b/src/main/ui/static/templates/billCode/css/billCode_pc.css new file mode 100644 index 000000000..c60ee8d0e --- /dev/null +++ b/src/main/ui/static/templates/billCode/css/billCode_pc.css @@ -0,0 +1,129 @@ +body{ + padding: 3% 10%; + width: 100%; + height: 100%; + margin: 0; +} + +.head{ + padding-bottom: 20px; + border-bottom: 2px solid #DCDCDC; +} + +.pc-cash{ + font-size: 28px; + position: absolute; + margin: 15px; +} + +.order-box{ + text-align: center; +} + +.count-down{ + text-align: center; + font-size: 20px; + margin: 20px; + line-height: 97px; + background-color: #FEF4F4; +} + +label{ + color: #ED2424; + font-size: 20px; + margin-bottom: 0px; +} + +.bill-info-right{ + float: right; + font-size: 20px; + font-weight: 800; +} + +.margin-body{ + margin: 15px +} + +.row-line-height{ + height: 20px; + margin: 15px 0px 15px -15px; +} + +.row-line-height-plus{ + height: 60px; + line-height: 60px; +} + +.border-top-line{ + border-top: 1px solid #EEEEEE +} + +.border-button-line{ + border-bottom: 1px solid #EEEEEE; + padding: 20px 5px; +} + +#timer{ + font-weight: 600; + color: #ED2424; +} + +.info-body{ + background-color: #FEF4F4; + height: 650px; + margin-top: 20px; + border-radius: 10px 10px 0px 0px; +} +.info-body-title{ + background: #ED2424; + line-height: 50px; + font-size: 25px; + color: #FFF; + border-radius: 10px 10px 0px 0px; +} + +.pay-fun{ + font-family: PingFang-SC-Bold; + font-size: 20px; + color: #ED2424; + font-weight: 600; + margin: 50px; +} + +#commit-btn{ + width: 30%; + border-radius: 5px; + background-color: #ED2424; + color: #FFFFFF; + font-size: 16px; + line-height: 40px; + border: 0px; + margin: 100px 0px; + text-align: center; +} + +.select-pay-fun{ + text-align: center; + width: 80%; + height: 120% ; + border: 1px solid #ED2424; + padding: 10px 0px; + margin-top: 5px; +} + +.no-select-pay-fun{ + text-align: center; + width: 80%; + height: 120% ; + border: 1px solid #EAEAEA; + padding: 10px 0px; + margin: 5px 0px 5px 0px; +} + +#qrImg{ + margin-top: 40px; +} + +.img-size{ + height: 58px; +} \ No newline at end of file diff --git a/src/main/ui/static/templates/billCode/img/bill_alipay.png b/src/main/ui/static/templates/billCode/img/bill_alipay.png new file mode 100644 index 000000000..66153aadc Binary files /dev/null and b/src/main/ui/static/templates/billCode/img/bill_alipay.png differ diff --git a/src/main/ui/static/templates/billCode/img/bill_big_alipay.png b/src/main/ui/static/templates/billCode/img/bill_big_alipay.png new file mode 100644 index 000000000..42047f40e Binary files /dev/null and b/src/main/ui/static/templates/billCode/img/bill_big_alipay.png differ diff --git a/src/main/ui/static/templates/billCode/img/bill_big_cb_bank.png b/src/main/ui/static/templates/billCode/img/bill_big_cb_bank.png new file mode 100644 index 000000000..f674191a6 Binary files /dev/null and b/src/main/ui/static/templates/billCode/img/bill_big_cb_bank.png differ diff --git a/src/main/ui/static/templates/billCode/img/bill_big_wechat.png b/src/main/ui/static/templates/billCode/img/bill_big_wechat.png new file mode 100644 index 000000000..a8b98a302 Binary files /dev/null and b/src/main/ui/static/templates/billCode/img/bill_big_wechat.png differ diff --git a/src/main/ui/static/templates/billCode/img/bill_cb_bank.png b/src/main/ui/static/templates/billCode/img/bill_cb_bank.png new file mode 100644 index 000000000..27a35be0b Binary files /dev/null and b/src/main/ui/static/templates/billCode/img/bill_cb_bank.png differ diff --git a/src/main/ui/static/templates/billCode/img/bill_select.png b/src/main/ui/static/templates/billCode/img/bill_select.png new file mode 100644 index 000000000..ab6822321 Binary files /dev/null and b/src/main/ui/static/templates/billCode/img/bill_select.png differ diff --git a/src/main/ui/static/templates/billCode/img/bill_wechat.png b/src/main/ui/static/templates/billCode/img/bill_wechat.png new file mode 100644 index 000000000..0f1e04f18 Binary files /dev/null and b/src/main/ui/static/templates/billCode/img/bill_wechat.png differ diff --git a/src/main/ui/static/templates/billCode/img/create_success.png b/src/main/ui/static/templates/billCode/img/create_success.png new file mode 100644 index 000000000..210bdc3f7 Binary files /dev/null and b/src/main/ui/static/templates/billCode/img/create_success.png differ diff --git a/src/main/ui/static/templates/billCode/img/logo.png b/src/main/ui/static/templates/billCode/img/logo.png new file mode 100644 index 000000000..47ef054cd --- /dev/null +++ b/src/main/ui/static/templates/billCode/img/logo.png @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/ui/static/templates/billCode/js/mobile_payment.js b/src/main/ui/static/templates/billCode/js/mobile_payment.js new file mode 100644 index 000000000..7a61910a8 --- /dev/null +++ b/src/main/ui/static/templates/billCode/js/mobile_payment.js @@ -0,0 +1,252 @@ +/** + * Created by dulingling on 2020-03-25. + */ +$(document).ready(function () { + var paymentFun = ''; + var selectPaymentHTML = " "; + var maxtime = window.maxtime; + var hasPayment =true;//可支付 + + if(window.openmobilefun == 'wechat'|| window.openmobilefun == 'other'){ + paymentFun = 'Wechat' + }else{ + paymentFun = 'Alipay' + $(".select_wechat").empty(); + $(".select_alipay").append(selectPaymentHTML); + $(".select_bank").empty(); + } + + setInterval(function(){ + if(maxtime>0){ + var countdown=document.getElementById("timer"); + maxtime=maxtime-1; + var minute=parseInt(maxtime/60); + var second=parseInt(maxtime%60); + countdown.innerHTML=minute+'分'+second+'秒'; + }else{ + $('#commit-btn').css({"background-color":"#eee",}); + hasPayment = false; + } + },1000); + + + $("#select_wechat").click(function(){ + if(paymentFun != 'Wechat'){ + paymentFun = 'Wechat' + $(".select_wechat").append(selectPaymentHTML); + $(".select_alipay").empty(); + $(".select_bank").empty(); + } + }) + $("#select_alipay").click(function(){ + if(paymentFun != 'Alipay'){ + paymentFun = 'Alipay' + $(".select_wechat").empty(); + $(".select_alipay").append(selectPaymentHTML); + $(".select_bank").empty(); + } + }) + $("#select_bank").click(function(){ + if(paymentFun != 'Bank'){ + paymentFun = 'Bank' + $(".select_wechat").empty(); + $(".select_alipay").empty(); + $(".select_bank").append(selectPaymentHTML); + } + }) + + $("#commit-btn").click(function () { + if(hasPayment){ + if(window.openmobilefun != 'other'){ + appPayment() + } + } + }) + + function appPayment(){ + var payUrl = getShareLink(); + $("#commit-btn").css({"background-color":"#eee",}); + $("#commit-btn").val("订单创建中..."); + hasPayment = false; + $.ajax({ + url: payUrl, + method: 'get', + contentType: 'application/json', + dataType: 'json', + success: function (res) { + if(paymentFun == 'Wechat'){ + if( window.openmobilefun == 'wechat'){ + invokePay(res.order_id,res.jsapi); + }else{ + redirectH5Payment(res.partner_order_id,res.client_moniker) + } + } + if(paymentFun == 'Alipay'){ + if(window.openmobilefun == 'alipay'){ + callPayment(res); + }else{ + redirectH5Payment(res.partner_order_id,res.client_moniker) + } + } + if(paymentFun == 'Bank'){ + cbbankPayment(res); + } + }, + error: function (jqXHR) { + alert(jqXHR.responseJSON.message); + $("#commit-btn").css({"background-color":"#ED2424",}); + $("#commit-btn").val("支付"); + if(maxtime>0){ + hasPayment = true; + }else{ + hasPayment = false; + } + } + }) + } + + function redirectH5Payment(orderId,clientMoniker){ + window.location.href='/api/v1.0/share_code/business/bills/'+clientMoniker+'/orders/'+orderId+'/pay'; + } + + function getShareLink(){ + var paymentLink = '' + if(window.sharetype != 'app'){ + //PC端扫码访问 + if(paymentFun == 'Wechat'){ + if(window.openmobilefun == 'wechat'){ + paymentLink = '/api/v1.0/share_code/business/bills/'+window.billInfo.bill_code_id+'/wechat/mobile'; + }else{ + paymentLink = '/api/v1.0/share_code/business/bills/'+window.billInfo.bill_code_id+'/alipay/mobile/redirectApp?priorityChannel=Wechat'; + } + } + if(paymentFun == 'Alipay'){ + if(window.openmobilefun == 'alipay'){ + paymentLink = '/api/v1.0/share_code/business/bills/'+window.billInfo.bill_code_id+'/alipay/mobile'; + }else{ + paymentLink = '/api/v1.0/share_code/business/bills/'+window.billInfo.bill_code_id+'/alipay/mobile/redirectApp?priorityChannel=Alipay'; + } + } + if(paymentFun == 'Bank'){ + paymentLink = '/api/v1.0/share_code/business/bills/'+window.billInfo.bill_code_id+'/cbbank/mobile?partner_moniker='+window.clientmoniker; + } + }else{ + //app扫码访问 + if(paymentFun == 'Wechat'){ + if(window.openmobilefun == 'wechat'){ + paymentLink = '/api/v1.0/share_code/bills/payment/orders/'+window.billInfo.bill_code_id+'/wechat/share_link'; + }else{ + paymentLink = '/api/v1.0/share_code/bills/payment/'+window.billInfo.bill_code_id+'/alipay/mobile/redirectApp?priorityChannel=Wechat'; + } + } + if(paymentFun == 'Alipay'){ + if(window.openmobilefun == 'alipay'){ + paymentLink = '/api/v1.0/share_code/bills/payment/orders/'+window.billInfo.bill_code_id+'/alipay/share_link' + }else{ + paymentLink = '/api/v1.0/share_code/bills/payment/'+window.billInfo.bill_code_id+'/alipay/mobile/redirectApp?priorityChannel=Alipay'; + + } + } + if(paymentFun == 'Bank'){ + paymentLink = '/api/v1.0/share_code/bills/payment/orders/'+window.billInfo.bill_code_id+'/cbbank/share_link?partner_moniker='+window.clientmoniker; + } + } + return paymentLink; + } + + //微信支付方式 + function invokePay(orderId,paydata) { + WeixinJSBridge.invoke('getBrandWCPayRequest', { + 'appId': paydata.appId, + 'timeStamp': paydata.timeStamp, + 'nonceStr': paydata.nonceStr, + 'package': paydata.package, + 'signType': paydata.signType, + 'paySign': paydata.paySign + }, function (res) { + var redirect = "/api/payment/v1.0/wechat_jsapi_payment/partners/" + window.clientmoniker + "/orders/" + orderId+"?"; + if (res.err_msg == 'get_brand_wcpay_request:ok') { + startCheckOrder(orderId,redirect + (redirect.indexOf('?') < 0 ? '?' : '&') + 'success=true') + } else { + if (res.err_msg == 'get_brand_wcpay_request:cancel') { + hasPayment = true; + $("#commit-btn").css({"background-color":"#ED2424",}); + $("#commit-btn").val("支付"); + } + if( res.err_msg == 'get_brand_wcpay_request:fail'){ + hasPayment = true; + $("#commit-btn").css({"background-color":"#ED2424",}); + $("#commit-btn").val("支付"); + location.href = redirect + (redirect.indexOf('?') < 0 ? '?' : '&') + 'success=false'; + } + } + }) + } + + //支付宝支付方式 + function callPayment(paydata) { + try { + if(typeof paydata.trade_no == 'undefined'){ + window.location.href = paydata.mweb_url + }else { + AlipayJSBridge.call('tradePay', { + tradeNO: paydata.trade_no + }, function (res) { + if (res.resultCode == '9000') { + AlipayJSBridge.call('startApp', { + appId: '20000056', + param: { + actionType: 'showSuccPage', + payResult: res.result + }, + closeCurrentApp: false + }); + startCheckOrder(paydata.order_id, '/api/v1.0/alipay_direct/partners/' + window.clientmoniker + '/orders/' + paydata.order_id + '/result'); + } else { + hasPayment = true; + $("#commit-btn").css({"background-color": "#ED2424",}); + $("#commit-btn").val("支付"); + } + }) + } + } catch (err) { + alert(err); + $('#wdiv').hide(); + } + } + + //银联支付方式 + function cbbankPayment(res){ + if('SUCCESS' !== res.return_code && typeof res.return_code !== 'undefined'){ + $("#commit-btn").css({"background-color":"#ED2424",}); + if(maxtime>0){ + hasPayment = true; + }else{ + hasPayment = false; + } + }else { + location.href = res.pay_url; + } + } + + //调用查询订单状态方法 + function startCheckOrder(orderId, url) { + function checkOrderStd() { + $.ajax({ + url: '/api/v1.0/payment/orders/' + orderId + '/status', + method: 'GET', + dataType: 'json', + success: function (res) { + if (res.paid) { + location.href = url; + } else { + setTimeout(checkOrderStd, 500); + } + } + }) + } + + checkOrderStd(); + } + +}); \ No newline at end of file diff --git a/src/main/ui/static/templates/billCode/js/pc_payment.js b/src/main/ui/static/templates/billCode/js/pc_payment.js new file mode 100644 index 000000000..e69cdfa9f --- /dev/null +++ b/src/main/ui/static/templates/billCode/js/pc_payment.js @@ -0,0 +1,159 @@ +/** + * Created by dulingling on 2020-03-25. + */ +$(document).ready(function () { + var paymentFun = 'Wechat'; + var maxtime = window.maxtime; + var hasPayment =true;//可支付 + + if(document.documentElement.clientWidth<500){ + $('.img-size').css({"height":"28px",}) + } + + if(window.clientInfo.enable_wechat){ + var paymentFun = 'Wechat'; + showQRcode(); + }else if(window.clientInfo.enable_alipay){ + var paymentFun = 'Alipay'; + showQRcode(); + }else if(window.clientInfo.enable_cb_bankpay){ + var paymentFun = 'Bank'; + showQRcode(); + } + + startCheckOrder(); + + setInterval(function(){ + if(maxtime>0){ + var countdown=document.getElementById("timer"); + maxtime=maxtime-1; + var minute=parseInt(maxtime/60); + var second=parseInt(maxtime%60); + countdown.innerHTML=minute+'分'+second+'秒'; + }else{ + hasPayment = false; + $('#qrImg').empty(); + } + },1000); + + + $("#select_wechat").click(function(){ + if(paymentFun != 'Wechat'){ + paymentFun = 'Wechat' + $("#select_wechat").removeClass("no-select-pay-fun").addClass("select-pay-fun"); + $("#select_alipay").removeClass("select-pay-fun").addClass("no-select-pay-fun"); + $("#select_bank").removeClass("select-pay-fun").addClass("no-select-pay-fun"); + showQRcode(); + } + }) + $("#select_alipay").click(function(){ + if(paymentFun != 'Alipay'){ + paymentFun = 'Alipay' + $("#select_wechat").removeClass("select-pay-fun").addClass("no-select-pay-fun"); + $("#select_alipay").removeClass("no-select-pay-fun").addClass("select-pay-fun"); + $("#select_bank").removeClass("select-pay-fun").addClass("no-select-pay-fun"); + showQRcode(); + } + }) + $("#select_bank").click(function(){ + if(paymentFun != 'Bank'){ + paymentFun = 'Bank' + $("#select_wechat").removeClass("select-pay-fun").addClass("no-select-pay-fun"); + $("#select_alipay").removeClass("select-pay-fun").addClass("no-select-pay-fun"); + $("#select_bank").removeClass("no-select-pay-fun").addClass("select-pay-fun"); + showQRcode(); + } + }) + + + function showQRcode() { + if (hasPayment) { + var payUrl = ''; + var orderId = window.clientmoniker + dateFormat() + String(Math.random()).substring(2, 8).toUpperCase(); + var channelName = paymentFun == 'Wechat' ? '微信' : '支付宝' + if (paymentFun == 'Wechat') { + $('#qrImg').empty(); + document.getElementById("qrImg").style.display = 'block'; + var selectPaymentHTML = + "

    请使用" + channelName + "客户端扫码支付

    " + + ""; + $('#qrImg').append(selectPaymentHTML) + } else if (paymentFun == 'Alipay') { + $('#qrImg').empty(); + document.getElementById("qrImg").style.display = 'block'; + var selectPaymentHTML = + "

    请使用" + channelName + "客户端扫码支付

    " + + ""; + $('#qrImg').append(selectPaymentHTML) + } else if (paymentFun == 'Bank') { + $('#qrImg').empty(); + document.getElementById("qrImg").style.display = 'block'; + if( hasPayment){ + createCBBankOrder(); + } + } + } + } + + function createCBBankOrder() { + $.ajax({ + url: window.cbbankpaymentlink, + method: 'get', + contentType: 'application/json', + dataType: 'json', + success: function (res) { + cbbankPayment(res); + }, + error: function (jqXHR) { + alert(jqXHR.responseJSON.message); + if(maxtime>0){ + hasPayment = true; + }else{ + hasPayment = false; + } + } + }) + + } + + function cbbankPayment(res){ + if('SUCCESS' !== res.return_code && typeof res.return_code !== 'undefined'){ + }else { + location.href = res.pay_url; + } + } + + //做个每5秒查询查询一次订单状态 + function startCheckOrder(orderId) { + //通知URL + + function checkOrderStd() { + $.ajax({ + url: '/api/v1.0/payment/billOrder/' + window.billInfo.client_order_id + '/status', + method: 'GET', + dataType: 'json', + success: function (res) { + if (res.paid) { + location.href = res.redirect; + } else { + setTimeout(checkOrderStd, 500); + } + } + }) + } + + checkOrderStd(); + } + + function dateFormat() { + var date = new Date(); + var formatTimeStr = ''; + formatTimeStr += date.getFullYear(); + formatTimeStr += date.getMonth()+1; + formatTimeStr += date.getDate(); + formatTimeStr += date.getHours(); + formatTimeStr += date.getMinutes(); + formatTimeStr += date.getSeconds(); + return formatTimeStr; + } +}); \ No newline at end of file diff --git a/src/main/ui/static/templates/payment/v1/card_pay.js b/src/main/ui/static/templates/payment/v1/card_pay.js index 95dfb5edc..b8ccf86aa 100644 --- a/src/main/ui/static/templates/payment/v1/card_pay.js +++ b/src/main/ui/static/templates/payment/v1/card_pay.js @@ -1,6 +1,9 @@ $(function () { let $container = $('.card-input-box')[0]; + let ctrl = {ready: false, pending: false} let cardFrame = window.channel_account_id ? new TokenInputFrame($container, window.channel_account_id) : new CardInputFrame($container); + let $errorMsgBox = $('#errorMsgBox'); + let loading = $('.loading-container'); cardFrame.onSuccess = function (secretData) { $.ajax({ url: 'commit', @@ -11,10 +14,12 @@ $(function () { startCheckOrder(window.client_moniker, window.partner_order_id); }, error: function (jqXHR) { + ctrl.pending = false; + loading.addClass('hide') let errorText = jqXHR.responseText; let err = JSON.parse(errorText); - if(err){ - $('#errorMsgBox').text(err.message).show(); + if (err) { + $errorMsgBox.text(err.message).show(); } } }) @@ -25,13 +30,31 @@ $(function () { border: 'none', borderRadius: '10px' }; + cardFrame.onReady = function () { + $('#readyModal').hide(); + $('#payBtn').removeAttr('disabled'); + ctrl.ready = true; + loading.addClass('hide'); + }; cardFrame.onError = function (msg) { - $('#errorMsgBox').text(msg).show(); + $errorMsgBox.text(msg).show(); + ctrl.pending = false; + loading.addClass('hide') }; cardFrame.show(); $('#payBtn').click(function () { - $('#errorMsgBox').hide(); + if (!ctrl.ready) { + $errorMsgBox.text('Loading...').show(); + return; + } + if (ctrl.pending) { + $errorMsgBox.text('Pending...').show(); + return; + } + ctrl.pending = true; + loading.removeClass('hide'); + $errorMsgBox.hide(); cardFrame.commit(); }); @@ -51,6 +74,10 @@ $(function () { }) } + if (ctrl.checking) { + return; + } + ctrl.checking = true; checkOrderStd(); } }); diff --git a/src/test/java/au/com/royalpay/payment/manage/citypartner/core/impls/GatewayApplicationMerchantDemoTest.java b/src/test/java/au/com/royalpay/payment/manage/citypartner/core/impls/GatewayApplicationMerchantDemoTest.java index 8a3565b6e..3b5d44851 100644 --- a/src/test/java/au/com/royalpay/payment/manage/citypartner/core/impls/GatewayApplicationMerchantDemoTest.java +++ b/src/test/java/au/com/royalpay/payment/manage/citypartner/core/impls/GatewayApplicationMerchantDemoTest.java @@ -219,9 +219,9 @@ public class GatewayApplicationMerchantDemoTest { @Test public void updateFile() throws Exception{ - String originUrl = "https://sandbox.royalpay.com.au/api/v1.0/org_gateway/partners/" + SHORTID + "/attachment/files"; + String originUrl = "http://127.0.0.1:9002/attachment/secret_files"; String url = addSignUrl(originUrl, null, SPDEMOPRIKEY); - File file = new File("/Users/1/Downloads/banner_eshop.jpg"); + File file = new File("/Users/luoyang/Downloads/banner_eshop.jpg"); InputStream stream = new FileInputStream(file); HttpRequestGenerator gen = new HttpRequestGenerator(url, RequestMethod.POST); gen.setTimeout(10000);