From df721646c352f3e75c80bc310cafe11af7851b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E6=B5=B7=E5=B8=86?= <1511447814@qq.com> Date: Wed, 19 Jun 2024 14:14:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E4=BB=98java=E4=BE=A7=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.en.md | 36 --- README.md | 302 ++++++++++++++++-- pom.xml | 75 +++++ run_log.png | Bin 0 -> 94443 bytes .../example/ExampleApplication.java | 42 +++ .../example/common/CommonResponse.java | 48 +++ .../example/common/MercConfigUtil.java | 90 ++++++ .../controller/CallbackController.java | 61 ++++ .../example/controller/MercApiController.java | 115 +++++++ src/main/resources/petalpayconfig.properties | 16 + .../example/QuickRequestApiTest.java | 60 ++++ 11 files changed, 782 insertions(+), 63 deletions(-) delete mode 100644 README.en.md create mode 100644 pom.xml create mode 100644 run_log.png create mode 100644 src/main/java/com/huawei/petalpay/paymentservice/example/ExampleApplication.java create mode 100644 src/main/java/com/huawei/petalpay/paymentservice/example/common/CommonResponse.java create mode 100644 src/main/java/com/huawei/petalpay/paymentservice/example/common/MercConfigUtil.java create mode 100644 src/main/java/com/huawei/petalpay/paymentservice/example/controller/CallbackController.java create mode 100644 src/main/java/com/huawei/petalpay/paymentservice/example/controller/MercApiController.java create mode 100644 src/main/resources/petalpayconfig.properties create mode 100644 src/test/java/com/huawei/petalpay/paymentservice/example/QuickRequestApiTest.java diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 6287907..0000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# Paymentkit-Codelab-Serverdemo-Java - -#### Description -{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md index 22eb4ef..7fe7e76 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,287 @@ -# Paymentkit-Codelab-Serverdemo-Java +# 华为支付服务 -#### 介绍 -{**以下是 Gitee 平台说明,您可以替换此简介** -Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 -无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} +## 介绍 +华为支付云侧接口 Java SDK Sample。 -#### 软件架构 -软件架构说明 +官方 Java 语言开发库`pay-java`由 `core` 和 `service` 组成: +- `core` 为基础库。包含自动签名和验签的 HTTP 客户端、回调处理、加解密库。 +- `service` 为业务服务。基于业务场景提供不同的业务类,其下的方法为对应的http接口。 +本示例展示通过`pay-java`使用华为支付服务提供的`预下单`,`预签约`API接口并对`回调通知`和`敏感信息加解密`等其他内容进行说明。 -#### 安装教程 +需要使用华为支付服务接口: +1. 预下单:/api/v2/aggr/preorder/create/app (参考[直连商户-预下单](https://developer.huawei.com/consumer/cn/doc/HMSCore-References/api-android-pre-pay-order-0000001589121249)) +2. 预签约:/api/v2/contract/presign/app (参考[直连商户-预签约](https://developer.huawei.com/consumer/cn/doc/HMSCore-References/api-app-presign-0000001680178917)) +3. 更多接口详细查看:[华为支付服务API参考](https://developer.huawei.com/consumer/cn/doc/HMSCore-References/payment-service-api-overview-0000001535983144) -1. xxxx -2. xxxx -3. xxxx +## 效果预览 -#### 使用说明 +| **运行成功日志输出** | +|------------------------| +| ![run_log.png](run_log.png) | -1. xxxx -2. xxxx -3. xxxx +## demo工程的配置与使用 -#### 参与贡献 +### 配置demo工程的步骤如下 -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request +1. 配置好java环境:JDK 1.8及以上。 +2. 配置好Maven集成环境。 +3. 获取商户配置后将配置添加到配置文件petalpayconfig.properties。 +4. 启动demo工程:src/main/java/com.huawei.petalpay.paymentservice.example/ExampleApplication.java +5. 详细可参见指南[开发准备](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/payment-preparations-0000001716034257-V5)。 +## 工程目录 +``` +pay-example + └─src + ├─main + │ ├─java + │ │ └─com + │ │ └─huawei + │ │ └─example + │ │ ├─common // 通用类包 + │ │ └─controller // 程序接口类包 + │ └─resources // 资源目录 + └─test // 测试类目录 +``` -#### 特技 +## 具体实现 +### 预下单: +- 商户服务器按照商户模型调用华为支付提供的[直连商户预下单](https://developer.huawei.com/consumer/cn/doc/HMSCore-References/api-android-pre-pay-order-0000001589121249)或[服务商/平台类商户预下单](https://developer.huawei.com/consumer/cn/doc/HMSCore-References/api-partner-base-payment-app-prepay-0000001644063453)接口。 +- 获取预下单号(prepayId),然后组建orderStr返回给客户端。 + +使用示例如下: +```java +/** Native 支付下单为例 */ +public class PrepayQuickStart { + public static PreOrderCreateRequest getRequest() { + return PreOrderCreateRequestV2.builder() + .mercOrderNo("pay-example-" + System.currentTimeMillis()) // 每次订单号都要变,请将pay-example-修改为商户自己的订单前缀 + .appId(MercConfigUtil.APP_ID) // appId,需要配置为与商户绑定的正确的appId + .mercNo(MercConfigUtil.MERC_NO) // 商户的商户号 + .tradeSummary("请修改为对应的商品简称") // 请修改为商品简称 + .bizType("100002") // (100001:虚拟商品购买,100002:实物商品购买,100003:预付类账号充值,100004:航旅交通服务,100005:活动票务订购,100006:商业服务消费,100007:生活服务消费,100008:租金缴纳,100009:会员费缴纳,100011:其他商家消费,100037:公共便民服务) + .totalAmount(2L) + .callbackUrl("https://www.xxxxxx.com/hw/pay/callback") //回调通知地址,通知URL必须为直接可访问的URL,要求为https地址。最大长度为512。请替换为格式正确的结果通知回调地址。 + .build(); + } + + public static void main(String[] args) { + DefaultPetalPayClient payClient = new DefaultPetalPayClient(MercConfigUtil.getMercConfig()); + // 配置请求参数 + AggrPay aggrPay = new AggrPay(payClient); + // 组装对象 + PreOrderCreateRequest preOrderReq = getRequest(); + PreOrderCreateResponse response = null; + try { + response = aggrPay.aggrPreOrderForApp(preOrderReq); + } catch (Exception e) { + System.out.println(e); + } + System.out.println(JsonUtils.obj2Json(response)); + } +} +``` + +### 预签约: +- 商户服务器按照商户模型调用华为支付提供的[直连商户预签约](https://developer.huawei.com/consumer/cn/doc/HMSCore-References/api-app-presign-0000001680178917)接口。 +- 获取预下单号(preSignNo),构建contractStr参数,然后返回给客户端。 + +使用示例如下: +```java +import com.huawei.petalpay.paymentservice.core.tools.JsonUtils; + +public class PrepayQuickStart { + public static void main(String[] args) { + System.out.println(JsonUtils.obj2Json(contractPreSignAppV2())); + } + public CommonResponse contractPreSignAppV2() { + DefaultPetalPayClient payClient = new DefaultPetalPayClient(MercConfigUtil.getMercConfig()); + // 组装对象 + PreSignRequestV2 preSignReq = getPreSignRequestV2(); + PreSignResponse response = null; + try { + response = payClient.execute("POST", "/api/v2/contract/presign/app", PreSignResponse.class, preSignReq); + } catch (Exception e) { + // todo 异常处理 + log.error("request error ", e); + return CommonResponse.buildErrorRsp(e.getMessage()); + } + if (!validResponse(response)) { + // todo 异常处理 + log.error("response is invalid ", response); + return CommonResponse.buildFailRsp(response); + } + return CommonResponse.buildSuccessRsp(payClient.buildContractStr(response.getPreSignNo())); + } + + public static boolean validResponse(BaseGwRspWithSign rsp) { + return rsp != null || "000000".equals(rsp.getResultCode()); + } + + private PreSignRequestV2 getPreSignRequestV2() { + return PreSignRequestV2.builder().appId(MercConfigUtil.APP_ID) // appId,需要配置为与商户绑定的正确的appId + .mercContractCode("pay-example-" + System.currentTimeMillis()) // 签约协议号,每次请求都要变,请将pay-example-修改为商户自己的订单前缀 + .mercNo(MercConfigUtil.MERC_NO) // 商户号 + .planId("100") // 协议模板ID,该模板ID是商户在向华为支付提交代扣权限申请时由华为支付生成。请填写正确的协议模板ID。 + .callbackUrl("https://www.xxxxxx.com/hw/sign/callback") //回调通知地址,通知URL必须为直接可访问的URL,要求为https地址。最大长度为512。请替换为格式正确的结果通知回调地址。 + .build(); + } +} +``` +> 从示例可见,使用 SDK 不需要计算请求签名和验证应答签名。 + +参考: +1. pay-example/src/main/java/com.huawei.petalpay.paymentservice.example/controller/MercApiController.java + +### 回调通知 +- 开发者需要在开发者的服务器上创建一个公开的 HTTP 端点,接受来自华为支付的回调通知。 +- 接收到回调通知,使用VerifyTools.getCallbackResult方法来验证回调通知并实现CallBackHandleInterface接口来处理回调结果。 + +使用示例如下: +```java +public class CallbackController { + /** + * 华为支付通知回调签名公钥 + */ + public static final String HW_PAY_PUBLIC_KEY_FOR_CALLBACK = ""; + + /** + * 支付回调模拟接口(不同的场景,用不同的接口处理) + * + * @param request 入参 + * @return CallBackBaseResponse + */ + @PostMapping(value = "/v1/transation/result", produces = MediaType.APPLICATION_JSON_VALUE) + public CallBackBaseResponse transationResultNotify(HttpServletRequest request) { + // TransResultCallbackReq-支付回调实体类 + return VerifyTools.getCallbackResult(request, HW_PAY_PUBLIC_KEY_FOR_CALLBACK, reqString -> { + NotifyPaymentReq callbackReq = JSONObject.parseObject(reqString, NotifyPaymentReq.class); + // 商户自行业务处理 + doProcess(callbackReq); + }); + } + + /** + * 业务处理 + * + * @param reqBody + */ + private void doProcess(Object reqBody) { + log.info("Please write merchant business process here"); + } +} +``` +目前不同通知业务结果的通知类存在差异,对应的映射关系如下: +- NotifyPaymentReq: 支付及代扣结果回调 +- NotifyRefundReq: 退款结果回调 +- NotifyContractReq: 签约结果回调 +- NotifyAllocReq: 分账结果回调 +- NotifyReclaimAllocReq: 分账回收结果回调 +- NotifyCombinedTransactionReq: 合单支付结果回调 + +### 敏感信息加解密 + +为了保证通信过程中敏感信息字段(如用户的住址、银行卡号、手机号码等)的机密性, 华为支付要求加密上送的敏感信息。对应的字段在api接口文档中标注。 +使用示例如下: +```java +static class RegisterSubmercReq { + private String message; + public RegisterSubmercReq(String message) { + this.message = message; + } +} +public static void main(String[] args) { + PetalPayClient payClient = new DefaultPetalPayClient(MercConfigUtil.getMercConfig()); + String sessionKey = SM4Util.getSM4GCMSessionKey(); + String message = "xxxx"; + RegisterSubmercReq req = new RegisterSubmercReq(SM4Util.getSM4GCMContent(sessionKey, message)); + RequestConfig config = RequestConfig.builder() + .publicKeyForSessionKey(MercConfigUtil.HW_PUBLIC_KEY_FOR_SESSIONKEY) + .sessionKey(sessionKey) + .build(); + try { + MgmtSubmercRsp response = payClient.execute( + "POST", "/api/v1/partner/mgmt/submerc/register", MgmtSubmercRsp.class, config, req); + } catch (Exception e) { + System.out.println(e); + } + System.out.println(JsonUtils.obj2Json(response)); +} +``` + +### 自定义httpClient + +SDK 使用 [HttpClient] 作为默认的 HTTP 客户端。 开发者可以直接使用 DefaultPetalPayClient来发起http请求。 + +开发者如果需要自定义接口请求的client以做请求中的日志打印等操作,可以通过继承PetalpayClient来实现: +```java +public class MercPetalPayClient extends PetalPayClient { + public MercPetalPayClient(PetalPayConfig petalPayConfig) { + super(petalPayConfig); + } + + @Override + public String doPost(String url, Map headers, String requestBody) throws Exception { + // todo + } + + @Override + public String doGet(String url, Map headers, String requestBody) throws Exception { + // todo + } +} +``` + +### 新增或拓展业务接口 +开发者如果未及时更新SDK,需要使用最新的http接口,可直接调用petalpayClient的execute方法,进行接口请求。 + +对应的方法示例如下: +```java + execute(String httpMethod,String apiUrl,Class rspType); + execute(String httpMethod,String apiUrl,Class rspType, Object requestObj); + execute(String httpMethod,String apiUrl,Class rspType, RequestConfig requestConfig, Object requestObj); +``` + +## 依赖 +- 仓库地址 +```xml + + central + central + https://developer.huawei.com/repo/ + +``` +- Maven依赖 +```xml + + com.huawei.petalpay + pay-java + 1.0.0.295 + +``` + +## 约束与限制 +**通知回调接口** +- 对于回调通知,如果华为支付未收到application/json类型响应的数据,或收到应答数据不是{"resultCode":"000000","resultDesc":"Success."} ,华为支付会通过一定的周期定期重新发起通知,但不保证通知最终能成功。 +- 相同通知可能多次重复发送给商户服务器,商户服务器需要正确实现以应对重复请求,处理建议: + - 在商户服务器收到通知进行业务处理前先检查对应业务状态,对于未处理过的场景才进行业务处理。已处理的场景则直接返回成功。 + - 在业务处理时,合理设计同步机制防止并发问题。 +- 如果在预期时间内未收到Payment Kit的回调请求,请排查提供的callbackUrl网络是否连通。如排除网络连通性问题,请调用同步查询接口确认订单状态。排查建议: + - 确认callbackUrl为商户系统真实地址,保证url中的域名或IP是外网可以正常访问的。不能填写localhost、127.0.0.1、192.168.x.x、10.xx.xx.xx等。 + - callbackUrl必须为https://开头的完整地址。 +- 对于收到的异步回调请求,请务必进行验签处理并在验签通过后进行后续业务流程。否则可能因为信息泄露导致对商户潜在的攻击,造成资金损失。 +- 因商户自身系统实现问题导致的业务异常,资金损失,由商户自行承担。 +- 如商户对支付回调地址有IP防火墙策略限制,需要对以下网段开通允许名单,后续有变动时会在此处更新。 + - 124.70.118.0/24 + - 139.159.166.0/24 +- 商户系统收到回调通知时,需要在3秒内返回应答响应,否则华为支付会认为通知失败,会触发重试机制。 +- 商户系统收到异步通知并返回{"resultCode":"000000","resultDesc":"Success."} 时,服务器异步通知参数 callbackId 才会失效。同一个异步通知请求的多次重试callbackId是不变的。 + +**接口约束** +- 请勿将开发者的服务器的IP允许清单设置成用于限制华为的出口IP地址。IP允许清单本身并不能提高安全性且会给业务发展带来约束,在消息层面已有更安全的RSA签名机制条件下,没有存在价值。若开发者不遵守此约定带来的后果将由开发者自行承担。 +- 地址必须支持HTTPS协议且具有合法商用证书,否则无法正常接收通知消息。 +- 支持的TLS协议版本:1.2 / 1.3。 +- 支持的加密套件列表: + > TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,TLS_DHE_DSS_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256 -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..d52c8b2 --- /dev/null +++ b/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.5.4 + + + com.huawei.petalpay + pay-example + 1.0.0 + pay-example + + UTF-8 + 1.8 + yyyyMMddHHmmss + ${project.version}.${maven.build.timestamp} + + + + + + com.huawei.petalpay + pay-java + 1.0.0.295 + compile + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.projectlombok + lombok + + + + com.alibaba + fastjson + 1.2.76 + + + junit + junit + test + + + + + + central + central + https://developer.huawei.com/repo/ + + true + + + true + always + + + + + diff --git a/run_log.png b/run_log.png new file mode 100644 index 0000000000000000000000000000000000000000..9701c3cdf3f6d32a5835904499f0f4a805c26457 GIT binary patch literal 94443 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�p zI@T^=FV$k!!umRpEGrzW2BQLw#zaMp2&8(?UnFS>)p=qRDhB1dju?`aQB> z`H{nh>L6UX!?EZ|6#`A%h}ev7x& zS+f5vVGGes96Y6P#p1f;V>`@FOANBxPn>!$VXMK8RmaY49yg3sNeo$Vy=c9TBObl zfM6*x6%B7jKLJSRUq78a%Nc|p1z^-ny|2h*2I;t1y_VoJd4mm-YNOeesl9V2v@Bqx zp|f`5tIeHRDXE~i?#co-8Nz(3E2qmjLT;5)Rr@% zCkS|Fh>-{BpFrbhSC}%uke1(1Fy)nvUNh=qd6glX!p+w#CAPaa}8uNQBzhGe>-ZBqyECsu?ssNTL`DKDohf2Fx6^_iYIZ{GkiLttz9QYB3R6No zc48U<4Q~!0>yAiD{5wPf`MaefzKZv+g|3QU+SApuwjrx)^m{l2qiMv0oIyZxQs;7+ z_h)%v+F|{67;ev-+hCjy5?tG<+#*1~_7oBwCBd4;yo_^`>~>!&ocOi>4|rGU+N!_p zZcaQV(V@aEWix}svujxgl5PkB>o zVK3e|7w67-7YwL7f*TL(dxKO^O!g?*FqV5anbPUu8GRNY9!ZS79X}4QMWsm{*ltml zZw$lT$V%ZjIP@d2#?yiG*XclH^OlT8?nkZvgY50V?7ZwMC@K6I6HdhP)G*f)ZUJxE zJx7kz0e##%lp3!06+Egkxl9F_x`nKZ3&z$ZbtB)19msJkMh*pRHOus+RBYW^L?kR- z6t<-A*xeX^_!B7pw(3K)k~o@u)ly^*n55d=p^X_{8ZvL~dRFYZ_l(&NAV4~LwFbI= ztMeoJfcr2)_L;=KRyJ^{IhOm;a_MC%0X?mfs`5I*K=J2?pAK{E{p~mcN%$wDD9m5+ zrEI`j-no z1aIPvBr9jMUWO(RDo)%b@gxRZ24p$9jUf5lfpk{!kAizonfVp+ZwEE(Z=37$cLTW3 zN6-EPxT!(|)|>%tX+MWbE!3D!lN+t#@&Z6o8Ycw`^jtb$y_ro>=)UIhgrcjs9zl73 zlQ?sQVXSC|JT!{{e*)jBw#q%Z-OiAIfZROjUnD8v9P_S)3XZWYe*Rj3Yd09=`S~w~ zsh+nZT|gI|N4N9KY#AZh_MhywkE<1UPYWLOP(}_PH7qd06K^SC%9kz`lloflFfTqn z1A?wEu2r@M;*Ez@z3iyTHE^|(VbU7zVyx7CVKHcs{P};>l`-?z+xDhzGJ#m@j%F5E zrnD&i8D#`DDtr20^kzx>IPG+xP+?qmZ33GP2I{#8i##B;<$G6A1sYZ}F)w&`udXSK zabL2I60S$8i(&dG+f`H>XNH=?0?UUY(u=CR{~T+$O+%uG2qEby|BJY{jH;^r`u$Nv zkrWV+5TqqH-61XAozmT%3P_j4rZ*+I>29QB)7{-&n~t;9`~E%8InV#R_`f=1;CAR( zEEsFeYhH8C&-~7d)8)L%cDhK-B)~SIotAbkFM$(yte;cQ2SaU9e0SmtCb%EXC74`_ zcz@(^u1&Mjzgw*qe};d?wqoQH6rFKluob#9o3+RvHNKRqci#P8NQn@3;Nn|34iu>d zxz}<9HSRM`+)m9^_C2>4fj#N($ax{>&6^XeqR(nyEfSo`qNs1VWzo;)oBvU#m5t)a zU_Z2|*BfzF%*1}+r5RRG%;h}2{+QE{>>v2Ae=1!IJ*lK8|(wB47f?XtDTvHHen z?zT`D86Xz3Ym_Alak?pj#-#53QQmJ67;_0X|6Z-G5kYH~66{UWz&%H4z1Z;=bg9j<^j?(> z=ghnrZ?&!^e*t|yVDw?XS~bZ0eUD;k#PeWdNmy2@H7=u<{eMG?-(;AW*5y-rcW1|Z z4n8|6hkC6TwJ4j{wq8u&8vj@nIWwEvI>7(OVOl>79;@xQ@-jbgAphPVk{a5NFdDA# zI=M<)cTqKs)e8L^!zcfDn`@y<|7&x8v07U-K5vFAiV3>&bhmlib%@ju-&}o&EJ{$y ztF)ff1relXzsHbpnr)iqne&|+kOVtY8E_qtY5BTeJr6W>@nW-TDve-G;Jf=&!qU6D zXf;wWb;Ty7h+T zvc%GE6F44nkwmR^wR*Deh%nzdw;i{A)z9p4y}}e_-@)^Xbf#r}=R>oi`NKBU_!b){ z&eLktL5Pnn{b*4bgUk)Do={)+B4Xm&ZavG*qQ2p2QQ@u_-p(ZrO$Q)by-@BW(h_yk z@?n7jQ_f>};a7V?yD8>zfrjn)?xYzcSR*y)9jzMOIM2%iejM|D=K8Vn*4$cLCmMJy z^kn;dH&R&R`@agjZU4=xG1u&X69Ly=kye=)Le}Pi5vbH+7*wd>{yuXoOWXum^(f=4s z#@4vEL(?g7pq_UwYyNF0J(AmL@ZbTucZ`JknBbY+{+IS4cY8( zqQ?wiRdLZDBmc9f#;1#?974|Uxaum&fd7StYwxC?r+cKGBf7e4lYCn6=d93`O&f~e zetBhP8b#i4&^Bc5T!_0fi4vHTXRfMN!J~$n&dtoFR6OgNGZ}-0{yIVecAi92HH+4u zqri*5W--laAZhsts?`Qb0A09%zlkokM{f7v@Q5~EX?7VPH|e%Qtp?b`n7b>c_oJq@ zD?hR&5G)3luQyJMmB;6}HXj(wLopR_Iy$^~a1r2Z;RmE70aJ}wNTqa!FD;^aPlJH5 z$)td5SnA-){>joy`K5jV&P4v)lX$m=9QHGz|fry&=d8 zj}9=oJ~RU_D3r>e)8G$Q9`S<1CtCCMoscy*KJ;cm+pk_eSNwY-?O~?>V}hII zH(Abb$^VCTMlSUTKOCbWZQXgT2|esDDFkJ91*zkTt8c+qw;CPXB=Q{r%vCk1k;|d6 z^MUAcV*_h(gR;ICM*$POO8f?j9b2T9ExW_r2!zPG^o!*KaX zYm@j$|Dx!JBOI3Rp$D5)m!&S2<@M_aWx7u2S=d;TLnDLB{MPsQsdpwSa)*~I4aP8w z7vEW;T92K(HMdMLt9zHca0a+p_3<0j>9&})Y74pR4e#J|ybb#(wYhCk*-_yo_B*QU z@>>IUv(BgAm8O7Ff#gI`?rn^tvpS)#b+2G;d8yoKw8N+uW_cxL;+Q&@`d7bAkn!H? z;Q|nG|IPh~5j0Yff48ho4@LSaTWzu&KXp!FeHfFHH%O#&sJN%5sqWMJHw!rcz?zeD z(A?8OCbHOhLj?(t#RK4HSW-N)@9XI;d)VMpk)Hy?%KtmCbva(>RK*FSzf3ijb!fHW z?ekVP;O~2{!_Jru>lbkKUHZeL7woL8rm0UZ>bH@P-aEH&ab=~j>H1gtm5ce7Q)3sL zD&QrGp8ESAP0)DGE7J%kcSb~ePA$F}-R`>6;WwR_j)pSJ?@d}QpSEk?ia?9t#vv#< zuEPU}dN@CF%PQH3kiJLnoNaDn7(03_2;T;CleKJs^1|O-sHJ$Glo@PR8J|%-h6oCo zIa3ngXb4$PYT9Ts$@bHj?;|O`ATg^rRl|8gD8E|sCMZ<2mZ9Mlgvd=6qdk&f>xnM|Do@A!l$iSF zlH+D$JJjZ1c&>khfJ>)!#(4(oU-}kuwSbGuTUby~r2hHrG*k48Uc^oMGc$-6rw+Z6 zl4&mb);TPvw~kZgz0jfZA@ZwLAa0~(Eex)n_=p45pfiWwN{H5Tu;{B7=})EcOV zlq2?3y2!o9uHJ9`JQhC{dlj3UfRemgDDU_*mh!sy2vi-Xqa-WG`4N)T|Hi5KDn*xN zNilwy5CXDi3K)8m=H<_opT=G6DSY`=q8Zq^L-w0Gcb7O0*9u6Mjy=Y>YG|f7h}ZIu zDXJ-JYfLkwYbshCuwvBwu9#hY&}3>epjj$Fu?*!fN(r;n42l*dV2Qp4kwDY$5a{l~5lRW$0sOrA!oFYy~pWmi# zsaU@9O=3@_heDAt1G>;Ui!dOR>O}>mKqI>n&dJBtWLT5Y_pchOk2OGyyb&lqMC>PM zhmakVVl;_DSL$E2MJbWT|7x3yN{k0GRjpo zCCaXY#(7$|h!tM7DCnK8?10fd^5XS4{#E>`K0ONN;h&3`NQt!;*(jN=n?VWQC)MB) zk}`OC$@3+7Sq?9Abk^h~h-OX^#4?ZLRfKFUl*!N-y`i{?=SN^4H)&%(33s%5`%8me^HJ!(7syp1g0< zhu8Dyt(VB#n%}!rJ>LYZbiC5~+4aq{-0@ABJGn>U8z-C?TqgU+a#5j?A9CJk&ASrP zM6CmhCKrjFFo~4;q^|dR`whbCL|NX?j~^!Nhn_gq7qZ=(1+N~StVU#~g33EDYXu`y zn*Sj25U2 zZ?S3)j%8mU-l4$YCyA*8@zpSFK+BV@Fw}Vu+Ce)C1jY`h?);Y5#Py>-+^TK$C_Ir~PhT3}5(SG|M+L>xy@X#OfIYG>E{>+64rd!qnOFuSAJdfBI{Sy5O=0=`Id z$<=clpR;;s_*kOZ*JE*^Z)>F)HikAyAOZF8xtEF#(6z zX=b(kq&HcjL(r_nw`KDwaI7B#JhISI>al1f9Fs@^|D2As*nPEU$U*$z4?n9aa-UJK!y0kU2q!noXrXa4lNk>(8ZiJ=yHYd3#iY>1}9*AyLzNTC~ z0()AU8y`HrJ?j{r4!5-_47uxr?LF38;oV=pnN@}nrW&&bd*~b^pa6EK@mpF3s{fCt zB}o!fP9x$=c{gKHMHKqS*sPFNR@V%`jJ%6lvUSTcRdU>PGrUN2yI)>nyHsn;OmCCe zo{nHqDanw2zbSPvn*<@PzHvM$jx3SI?wuyeeO!sYhXIVT|>zfCK}6t4VZ$ zo+pb?xE@(((Dd)F{_fI}xXl+Bw6ZE;U|jhEubC^|l^3HXLuQ09`)KTK(-8B|pN7J! zRqbl{9oyR)mlCN3e;1i}B+UOQ?uP-?+?t8(Q&j#%u_q6k;w>}R%NEdgvBasfSNyI-0XeSQwW_LK@* z$i)`=D_Sfvw$gX2dy?rZZ(X1hyrdPT>1X5^%taYH-C40IcgNIV-FygYi3 zMPsrk<`KEw$)x08zCu{4(Jm8X1ELNOVQJa`(#mQr;r@q055%DQ{vK+S{SoXuh_wjq z%l-E4{{~Sf<2HIH8WJjo^(H)^xBUzHmby)%c5NrYKP`6e&vVQ&015-!2i+O9@%b#4QJuB+FUQH*Swhk;3(K zs3EUORfCtrVMFyMt&*&*5(O{(gk?ECR!PYLY6K?HF>0&s*lG$aM2c7283 z5#*{g_f>fKoLNjOIc}YgA=xO0L9Eh#_Vp z4`FVy4!>JkCe8h2~6%``&*t-5mu(@wFyUy$*NTb2x(`4yQ+6udTa(E;MV5AiVVDeF(o8;hK zTk*ZVWY+9nr ze$%$+I%peZRX5>RoMVI+mz<*H(Q|&A47wIdm+2UB2 zvesiTAHP+D)xGj8bJ;IoJ=XGq*C6W(>f-Bv5i))CUcFR{jXFVbhzWPFqNXzho}OaT zJHX~{+|1NnG)UX}gQj9Q`|xB07!~Z;jJjzoszMJ>>}&Nf@7zVs7xWgTXm@hm`byFk z2Uk^6*LS2K?AbFuhitg*f1UCiH%PO873U^$Y3 zh66U9GMK*|Pe(W>HOXyUUUq7pCy(81i~KZKnN@mrw_FWsY)s)iOr_>y{#FK9(d(fT zik(FD(?Y~Hnxk{J7HPC~O5aWKJVx*#w|B`e*0nz;Xgo#J-EuT%hNV0KqWk7{vV493 z-*+9QWmR&IB`NlPoN$rRxY(jz5r`~O1dG3q5S$8UnfGTHYa^O*3H@|@D|6iw#9yvD z+_hRh4KJmzvz3cJwNi)rWmQ!Lw6_~NE1`V<{92M4Eza*N@N3qGUN^~?2qImaUrB>M z$ci8sMKk)-JG}Krd2JYz9kXnCy)0gPG=7J6lGO8OD&LH_<1T(I7sJ@+EHO_=@z@Cp!TAY~ujqDl&4Eb_51$XE z^zg8ROegp47i-$)7TZXCvB7WUDmIH)P0y^fbOC#8wIr0_>Imy$M6zDP#yRR%KQq4t z+>`J#kHj_|lx@7Sfq*d|BCoe*uNNJgWjN23NhjbTF~P+aRBbgRyWmzy<aetW^ciY|@aGlV*$`C|nUpg%qDoYS1?%(F|ZS9MnlkQ`PU}O8h$L?|#Z#Ul zXfCp!1|yjDyjFkUrdhi>A}-`@*d$*d;DD+Uk@i015KAK$dL6CR?a9H8OCb@c-Pa!f zXqOSJIqj0!wN_3>n7!@iTBEo| z7Lhh)QS;%4X)giXiP_65gg&QlydCQ=Wt_fjSJ{`GwyzdVb3a@(O3znLz(E-89@^K* zU+2>9qP`G(1N#!`rBu>{Cyu0<5q7Kd4T)75SYQouv`T9qG>0~O(tkK_KMGhE!Vt&2 zBu{Ttjc3=`m4P1cQd@ufpj3-~dH5MEll~fLbae1Vxoh$2C804}9^n5YsYOe4ymCRJ9d~LLt_=|J&{DF=#9ham`>XJV}3 zTR&k?IUeeK)4=|KgoePX$RAHtkGwJ$H2?Dk0-yK%oYsZc`uz5@JBRLS7`m1Tbi}72 zTjMOLA=|dIb|djd&jtQjdZ7sWM|1JgL6heo^(FPrxGBQP*4y&CDT%Z`RK4(X)B-EW zm-wlKS(4PmF>m@ntyhC!n(cJ@omN(IL`_*cGtR!+RB!5OEdjaGA|%zsIkT`|joi|l zEXx+=Wt)N;3c9yR0cLG4(Fng9bE*}2)Xlho0Hd2gu8v>tEnVU1SU`mJzH!);?}pf= z)p;cxcQ-41*6ewSX+uspctrS%}Q1`m4t`|U$t3=GCC5&wl;(N4ExRT!OG%`OI%g3rlc4l=a09z z*ft!1$=JFWxR#hA?-0#5=-=l9fB9Kff2xh$Zum~MOH%c)%Hu0A6~4@iA9L!}XK&`9 zWRB4M3@*yVPA^&-x0i+2rpz84yNaGp#^=dmqziUU34UAD zZhp`lNDCpz!$1R*2_gE$eBjSgmt_L^CfAm9c)`F!)k_*No*LZL<+M0V5yxWDTn1_^ zg&gQGEruY`;-uIOw(;SP@22kuqhTm}df|YMZLuTo>Tff$7RvNBW^+>*D1GZdm*T1< z<6sb4-EH&X7k9wtx-P`2zA1S*I$Jsz$XaUDyZzC4&$J_=*nzt~HjZosfweZVfB?I# ztf>x54(;Q~RkxeA!?cd$a!o6GS*A(#gh%rydMJ4bA)MaqbcXPu)P$c~ezWm>4N2LGCjH3OcP+BqlCcg7 zzT0gLg&blOKqY$oRdEaLoT+P0iX`n0Dx5wmShMCU-NWLbv+8zPW|W z>Yb*$V7Gxuf zTSHe6aKBKAJ2J!{WdNW_DhwnGa#Yk&!OM({}z8yUJ8*VN<4k=3R zkMgX;!j&I`LxGTmp}-eO*ZS>0J+C-8uzw7>OFqPP+>ZCg5XI_xlZ|C={vw2wg4J}n zdZUK7li9j=@xRS?(MfGd272r)F!#ADp3{A|B^V7c$5o6{C)^+9FJAj&9*p+iJ=uUW zN8?Dj`yr(>Bb}b)$hPsGh&P~d{N zcC8~|^cjTl)1S4UkhLr60skiod4W;U7pF>E6U;@?RNwzJ*7d7>e!%atk$moSG_52e1&z%x9q%XvA zIaTbO!(WXlFE(U|_p;>-jX!nge2q!Aw&oL}ko_G~6B;b7==ZZtG_Y(d>UVej3cuh3 zCVb4W{(Ku6Ja|r!)ua{wsDTUbSYo?RsN_WB&ncRMf?ViPdVT#xOH@~14ER)x(|UOo z>5c=zex*$c3u1=pFwP-uD;a7^N4gDs#0=-}@lLan;oWpFi@fV(j%1pTWg>2Qzd%yd zs*63PPg{~9l|PLo_$HdZebP!nuO$0s9c>Ea+t4r2>`BdE0&b3l?7_AnTK5ap<+0K} zbW~%6?+EcS-j!gMLyCpI=@>~`47HmtOIuY(n*jRl8T%L;E^6mw?2d)I^15H^W5Y=4T` z%S<$WxrK5{jCB|#d45(Jx8(cKS9V`~6P{xoK+fUCet$owp_Z(suKti~>81L3^z767 zAD~@)EA7EwuP*OT9ggl#8>f`o+no5$u%!%&#ae|_-d9FZ5y2!7#)tE+#<2YO^$*IZ`B_phZ+$U&koAYK6vYW_GV|RJuN-%HD8SctJwynGuuXWNKG$wIxIh89B-55k8#4m z*(FPe2r8@H^x1FKwUsy0g03%7+`NCjC3}GN+1<;r5R~+VK#D!k>f{fn`F7Y~N2(~k ze@DQ;!eGCV3=nl+lrnx?NKnoqr$7)hu|p~!^f!o%ZrilJ8`FHBgR+2qBk-oSe5SlNrLsJH*Ch-}JE+XeE!W1& z8(B8y=Jy@z$i@r@sqp^I<6_;X#?NzNxH^acMpk%XATk@b?y-B#gdMBb$Pg z4@7=towqA730QoH+5l5tw008=@febU`qzh zNx30&6%xDL0h#f}S*eg?zMj!-qQaT6!r%F&I(40)gcFF&)Hj6aNlkPp0l&+9*#^nJ z^FgU-2mdsFSLd^8Kjszjxxu07+n-R~@5G8Z2m6m(W_l-M)Lj^I@6#^3e02NhD9SUN zJ7BkPGDpt#ZuYO~lG4`iAqV=M2 z)|5b4*+FoS2fFXzL(h(4f4`NYs{)M=Sk7R7w6EKtmHRs1?c0D;^TO_d^lvoLiV7R9 z0n1U1!oFG{lfJBpC`O$E{E0JqiJ#LH|GnrxpCCU;+P}%hzn{T*|NQv>T!XkqonQ6O z-T(bhH>Ce(x3V(Nl1&pxe%9V}$N?>>&mo>= zQUJI}!abx49}udTKV5XwH-Ifjbn44h^v-(O8HOW|1fy34XXAM)v4WRV7}|xSGnuxJ z3&c#efWA8>Y>P6}az~Z+Y&zl+UCvjb!-1g_Kjw?#jY(_0XRmKmQ|ZV?v4sPDpTvWg zuEA_-steAfr$4%rle%h?Y~0B>rE=JkFIWJIi=jus1KJoHA^p$%eQv;KRp-bH!WGs< zN)0ivKO((926`q4b^N;@4d&4hg|C)(CU^j^*p!gFH3p63l-%2WES;!|9~^af_Z8=;G$b&6k059^qw^J(0FIip@MO>X!AJ8VCB5hXL@5TP2+J+s zl6Ofjr5B}~noI`mON06kjGX}d?yd&2C&Ov6XgHnY6urSa8!$Qzkiy?pCNO=Y5JHmTs+EJJ#kj%1AQR_%dk?D}$HYpZsjap6$D@A%B zN!zvi|A)4xpSM%JDUI8{yUgu@3sHSn;6qAKP zc_VKO3Q6Q5@p#0A_Z*$%{@fJ;7hxg3hQ`fp5o@|-?RMm$Ymh{Ak%#BqY z+mFYd{npuWdV*E!2%r_05?(gBHTD zOISixP<#@{Kbb}!%4&3<6$jj2)G&B(yP&lM-5b_YHg@wSEA6!%a<=L z@YcClPg)LRT?lqa;kX0k1R=%k?XQ>&0AsQD>Y%78Kda>@_}Xmx%*+JMya*}S`J75@ z9Pb$-P-5O}d;{w|?X`ZE(iF;xr)+lDg=O1YmLy6!Y!*jp29KL@Q{Qs8v!&A1+J(_n zB6gSfz3z=2KNb^+T4Yakr|(D2^C`;$$a;g%hqo?hCs2a|X;>CV&H=35o7)-~k%E8R zrPVX`^s$C3qoqio%keji(np)++t9^w2R%m49JUj$YQ3wB>FBw<8&!R)#C2m?rXHE% zvwgx7{G)U80yHN!o!T`_qn)LI_Cvt3Cwhbj)cJa`Z`N=WACZ}IMWQvUm4vbXeozmV z|9ymBR(*sZ-1(J!tgVK6M1*@3G863`yAevN*yVH8? z_G~2TgIw;%B zWz#|3a9C~F=g7H1l;=ZxmLXbKK;;uAuI@k?gvA=jhcq>ZWn?5|E;UVccre!5kaP@R zcxN6|1Poz`i0!_iLa2|r%dM6QEbx7~f4){uM8xTM?%pcK@&u^NYa6d{3&R-* zJmNXMLWWL@F0PSIx<6^#r^xI0J&RNI3#Z>xpRjCn$R5lrpT2b#TMUD2#kYQP5Aohy z?5^KN*Olk)n2rqnDJ9oa6?jZWp9Gw(=yM*woyB$6KyB7b*v8%N@l2^)KhO*BVwIU8 z7(h_iTnyAZ?8>u2OTk%spiiYo$U_ct2;K_)Q9cm=aU$L=D~2|CB6isfeMknqmam`J zq8i0rvBLW6E^~{4+PLLbgrib2`Y;U^y+4aNwXLA6<8p2M4Z{1$@kDG>0nE^6dHW%o zu{SEaOasJsf_z;V4P@jA6N>=JnxO<~>#29R1j8v$#@kig1w8CFX3}e27eBMN7$n5D zn#WnPisQn~LWmrXOy*Z=yWD?AZjVZ~Qa(*~8wqCR`tx?JFIRs&8>%FKku;mdBEv7? zic--bYmPeT+4`YZtXW+-v8SBS`2+wjQo<=wjjkndK`FVdW2xXnq;`-BeR7^RuI zWABtBW_x6t+XCwEg-*k_JroAW4`Tct0*#x#yNYmW+dlnw_LKrYqB*0hVH|bq`2#9O z*Mm0*eKAFMU$o$%5DA_^8*zYPc8PrrniWh70Q17uP799PW(zvo%Ay;~%9+euIY0KP zwlcT1l9A{CEGBrW`a^{K zeUG${AbkNpUOZ<9*WZb8(R*9!E-hoYa}F7?XwjsY&sQfZ%L@ICo0Ny(Us)Ed{QY32 zpksf~#mFF}t)j&}+gx-WM1RJ=6&F2W8Y|XerzA0!>FpvY0_#(^5tOw#RqFqlr~8)C zcYK4YEBP?UxHXM!&tuO9N4pO~t=e*HGy+}ZZogvQ8gwx?sH=VKo?P%NY-n*enL}&b z|NhgM`6$=pG$A)(c041aFh|ca+2`u&S=eUu&s+PB;nFncoSW~WleXLf76C#pQNUG~ z31TVBV|eXkpZSNG)aI)w2lus2C~T{swhV7S0>D-HluJ_^2{np=o26+HqG|-U&Xk3e zAz_ewbj`s}SCIbp_WMw(=5cTs*;V9RjRcbn*5yl?&qF-#_rI~AR^HAgv=?ixI<3m1 zm1|=#_2JG!%QkJRBQ22ae`blBCgb@is3<3DDV|?KqH=tbhc#c=^u{V$!^lr(m$ z79zhMV6>RYWXz6X^eMR~vjf&d7<%wF$SiydXrGe^S= zsXMmLvwt4@0p0Z+Q~gp2uvgux@7mtVyx*LU&ZCI-aw;EtFX)>eo}Y-@#8UoeQqBcB zjV)H1d?4H2s!3qI9b_Fi)NaMId(&L|3U#f z(=Ql!&I78&Jud|H8|*#?sh7AV!p?AfD_2MS48*GU!SD($Z}+HRr|djl*nROJGX>WV zC5qSUeue+;_zNO4&1R%#rNJ0MIKJef+x{8GJaOt*=Y=*5rqNLalD5^=BBT1&pQc?S zdIKCUVU`aSu6MsMkqu-@Zs;#+)P)1e@g+`JE*oohCgiUzA#|vJ-_(gq3Iba~DmGXi zA90&$VdcuO2A^xR)=~;b!T$po3RXVrhtL!YD7#1#W|_>&z-F2#{7lXP&f34nydlq`<+V4q#zLc+-cl4c&^Kx!_oDj; zv-_1iQQmGzh_SldkAUDIHJKEXxe_srGfJyNsjzcpQ-8b5{OAsj9#xce4r63Fs$<{D zePvv_*WU?chWna-p})5agMlq7HpD0tI}pW}yE=)XBf?8bTH1iYmVT05PgnJC7D+_J z2K0ikWBhU$;*-LyuB-D~FhotNceE8XMSIlEb5s^$?LI~kc$0uizJDJglzM=fr8q#z z9F-?I8u%j_Xy0tDAaLFi_mDz)8hpd}v2OEMOH4=*--HA}%8S>Am0mXTN{(T`d|Qks zeXECuYaU59;X~B&jhUu0Hs?!{Kj|IVt4dG^5Z`1D8wp0-x^f zmneVR1a~0}EHy@gAD>k{l=yfM0Nrq)PE;?>LNgd}O%{A^7-^G0a0LA@2=ZZxoj#WO{4FHeZQdxq9D;MH1G@(LHZvkTawBfX6_Z^{!)Lt zs^*9{1vAcQ^_m3Mo*|>A>lZ!`jXWzHCQWp&`|k60Q%#?5=$$Ms+U6Swc9c>V){*#E zD*EZhf-2?~#rV@PF8hjptrc21j~(CG=tPzT2r;{>cN$xftg|kU)wq%f8^A!XA38NW zP779@RIF1?aIdUpFrw^*&^rcxwpyHO^AC^cFFsPHpTn_augH3Z5v-A=VwYR-odA`^I^nM|0f4-!mI1U?U601n zt~VPkYc~7yfNcH&4bv3NUHb9v*&ynFjMh#(2~bhF5o{*Lzv4{T_t!6^bJpY&O4QpUkihhQZ;GNf;b{(PCga-@Jum!;+b>O!tl|{xnO1 zv&+1}(g1HtNk6#k=R7UGv`ivB0PaN8P~wehOSRg`Iuv@E_r&gmkIdz^Oa zVm*Sf;FZew;{od+0#tv_kD_*?g#x{ z@U?_9YRsqkLEIP2ekj9U&G{S*=&Y*Ryq-q~n_Bd7f&$a=`;6&uvbgc8zncVR=d9Rs zpi5uZyyFLQu3X9*;-MmRq}5`N8Yh?bv2jZiuaYbZsO(`qPgUvb5~v4d-r1BxOXs;C zMdh5MS7gFJbhyxZVrRdfM;h1tFg!mLKJ^JU z!&KiGh9a`8AB0Fl8*tMu<5(i}BD!5g*;_f={~H;mTKu2} z%$)}hofMYw$2bg@p$x9^QzQ402xKaF1P&KNb#}h!vgT=4Wk(Nt4P!Li z-IBD$YoGvOcS0!|yy=q5S#C{&9Bdn|vQncp7j$F09pe{CQ;f#R#|_`MDy>M2Th=;fy3WqY{oY%-HD*V+<;B+aHuF zllJ~atVF)}=t)<)oc_{hgQ^3}eS@-DAmh_nVD&9 z_;mPUAE!j$-I%)gvQpgCBG$TsB-gxs32|^=y=<{1TEJGES%))Dm`;sXb`r;AiIgW~ z_|#)27HBCl|1xUaDQ(bld=lAIB-HZLe_kmQ;+gyuq#$S0*J9iXC^UYRn;2Ul(NlC@ zG0R{M4cx3a2^-!{GM-+mm4fp_LH-X0w$LC!t5wgiPF!!$@@E!*ndc4+KxFVTWQq`%d}uyPolbMfsnDSx0C)ay2}^@Vnq-uf+Sa632=ek`%; z8AzqNITr<$_jnq*!)3PP~A((pdp_=VSq8d-gu(v-_7EXBMDqtzz*zk2T*jWqDr6 zqzPc}fdQh0^(XlN(h}u`QjJ9E%O#iQHBU=ZYa(f@XuiLyQjssce%`;EsfBKmJ~d;= zRB|vb8GRSZ?YmnrXL!Fc*x4W_whpmcW&1(FN7;NU_R|{sjnSI_>)4?zd{}?xgdEoa z5nS_Zs0L-dHxb*g;&sa#SobRlG+31AyQ^Wqw|Lctw|!A94D?DWRP9)nkC{((*uzmM z^1scf{k?)z>OpY-fUB0xu)`?9K>NlGsNyF}2wh+8M3~qhA0*tF^S?}r9oW!o0vIy3 z0m#n862g|WeR9bnTIPXngyAOec{_fzbZTxRC6I(~)2#2j?R2TT>D`^pyZGCk^Y+kO zE=YrM0L90wjP)Q;VMwLOtX`I`gM4*x@bk$g3D^`e8ZXF-x{prt8B%K-Q{zXU2FkvB zz=FZInlF+2HmL1n@TsN}J1(BbmFDHya^O5Pe&Jr{pzmD%#4doI5MFv?c0KDo_!$36k|S}}QS}d} zc0m#PQ?N!Z`%Q$|hi!v-SRS%&1}T_dHu~x$^D?Jx>R? zAl=XP7!OwypPT0+_Vyw+Db_Swe;(C&|JIL^8bO2xP(bRJ5M5kG7-sc8f%eE}<;wAbJ6i_mO;dTP+^l0Ro)VBM^v7|wb?yd+1D zt<9WD<4SnW!tm1M=W%(Hk5rD<2FKZGoNbx&2 z?j4wt=xD`y4~1dfo9TU?mIrkl5d2Vk6W3o@OMSxi`T)$M)A~P{ZiJn6MJk6@9uP0F z65=aeB|tL>X;t)if>L#y)o!r>TZm&8PLg=O@RpX9-O5Z~7lk#x3ZLF&d}XTDD_hkR z5d<>7{`ti9Q`%^_gzL&~ZMyyB0Sox!*~e149A{OQlT~BmFJF9aVwZL&yM8o^Ti@xQ z+~6)pgz>RaXlQpU$_3ct27CJRSc&I9+NHccv0ePVyQhM8Iw7g>N#{M=leP6D=dV-Q zB|BAo5^K5id~T#5Ts1mvpbZR50=tHdQ7vz&R?6AfL1dbgTN5=?81ouLp8Bf4;>1@@ z7@ybyEYHYy7qU$?qceDHNp%o$8$4~qI>5hQWrpa4lO5fzq@MO%g9-dDQyse<4pfwf z=Bcy4DNbq+($dx4c*$Fi722M~J`POB72-xL6Zg);iYodVPkw^aDq8lN4zj9C5x1EX z%{6?q?FJ%ET`~Ie`X?E%!jmBBF!Sf4$sM))LPK^vW*(kez^-$;Rw2aUyuVP-cNA}1 zPp5o#Es3&P0{q1OFj=Eg1Rj$lq}d-!$_>)$M-D}@1?MA-*Cue?ZMb8iL4N{Z4H~JY zSeh>QkD-x@{CgU-fA?s8-rYcFJ)gkezk5BygirdBx zr~HDhvHq=f>(R5)RsM9K#q^jn2ZP|4AdDloToGkK<`3`cm>H*-)o9~>;A7j;UY@k? z@6PkbX#^WFAo37pc&(0e{4eI-GN{eH`}^G$YFH@+3KS{s6nAI~#ih7Iad($M3&pK? zgSJR^uomCjIYfHSf(F zx4GYgkoDH3w#ZBd&hhChSpF}7l-FpE%v3{34k8t4@G z_T09;q_#~3SSv%#c@yp93Nt2+i39s$1inWqu6jOty&DA!II+~>;d2`6SHx{D>k%{! z6c!@zcs+IMU zf>DKE4ddhYJ2=l7NIVo2mZ>O>ncN(*wZbUq0;|_5V_3EgX4^sZn~O#7z(qgYR2Xq2 z?&&Tj*S~^5Dw8IV>^@T}L6WnroDf6DR z^u8^agsOy+hrKGj);0ula$Yo8Ee!bOlkkv;iTb}yzEghO>kzYP!X&Vtm?|?;-0K`` znRR(4X{`+$Db*6^{Nvu;J2$=8u>w6Am?r}MDa%i=luxk;`76^Z`Dl9KS?W9@o*Lan z!tbdD=23_i@XelAtkAzJ**W{{qMGIlnuU<&#M;tfu+Y+{<-MMs!3Fn>Rx-=4@2?;o zuCE;0f^S+xf`hKqc>fuAQ@#xcM7)i$l?U@e>rRr@B>GfdUQ5$Z^VS09tVafQcm|~m zR4@|?mi*%UY}Cr+Kxj!9mc+LfOlc~%jqOep)OuuOEy2bISb}KY_G)tG&zn zcO>=P;Ae}}Ibg~|Yxhnn!s1Fn7%2FUhl#zjNe-E{7fIct+m)^$MQuMM*EIV5YM+lf z9kV8#?qG`9w~yN&s`g;EcR?~Uv^FJIlBD+Hc15iq! z;xqZ%ELS%#URnJ*Uz0e?+9<1imWkgiOUxv<7aNmVXdYC~*(ZH}`1{MCQla}L(qCrp zMVCZP*T>gPA4(pR{F&lYi~ip<>Hhng{xyHUaJ;I0^EYmA^P}#RkACwqH`Kw3R~vrI z??3LJr`UVGv%%D$Q!g=}J|BIcmXvHohkSnVrwwR&e~u4REPUp>i#e&Ds=WHVC{=iw z3jG)(?*;yVp#e(SrS>Yeg^%hc>P(;4Q^p|sZeID*vSBbaEw?fICKM`*+mhZb>}z(( zMr+q`Ha>i&dqwzFfrQNRn*QgR&&{_JE=ZCmz7{*a&E|d(Salfvl^jWwEe<3tnr-@i zHKV`RYMT*!Rwri0p6Hy+$IKb8wft7~(NP+o1hAf_oA!z`j3{@fQCSfBQ|tk^C{v@W zmFMk!ztLHFd$oMNddKNKbBeqj?}n98UU@uz1ZI(;%~o4C`iPv{NDfFm z4GOK4du(p)zL}XCoK}RjTxwZaP$X({Jx$lN_?(5xfVZ!j6=a#ABL2*l<0*mvQRXl& zN))z>#HHJh4|P&F!%XA{inA!q5+k>EiLzI1`(ptS7AoTYnPa3LJnFwkTCLAP@xcmW z9fT^aE~orG#{eZKSj?#E1l#4eZ|@`Ci$-8e#tok74!3-wYC5{N+$T_cR)|JA9oiplwhv2%M%~pMtc6zMKlDQ9`O`O192)O%6S{r9- z_UU1#aan!Jr=JFLpMq9H_UU$o7Z-I9auMd89=?;*>iU1rDkovJ5Dy&*CvQvO1EGY| zFKM~iU!yNOYT}~y)^WQ$Mj9n1J4E;g06=zi1_zbX*RLOE>~@BPQZyXC;u95Xyl^uT z8Aopp=(eZ~yWbbh&{T+%1s{g<7O3)kTcf@=xcR{Jl1<@Ow9uZI2Hstt9M_*;jjxJD zaY-uz&-8BIm2{oixg>b`io}c5zOPkZkE33c*~lkTF^~Lwzn%SF zlo~UGzJ#3d>lnQ zy0j^&p$n3m*C$zjiy$_uWi~;qC4?%Rp%Dg&+C}T>*I!eBJHxPDmk-gn@ z1+PA_cYtM067-$vrrdqzw%}Lz{K0{a?qF+BY(w$`(h9%d|94a1uElYGD+b!rLTn;b zz>4!zAd;uV8r3+qN{4m<&$rw#IFrDXTN&=q$xN`OUi$6UiIFwEMNglH2YclLNocXv z8r5D9_4NL26=w_>KwVTtlVER}ueta1%_rjkal16Xc?LgQWbAAKNE9ljia z!YG;m(X(bF`w^XJk;$hKD4})7v4+Losk;#y@zqbGw}N1%QBe9k;!#+K$A)7#n)4e z$Z#2t^v<%|acWOXe%4Y1<6>P=jNau~lm-kS!3{DS5G;xoxIVWEZKV&|r{lok5sy;& zOcFbHmo!c1TnRd&zpy)U>-6T|wj0rSy-p(R##S34xGD&kJb|mx=-7mu6Fl!_Dcj6( zMwAD;VTHB+_Hf_jxqo~3SD^r}H_#E|ZF>?jU`p+iEd*{Yd$!#ehYJ4m*7E`JYpU~# zYfpA@eRw6pgRbXHH}qEL^TA{-prAOQEL&ivMiI?@Zn-!i6HwxIgeuS-s1haG=2RU8 zoyvRGOs%Qwp|kqn!y~(5FPFyWcl3=bM6`C@SunF?QRCm}W!|w(Gto0vul`ISN84m$ z#D_`eY!wBMuO%A|M5zH}bLsEuE?51K-&8@(cu)}`KelSw&s?`u&WJ8?Kc-B<0$0UR zIb-nA95#||?1r3~iHR*f?#=w&1AtBqyprZa`2Pv8LFqoIO4LZUpHqZH;3s`BIzaBB?W3|yV z_cIV~#6<@w$TBAF{9&c*+uC1*fzWq>hGXm;YMJOkqS}Y!l7fc6xJ#?JQ?Tsh#6?RK zpO(|#V&@@|O7AgK)Ynrk6A@L;*4A_9Sg-d9 zDQyqkKy?Cg)2co69_XlqG9DxKbiU4xPSgOlH3q}>4Hx$UJM6)iAT3o@g4ad0^b&Kz z#Xo)4oI#v>?Q_pZ$$bwTNTdkOEu#hw^Et+Mo!kngB7UaaNg>hl5zHvYZx12ikxsm9 zU}>2)mnQq6!Q=*zYVF7=u_|jKw@=JEd^(i)+?4M@dp=lW#$m)OMRzt}-4nV$pE}hC z#e_M(kJb@%AD4Yc%D))#&n6`5&Z8`R0!*$(!wPg=jsZi$zE&eHWzZJcaq%S9w8E80 zhNBgMOjQ8^v6*8gRAIGO+bW-oSJUbc-Pj0V(Zlyg{sWU?t}xS9_UqQ>AdFi*Vl8tn zUwBssdFedUFF4UczvK*B-4krGd#Q@2jsHyRyf{`^`W74Ed2eHk+aML>t9vMjf=Dhk zE7k^gUPh1m^mO1yc8f4gi_yKdqsyR-wPq()6t-}2fvO<)PcPiH+qIAuS}hsHr(W#Y zeIWU`ht-op8GtMNV@!Wl&%dU|VsK0LNiBPu)2pB1bV6%C#jrw&RQfw9jGr$QaIW3< zYHF!aZt82+tviaJ-!!K6(weke7^|^ z4g&pkOsD01iv3z4_4c|bT752#=QQF|`^Qp;LjgXLb*FHqT_nnXeeO_?Q+`KV^O^JF zoA;hQ$29~XlD7svx~neTi2drHtY|>tEo5iZH0CctPGsx#D1)F}NH#K@bJ{$I$&zRPns~b*>?Sb&)gE zc`1~aYeqkC+1By3rr|s!Af&-$>ZtX~P)u-jQG2u%{>HIHOOS)qOTFntVHD%IY=yQP zlb95H3HWKsvV59wrO?Ja$Bh!@HB6*q)qWv&v>cjkEV3n!0zUBw7<-T}{l|F|x{A+J zwRK@3SepHpZr`T{xRu>gsuT$mP|96vD8;tYfaCl|A|iMaeR>cH*Y}r^l#n( zC}873S7Ynm@luO&OLPpcPReA;$ub58z!h)>yH!3a&JN@*_pgvgIA;mXY+;KM-_%M?W4Q5Qcij{TblTm^{+ykt~5~}Y|VNT5QRsDIPl$dQ^ zL>nPQ@;?2ru;4@1%HxvP)a5>&av1VK;1U<$7FWIrhMZmizd8TyyuXCX(ys7>jQC4e zCO|;RklfmxXV{bC8LUgPZ{r4dc`kB_3t!get?i^zDO~erS1V(G=!Gpx!@fO~1Mu7M z;s_+uQA}G|eNI|t-N#ffmGX9hHtrhj;@FD>7XhpPy957FHSP5cEPu!6k0!Vqp=X(_ z)z%JAyBN{x{c%wZu2{E~gbqlJ(*bjX146eR>{`5>x%Ap=+bX6Jp2ff-gksz}Na%uL zu=^yrsHw+Fy@g+9+Z5v3MB;e9yu->)->5|Rwlkdj;@;h8*#xs#DV199JV&HqyO%v>{}&9}e(8VyllroBuX+!3hmNt*b32_2>sFALdG!rd0M z3k0e^qX@G-s#VOsD$&XRYIFv_a%Q|oj?RZ#v<)?Br-gjS93dJDAcn)&&H|htEhLU| zjL!8n*wg+8tkH!Ij7US_FZdmdx7zzjKYL9HA0J?|VeAIn8e{^6 zk^W|!Mo;KaI14LMr4uD@${cu71PagYco7rFt9IFs`zk)Z`~8N0Ta6485`n$m|8!2U zAcw-@_QZEi+s%r^6EPM_n(U`+*jPx``ZunD{XU2mb0g#2H$iP}QTC9z$=CO4BHev)+a|GreY*p%TF0 z5GE_%e%v0fjF>VSG1YxQkO@lT@2@h9d4lZbpA4oKmaApW+zjf_=pH`In8B7|OTLYm zvL8BXe)aj=i$%pIsSXAr=qLxk7gOcw_6@f@X<@(5!MRsDxU2zqX^h<6UX7uc+OeD}-K8`!n4Dc^ z&Ctx)WD?@Cd8=+JhoW@kOfp#pYKM^(C_qBO9=HZ>+#d~M$!`4Xn8!dS>yX>i{6xou z6f+3saeleHrjgo}<%`NB@7+KD<&75^Rd6WlS@xp@jEY-ksb;9}0P+gVwKRfO# z1xLeZ1sb~OAEk{SO|1H6m-DHP1y4MIj8C~-u)qWn=J^8SVD&vyoCUd=pJBO?6Lx+l z53?dP#glx)7DPpYqVYh4}X>YF?K}RJ3(Zy?3$*4$%>B)M8AhUUWvyL z%+ML8py&tIIS@+2m79e1rIQh8^_Qoz-PQn@`L!HzEY%Z^+Ija?`tCYIBopY2EeIH< zzb>O1fHh&(@;9u8fg(gPM=Ng(27y`gU1rrJ<;)~xEP-G(ALNBO3X9GZB>zfvZ8}07 z_7=atj5^Bd-|k@6U`L630&Cq^{(M751~q4GAL+f_jHN53nhYZcWp|%5!y_M~g5c$~ z!mIJP8Hrwn6f1Iuo1Oc$C<~^toD|L`g9#PU8cO}1r0z}J8+*SDu)dadSnsQ#YuBM{ z9K8OljM*}acK}i^Cnwp&XFBvMr-Fwib>G5;Vac*iK>h)7MXqb?u!NwpXW?%BWcs+N zVGk4<#C}vBH1SLxhdla=LsgIm_WmEM`tW-G1RqcQAkhE>E!y1dqPTqUaTbvEPMs8n z_k^*YmZ~(Ai2o#eJi{Qi!MycJbCix2FGDsm>XDal?cv|nJm5Q}=ukQ~h zYK48cp7~RsL2~0+9)!_t@L`0ITm6NJ+vKEf+olGhx-G?C_FNu9)$(mSLu>Q3w6twn zNW0)7i<6qDw(Fb8U`*{+M#zmMlhWC>%e1N7zb&D!`$X9W0HkQ8AI69hz{AW{HGdlZ zbxvANtKv&KnuP@)eu80A9(ZPkBFWY`4bh>Bq80WaH^K7@<9{D)-$?kW$-Lav4W0i$ zCqwtX@1tL&Vg}3KHvBmlp0bl3qEB^NHZVSzZ3$EpW2(z=t6wpJuRt-U+S`6~otQ;8 zBremOc8`It)BO^CjA_%T*{x(_IZ+A7Z72ag7p3?<5!l<8ITy+r`-umyRbSc`bBa_u z)VTj}x9%=!js8^0vz=c?&H)09x<+;`sy<2GH^zyfx&Jz^Idfe&vb*nW5lK>OhPO@&hp2y622;s!_5OBeAZkq$oz0Q6=G|Z@)mqVCEa#@i(JdZGdNx55q zT6mq$y=ASvW!Fh93GcO#1^Ow`m8~|q><*Lae&hXiN`Wn1%+0^Dp6SvEc-W`Q-#T<7lbNo@ZV=}&VQf5hX%982%^bT=>NN2rT%$FEjwHQyH@-_KeHrT zqW|DU^N7mW5a`q)kca2C07hxOufwhUvD{Kb?6SY-H%K!=&cG6Hp;6@H#a)%qQNK?L zYmzEE_T(tv%NZ~CvD%Y54+V8@7c2Z#O}~~iCF!Q9-dw4y4qovd(L1s%W$ERR?bus2 zGO|ay1r9fJrst;hOD@IUw=px>yj3!74Z=Fg+5mX zhdrsc1h0Ng_QRZ#T3|Mftq?EBti{tTz$E`=Kq%sSL>TwH)cia0fM(`!X5Z_!-BNaj zB+;ZJS6iFY>}lRDt$VH?6wI42d+Yz;Lp$G>Bo+TgAcL* z+y&XbDXpogK+^qHyhagm{Go;q0=Le=zQ^>I#HrsO={I_(ALbR564F?yT>2-sU0@nD zSCli>+5^789Ru%0kvxn@Jh$DvP5GB8&!FLR^ec4yAJT@IO3Hay{|?wZ{Tyw7XN9#6 z6P`YdJVHFeGt}l^)fu5Ro)3-rm)# z`F$uP`L}&E)y|gD+89)^o!+ApqPb;;H=}O8q+t`1-CSC?j!WVUs|0|Zw`if`^=GG} zY^VU*ZniVNzzdT{^&9{HU=-pP3Dj-Dj#bRk`j^YC!7Ovk(wbK?{Z`e4D-oF#eRAjw zVrdCVtl3R>C7+~T9(@vzk9f;ZGptalG^-)W6a6}Kv+~uZ>k-#I>aX|Nw9}gk(T!}h z;{P96lzZs_J+ruu@a?kYr$LJTFHJ^tpYl$>!H57j@8C2}sLX4pyDh!jjt8#}77_hz zXvm0>-tBkaeNtM{N$c%Z*hMmIoF!pSs%NWnw-wT(>$!?C?LW4zgVvPA%eV!16WGu5 z7aKniWQ~neIzoZM&#i&F3lj6{DeesM^rtDls$YFy24EVbI!iz1bG(^)cq7!kx|9-C zb_M#&j`gO(flbTsI`0K0tj=*%$B0y34Ov0f;q za~%_h&xmK-PJQ4gZ!oeBU96`}+8(bUX0yGqF z(8gOB9Uu@DZy=TL#!4a#KGw(kP`J4p|FCB|whAq$%Bo_m zOMNKg6ojMXeR9)Bd_VjJqwV9?QDctLRlrMtaeIAUan4=E5S}>$#=gbJ&!7uoy|y9)?!^ABT^VQ0p4XfDAj!#OOg8OliAkZo+iW*9sE6)U!Zw^V zUsF=E3Ax0XjAv}ZnZOwDy||LO$5Kg!w3ujh6W?|-?P(FsyCy8b=~V*l zlb4vL##;uACg#aTRF|gH1DbLLPOuZPBVeUgSX&}6%_4yI>w-G|#^go0nq_16%^paF zPk`hMaD$}Z>bn=qDbJ|Tv4J0~d?8>FI=|*8B#ieA-Gt;hetP0xp}sIF&f!;n`9($Y z?JH^Nh2+W|2g%6Y&99G9e10mkho^#T`n`%fbgfUkY61^!+2L(-t)w4IH=CB0!yJfw zK9cHUZt!?9J>U3URDKmGtLm$M89MvG!BcEj&3@Q%_T55PYvcZ)Y*T zvtJ8?9NTG=uO88*Ytuy(`dgMv(4e%+{!klG5!Uqur^yKD>yjPbrz)^*OmoalZCd8iG&# zC(u$h7AmusT*Fs|yqwqa8<&&WII#J&K^^IPm@$Z-i3i59#4c+rUfG?Mvn)_Ocn^Eg zgPUE?BZhi}T{7<;GdNw^`*9SDz3rc33GP{}f72!Qg9M(AK#?k23>lRH{W7cg3b6bV z&ADaO|Cd*&w~$}xN%w4SO4Q=J*fEB(EBK*ym{oh-R zs}!BvfzAIylE8A3VLf1S!0QL+)OKPuZ}FTX7Ej_*_53NEFP z$4c>PVf*uj>R-Qol9|Evrs zXhJ_WoO7J-O8!`pqMPw8daTe}zoN@EanA3o2H%3128i7nd!Nbp6}# z4IFR2FaIJ&u*Av0XgVbozWJ+xUHwjyxWZgcaBGQ8kAJ^TjvCKXWN9Qc>u(|{YF z%qJ9cKAu3`>K|)`3hx{)G&c0*25HHJWi|GPl2xmxWvw0DUF2tel0v&2Wqho}v6+(6 zDIwbY&JuhbFV*nX0<&wuE|cAO8Pt#Z7sjF@^TEP$P$u{&++<>`Vv}q1O`}hVR_EZn z{y}ASF=HwTF-fN%CU=&aGCl7lNP~+zVP@jntgKtrEsoiOX;=Ca*-yjj{wNrXe_vj?KA0wY|uH*6fLi+hekVvUi`r+5#o@aiL;fWZhPTYkY z`^}e#SYcU>VH$_7)U664xD1ANSqfI~yhqA^?Vnn-Bx9QE%D%dltD=%kErKPdc@2T| zDPrX<85}z2BlW^=xw@AzHi^@~#n>)gXwmBS|3sYFIn{Hb;H!HW zfL=0}HFP`lUDJDf<06CC-&~!+h7JQ2%1{1yT(F?GWSKEVajX}PtCX5e@*a_m#BW<*BrRfhBImh?1I{XY(xc`Uej3$aB+Q$l1N-Ow<+nnA zTEDU_xwrDSRG4JV{6~1+c{uJF23eV$~yjBd5%!*^~I$~YM=j@;g zkFFBA|NM1;M5&|cldG>m)LFqhwz%;SJIpFIR3zpsqKh#zo^eR>DJ4O9krISf+upfTDt+J}n&iqQ4 zPWeib_%4utV@%*A*n(a%9`}Bh2u|1)@FG-{@O*%EeEMy!oYV7qjw_U4&;=!?Dd)R9 z7JM{6O?0aA@#dP`CLatsOp+ofv%%L_gC8HnidnezrU2dc`PJhlKOLbu&vd0H9tmv9 zu6eJ9uFm5ebGOsKv+=-H;pJ3Wa(tT3HJJ57b@c`&i&yIR#pK-*X`H^CFXL}_W@Pmp z&R&qb!CcY={o;^B;(Vf2P;|Ix!k45p_jfI;yTj7du_Jqgnl0OW~*u5uT zeLlL=#kvB0_**-Jyc6@9|A2Nb`2Pd#+`zoQKR&bH`Saj=|J2*~t$u*fr)a~7ApHG6 z%)@JNe#1-l&;H3Ub*J3ASxEVed*{zy%Abc%asL+is5JR6S|9rNeoKe&2#v92=o<~^?;KH$!HPtifY*DeEtnsohjq1paJ|%3|ew<PV=RXRpq;Wuvy60Zjh*|(EB0IK+UWg{DaR6Y{?TCun!_@7*#p+m`f87 zI$mD+Y)il#lEBSgWxNWJPZbb88i2j-9}9BP;+Y!N$odiJkTBp8s1p@g{dY`W#Q9f+$qcSvX=F^qGRV%T34x6CL=)>7P9@IAeu=E zRgI@a`y4?`IW&bIm_|MrRK2ZDmFAe8Iji&-#Ygc9#U(0Qy1G&_oI({DfT^d*Frb*n zMtOPjWkW-xv>r551*g(hv#i>-Omkdf(^UYzg8(t@G#G97t?kR`&UuP)5$nK4HW zuUoA7@NnJvjHWU7i*zFu`ZBX7x0McNHsW8DQ&Jf5=@2iXs*c53hi@r6DY+Bdqp|}Kk}^^_z`Ep~E5c9sQ0d{f#}DbFqSU8O)}5>TEV0Pc(_ zta9_7eP~T$30>m7%+%rba&hPS3M*&t16ZNS*I)$?Cniq`$A&%6kpuXt5(kuIddi|X zfikvd$5*Jexk%AtEx);A2)v3f`Od10b#QWT8apU+kEUthW<6|rC?Tr$%9d0 z`YEv?T$RHLq+9{YQ8S)$jAYSu^9M0DxydCl@Z)& zNAwP6X411$yy&2!BqKg^enmW(#2_kcIM2}EjE8@Pok&IgiLz+*ud0H{2iJxTtFE98 zSXj+wLQqaC7~eOhW^rP9gb*~8>;ku*n4ey2Mjnv&*L;NEp9#2%OmXPzTk><2Yx{~^ z4<4-eNk=3`R)Gt(7ev{a1oXscT_X0iwFRQMf?m}Hk~0?B$O$7y`cr)s1J|o-Rh|+P zCC%<|E0RvD(2KB$i>Pmq4UetlpT<;8TMcK>c7g2X)4$KnO;c@|E!yOLZ+18GJ^oHx zb|{#mK7};1vSa0GU z2Zwfy#erSV1IoELCCF=Wd6V66(}5}LWuInR%ia9;Z1XJp6-SJ?AYWjCbo-q)=bvWM zh^pw6`o$kn`Z82;5`J=X+O2yJDK^qdkZ2)ewo=C^LV z50TabIB17grJW-YBI=l52~0|k{Rv9oI}v`F#yR#NUhAE8&prc9X8{hCO;gj5N6;7g zr<19}rKcO;IF?L1@Bt0oL3D#yWA6-D_%5XNS~#Wj#0cOXQPeM8?j!Nw(wlCg+D{5& zNCJ4`s@K}#lNoBmPBqqnM<=7cFMlw`uW~wM?@sV3D_5r~!xvpub_!wH&R{ZJt;>%7 zveoPdBF}Q zE@=%V1TfFZv`7wqYH6b&F@kRJkUN??U*j^36hE|7VA1Evm1Eulk|D*RT7)}uiMKEA z7D-$mWtQpw;vCj5uP{cX$2oIl4@Fg7RWc*H8rH(g=k^Ay+)Ct0=wVHza^Y3dJM3}( z$21Uqk%D7;jmjC!ma7j>FO7alza?8sYL^_($Kma<_z)5A)n{x*KMCH7HUZ}eTtU+=$DTDe;* z70YEZi)BYFkC({Q#7SnO%!Za+@$yV;^=k2)=)wCzwXW6*IaX~@G~qRCz40JQSxlM` z`t57^#33=RYuwOxyTk1DXaBYQsgV??1a=peIwU|3%8>TNzJbUkb6~DZC&1lYZ0a<<5NxS74y6&n zM(CLuJM&)k{RoJCd}Q`iUm5*?r7@s<^z8gnawgEqiUs;%knHp=LUR;Ur^>IBny5K` z?C9!le|Ut_9}(&T5civ+gs<-{J0aEcM@}%e6@q90cBbwig~$TI0<&5-p?gD?)sRIv zxtud*fIQNT!jSf3Wftv$@7O|RDKoNC(Icr0)%OMj6vxhq3wAFyyPU&B{FwpvuT|2w zjd%JiR2$ZmPAyEmmjY2#auCyL@fWq0SnM0AO8_af93MC`8~D;1F*oBst_~==1YaEo z#4t>=kH}}gcEM(HkZY-mqxF3A{u&<0Zb<7x99F6F`3z+|Kb1ytPM>(0c3mC`S9(Eg zW1)q3+dTA^SA(rv{Bg3|QrJYQiApbt-=Q|BPEgruYes~G#GE3WrT7axAKQuPYRcpA ztQ7&^MjvBwIJE#}%Q#B+en6!9PssBFi62qc=4_yMi2 zjJw25WV(Q8D_&X*jyq@aSC%?2HUm_{Vh8LtaiQ9DW2teXo`dx+qMLj9LJj5NX*}5Y zStjJ3$~MKHwUvQ@&XaEL(G%IN%#etO&~}mb&WLY4kIOj0XuZ1KMU|f68J@es9I}(I zoKlsEPT0mHm0Fjvh&5{bBD@op!)<%om7=)OG8UHCC$c2Rg{CjiJgjaN-t*6!X8B~+ zjyGsF2YxsZX=+eTeZvOz5OjS_BOr5am)$B(h*d4=H@6ml+CA?Itj>3khQAwZs?2Gf z$kgWiDV#`s*0@zSv6`b~BeJA|Err^=pOchy2h$*HJLa_j%fL3unZ#b<=ff#e zK>5jTPGL}5K*v$c3jo5chiR+mG4jYQ`)$48V_*t>^5~)5GU6&?$JJ z{wbx5I}4S~j%Z5KGicun4kLd@!T;TZ!KG|A*QO(eE{&QK4h~s%-v@)%m#H&1e>I?G zOS0)2}#L`WofcT@r1IQIAIC4Bd$8V0EKmo8Z`;7r#G2pDga+e>_> zpemlH*rBw^AN*Pu#Qev3r4v>2Yb88?HZfwIJX8z3+7i(R1E6%tmBuKK)DhknBsQ0) z)@C~MJ0Y>bG>M)ZZzhkHmC+rLr6s|JP^?&Na3F^x&giW1!dcfN;}Zy)M3C~?8EjE+ zquAQ^fJ12N`Gk){{IlC4?yLsr_aAACJI;hkSPak?U5A>g+EpggcB%=ZSPUHdsqJ?y zZ8F5nf$D_cOZ2F=VmU7KzW?^qj+2WN;KFK*4z5gI zMa{cXYQj4hbvhtA<-Efhr$^+aYRl(nDn5EBWcXU`) zH4dTWT?voZk|s?3VcAw}v5P&V)@z*3SRG=zyxq{BwL4}xtuA1EYRxY?;OalD#N$&52w@I|pA?%3I0c(n;!0xL##s-aa&cM$#(xxuw zUsf%OP>lwrXFg?f<~;hPzL_;^+bz{|SMI5u^JeRwHL1QEVqWM(v;HEIK%U0To%kI{ ziDkQ}POUm2MJ8O-a@^S2z+kN#?$^o{L-%|%Z3g{yP(vELss?qa6A#12?;z$?p04Xs zkdI_HO*kOG?;xop<1e<=5AdnX6sRaOv7bTcXdX6*3Duvscjm$DjZGHJJ`T4_b-6Ur zaQW!(o3*uX*`=?HcVuOj63n`-pRvS>|4J?B3PL`6EOuO9A{(tV75nD9k*`&XKY76x zYgmq$b({^i96h_4aVXg%v!=JAR+_f&iZ-+lnQ}4dXs$qE)yomB@Op63O%+^wU2`B7 zyRN~B>|Yn+6laX(Aj%{Y{U$is^X)65Thx|~)nC|_qVD;^9hwa=^)>C7SMg8nyyPr6 zRgc>G>@8M&64nn9B22nw*GC>!{3oqFvDLbaIpwS<`^ zAn*_DP^bN25+K((`vGgbi5Q)R0jHX4FWs|}c9Le+bVuk+wb64BG+ z6v@jENB2GQPnK7Sa3O$o(`%b>E-0KuECo? zNHt39ZSXLia}rhOJ@1|9Yj+SE&J)nH-xXv2`LCjFN@(7km$Z!k*sggfTatamw}N$B z4%nxUoZWL_MUYo~iDo^R$3kX#>A(H7Ti<70lm<~1Fse6RF4{U9-l=OunSN3xnb2zf zMQ=&aSePSL3bHV2nS1-D`@q}qL%fW{&G9Eu-O@N5Q5E^7q*>9_C{J0S)|;KAH+oJK znjF;-c}w26(H-N?MN&qzS?z*3`Xd$5BeJY;t(dNi_=&Mfp@bS&kP|f~b{9rhSiD`$AR zMWtUZQn*TXHCzuHP?wH_^gpa3i~{pQ#7Mk-9Mew*{%+O*URO?a6 zG{VGGtcbqcdw$#ybnLLbbsrrxq0VyOjd(@;-Uh+u4$}tfi2UGAEacXtEJKGKaU0=v z*tP5u(dhBRdOlV=IcU-jZG%cNP%|$a=sZ2xL=iu+esVFPx|~}I@VZA=bV!R8S4^ao`7be#mV39%MQ(t4Lhqs8tw0WV%_myG5r=j|X} z3>w-?R+2Yab%sIi1D4Oz@m-8MtUYIk;5fKGOYjt4AC)|9%^{1m$pyE@L$pzj2H7`0 zcdyEhs5rq!^%HW#DfaKH8En%#{Kz8OcVfrSHf?s2z#^82asYCxj9p55uekM|bCiGz;F=_NJ35-<{9QSr*tqxO=4 z6S(f_$?-iRM!%kZYYqNT9nIB6p&tM%HM&qOo0`_$-all$ZAhDgs4H#P2YAgr=fagJ=xx-`GXEsQdNq8LmFG|6=#01=vOnvCD^rr__xMHu zYWt-$feabPZcbbyz3r<4vA`|Pc^?EKO$$Mqq`tt;oEpj3h|c><;`QcWAi&DbQtP>o zeHAHOCB!x_Ik4Hh41`da4g~sRCX8*}2LMOpNIYTJw*&d?FF-dqDgxNj4HLUlwFB|q zXGp9wQT3f3jD1Cy8=>#tz+4J4c`ZM)G}2`Ph{2winjasq<{xlcoO9=FZ~Zlz+hL`D zCrb2;l?Tenk}En8v(60<+{kTq&*OW#)mZq3d;;Ls^1VMw-ABf@%|iuqyMo~VZe+)+ zQxhfQA>%}M$!w1NzdL*>H!A&_L2%aZ?4xXVaF#5dHNA}ORkoB@)4f{noj8EGN0B&1 zMBvB}EHU;z`>@rE87JO{GH`p#osGM3mkJr$TxnG>CkJU6gSawn-|-KJ%|Z=*{>0gE zO+uShJ;^{u!{^`RY#PxPrK{v&!)&a!mu;nu4Mvbx;$;WbdRWNGzjFe9GSHA3-o6F=!iHvP1Ym|%fx40p)^>4m<~7r>)9eZgRECK z#KF}~Kf4y&SR16J28T~dkj0fo;Cg+3-d|^t0+w$2&302K1j89SW!i*hCa3$#;Cy5| z%Q?~vPxM(O8H?BSwL%==OgF$Cu==j%K94QV+DE^o5^ur-J?UQ+3*H)2+lsi9e3y}w z79*q)!|nF<$2WaT=k_n_O)9Av!`)2{%3Ah1HqxB1;`bmHk?$ZHS<0YVcabVch}SCC zaJPLIvSh#*7L-N%mWuBeI4$b3rlO$BBBdXx`}vw+Q)Im2A@U~grkdlIN+(1IOzTeF z*fJDFWmRW-cGEAhU}p{s`Y*O@m8VJQRp>IZchFBR#{#%VuQrqr8~vJ8#=lb#o%M8q zQTFl_gtYJ9(DVg|h-pXTj?1zpW{^y=LwEqt%gl{3q9u`0EQMH!CFDYL?fZHda<$#1 z8=|r{w>W=08@a{4H=3Oq2)cv`jpt+Y@Z{p9_StRX`Drx^PB-^)rVsY{9J%gt?T#oj z@H+&cO7=n%=r5`|u)2G*J~jDXN!l1`SRMy~G3cDi?cXMzXhiUBE1FI0SqIcEV0fbX z_}6n?%a5S5gZPQgQ@>N9=^Z1QP%_D~=4i_{6{Uu~^sx4Dy2LMoV#U?nSA|-bq|IVj zoGoDa0JrXIrC4d>G2;t9KyYrKco!zt(v;iJ;-cK}q%3yhdS}4x`xc$^o>4TIM$T9Y zyWkIr;ynZNFb>Gs*Jlo?Ja3?+OHU!2UnaVnA}X2TlbS?xFPRIn;u;`ZJ_m-g9GFH( z1DJv^(0^ebrt7@v*|j(J4yC#ulYOWg?gr#C93OsjW%yG_|G9BaIEtkPk*B?>loHRV zE$@bkR45S^IXhZTa05tKFw~YXjPydU4^i;7t*(Oue5%I7g=&ifvmLyy=%ml%do2g& z@D!GsvI7;3YX1vSW*<9GwdoeN|EGN`4~KGX?#d9;Hn|0t9i3z!gwR*do-^zD|6bgd80A#6MHlfoZ!N@jvRV~+a8{fW^TOt-nc z-0upQD^|C;W)b+}y0SAX5aN>QF`PDEzt*NU2A^`RdMN|CNHRLS2tJ&VY9I-?-&`*= z|cvOZEv#|0LOx)jcwK`~yVhNkwLmp8ypQ6CvA+s}eG^9RS& z98fw-DX&Uz%>gQuEcfdthteLM?TOK(tSG$b7L5v`*2jaiERm5kH&p|){a}N#NqxP4 z)9}=X`h_A3&@?=&9HY}cb`|DEW%O&eda}><(lzy|J-ByM==EOii83XF-%M5QlE0w9 zx|SsxD{ZV-)Sh2vzipaZ2~A}G75TwTa!BixX6L5`8{v?n1?CdocN;hEf4bOX(FMNi zoW*z@1o5rY)dq{SxqZ_f%*mJzj_T%2{VNa@gx-*LaTf6F3|%jXwu!*(e&jcgPt=7D zWABy&49=L#&LBVt{*#AXjRnKcqkki3f&Sf8M+~XjI$m#N)huN2;=oT4uDX_ADs59vWZ>7~IlT6MT*XKS%Be}>OLwmCVZUIjBU>vtNPI# z;zRHByB`$~T>8^!8tO81zG$g}>RVVHZiqE3dh&$p8hNq?C>@R&8&;VCiay=JuT|`a z+6gWpOk?WJip}fzTVrPah$t^N$W?S)Je@c=U7*4Ro1h~s+W>#@M*Xv6uS@cuzvKiUgN~K92Q@chq_jfm=jfE;m`%!vgY-{xb*#Utyft5m1~>n z?c<+J%}0En4`-KNCo$K(Uf}m)S4QfJ`fhng$&n7^W?78TLa!xgG!NPrKetdlxLVqi z^L^vSfUj<7yg0d}5BkF*08!$SWWDm!{+LnMYqfl?!0=L<#JUv4Ch^^quYL18x~iQX z01V2ONIO^~AH;_2#~A(y%XoWq?A1^)@Lo9BZn#lDXdu11hSAl>PW-aFBaiLbM}Oy^ zBxy{@?8YQmdS5VGO;a&lJz>}nXY$=JZDceT)E%dBFgrXAkw7seoji}#J~;~c^yF31 z0$=YqkAl=EZ4DkTGf!@X92R+J&0b{0ULS1p`-2x-z5$Z!ee;d za?j_5J#S-G{^6KOVL<86h{i>iub4A)tTH01vrnBJIo_J8<^I4WTJqA3%;Ji^y(x$g zy~g2w6is_J`j6j;YhgRd8f@F=ChNNn@z8q+g^A-hew@vcM=51vl_cw3{BWy4GwYW* zCT_^*-8l~6dKKHdl~SLaWfsZTo5}rpW;oF~gImw!C(+#N{y7_+0yD0BC7mpyV-^&a4o0muk zgMy^r+A5Jnb)h?PveVCG7Y0S5ovglkP|~@3j^MFVJ|9qr}niJX%8u|=-TgqrrsGj+1cHH_eB9rspa^;8G_fFaN6e0vi@riOb@>m{{A zVTWTg9R^n0q;ruwuO88b^71r@Z}Dwv5PST32Tw3~i*Hk~lCT>e55s+nZxh2=x>t~A zk+Q|NX|Yqg;1JK}(o0;vO`o$LUQys_vTing`%}QP*eTqwAoHsOSD1JBIR5W8?#2Ds z|C|1o+NgjAZ@_pm#4tOB{~lIbOBd==$zV*W!{>H{-O>5Alsp!f3;eCPw|BNz{pZuC zkM*jRa+geT8yY`lslsl#6fQN5Qi=B_r=+R10KFp&xY7WKpmbdN0Ke4Z6DmdGF4a-~V5gqRSg19jAl z*;=!&4AMd4EJMnUu%~uI0)clqYY>1wp0f(ke#Q|Jw7XRjzyA{dmTC<3Om$yez7zfz DeL*RU literal 0 HcmV?d00001 diff --git a/src/main/java/com/huawei/petalpay/paymentservice/example/ExampleApplication.java b/src/main/java/com/huawei/petalpay/paymentservice/example/ExampleApplication.java new file mode 100644 index 0000000..d9687fb --- /dev/null +++ b/src/main/java/com/huawei/petalpay/paymentservice/example/ExampleApplication.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved. + */ + +package com.huawei.petalpay.paymentservice.example; + +import com.huawei.petalpay.paymentservice.core.tools.JsonUtils; +import com.huawei.petalpay.paymentservice.example.common.CommonResponse; +import com.huawei.petalpay.paymentservice.example.controller.MercApiController; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * 服务启动类 + * + * @author 华为支付 + * @since 2024-02-22 + */ +@Slf4j +@SpringBootApplication +public class ExampleApplication { + public static void main(String[] args) { + SpringApplication.run(ExampleApplication.class, args); + test(); + } + + /** + * 验证接口调用 + */ + public static void test() { + MercApiController mercApiController = new MercApiController(); + CommonResponse rsp = null; + rsp = mercApiController.aggrPreOrderForAppV2(); + log.info("aggrPreOrderForAppV2 rsp: " + JsonUtils.obj2Json(rsp)); + + rsp = mercApiController.contractPreSignAppV2(); + log.info("contractPreSignAppV2 rsp: " + JsonUtils.obj2Json(rsp)); + } +} diff --git a/src/main/java/com/huawei/petalpay/paymentservice/example/common/CommonResponse.java b/src/main/java/com/huawei/petalpay/paymentservice/example/common/CommonResponse.java new file mode 100644 index 0000000..e78560a --- /dev/null +++ b/src/main/java/com/huawei/petalpay/paymentservice/example/common/CommonResponse.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved. + */ + +package com.huawei.petalpay.paymentservice.example.common; + +import lombok.Getter; +import lombok.Setter; + +/** + * 通用响应结构体,商户请根据自己业务定义 + * + * @author 华为支付 + * @since 2024-02-22 + */ +@Getter +@Setter +public class CommonResponse { + private String resultCode; + + private String subDesc; + + private Object result; + + public static CommonResponse buildSuccessRsp(Object result) { + CommonResponse rsp = new CommonResponse(); + rsp.setResultCode("000000"); + rsp.setSubDesc("SUCCESS"); + rsp.setResult(result); + return rsp; + } + + public static CommonResponse buildFailRsp(Object result) { + CommonResponse rsp = new CommonResponse(); + rsp.setResultCode("-1"); + rsp.setSubDesc("FAIL"); + rsp.setResult(result); + return rsp; + } + + public static CommonResponse buildErrorRsp(String errMsg) { + CommonResponse rsp = new CommonResponse(); + rsp.setResultCode("-1"); + rsp.setSubDesc("ERROR"); + rsp.setResult(errMsg); + return rsp; + } +} diff --git a/src/main/java/com/huawei/petalpay/paymentservice/example/common/MercConfigUtil.java b/src/main/java/com/huawei/petalpay/paymentservice/example/common/MercConfigUtil.java new file mode 100644 index 0000000..16bedc6 --- /dev/null +++ b/src/main/java/com/huawei/petalpay/paymentservice/example/common/MercConfigUtil.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved. + */ + +package com.huawei.petalpay.paymentservice.example.common; + +import com.huawei.petalpay.paymentservice.core.config.PetalPayConfig; +import com.huawei.petalpay.paymentservice.core.constant.SignType; + +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.util.Properties; + +/** + * 获取商户配置信息的工具类 + * + * @author 华为支付 + * @since 2024-02-22 + */ +@Slf4j +public class MercConfigUtil { + /** + * 商户秘钥 + */ + public static final String MERC_PRIVATE_KEY; + + /** + * 应用id + */ + public static final String APP_ID; + + /** + * 商户号 + */ + public static final String MERC_NO; + + /** + * 商户证书序列号 + */ + public static final String MERC_AUTH_ID; + + /** + * 商户公私钥类型 + */ + public static final SignType SIGN_TYPE; + + /** + * 请求域名 + */ + public static final String SERVER_HOST; + + /** + * rsp和通知回调验签公钥 + */ + public static final String HW_PAY_PUBLIC_KEY_FOR_CALLBACK; + + /** + * SESSSIONKEY加密公钥 + */ + public static final String HW_PUBLIC_KEY_FOR_SESSIONKEY; + + static { + Properties p2 = new Properties(); + try { + p2.load(MercConfigUtil.class.getClassLoader().getResourceAsStream("petalpayconfig.properties")); + } catch (IOException e) { + log.error("get petalpayconfig.properties error: {}", e.getMessage()); + } + MERC_PRIVATE_KEY = p2.getProperty("PETALPAY.MERC_PRIVATE_KEY"); + MERC_NO = p2.getProperty("PETALPAY.MERC_NO"); + APP_ID = p2.getProperty("PETALPAY.APPID"); + MERC_AUTH_ID = p2.getProperty("PETALPAY.MERC_AUTH_ID"); + SIGN_TYPE = "RSA".equals(p2.getProperty("PETALPAY.SIGN_TYPE")) ? SignType.RSA : SignType.SM2; + SERVER_HOST = p2.getProperty("PETALPAY.SERVER_HOST"); + HW_PAY_PUBLIC_KEY_FOR_CALLBACK = p2.getProperty("PETALPAY.HW_PAY_PUBLIC_KEY_FOR_CALLBACK"); + HW_PUBLIC_KEY_FOR_SESSIONKEY = p2.getProperty("PETALPAY.HW_PUBLIC_KEY_FOR_SESSIONKEY"); + } + + // 商户配置 + public static PetalPayConfig getMercConfig() { + return PetalPayConfig.builder().callerId(MERC_NO) // (必填)商户号 + .appId(APP_ID).privateKey(MERC_PRIVATE_KEY) // (必填) 商户秘钥 + .authId(MERC_AUTH_ID) // (必填) 商户证书序列号 + .signType(SIGN_TYPE) // (选填) 商户公私钥类型,默认RSA加密 + .petalpayPublicKey(HW_PAY_PUBLIC_KEY_FOR_CALLBACK) // (非必填) 验签公钥(和接口级配置needVerifyRsp对应,公钥和商户通知回调验签公钥同一个) + .domainHost(SERVER_HOST).build(); + } + +} diff --git a/src/main/java/com/huawei/petalpay/paymentservice/example/controller/CallbackController.java b/src/main/java/com/huawei/petalpay/paymentservice/example/controller/CallbackController.java new file mode 100644 index 0000000..182398b --- /dev/null +++ b/src/main/java/com/huawei/petalpay/paymentservice/example/controller/CallbackController.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved. + */ + +package com.huawei.petalpay.paymentservice.example.controller; + +import com.huawei.petalpay.paymentservice.apiservice.client.model.NotifyPaymentReq; +import com.huawei.petalpay.paymentservice.core.callback.CallBackBaseResponse; +import com.huawei.petalpay.paymentservice.core.tools.VerifyTools; + +import com.alibaba.fastjson.JSONObject; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 华为支付通知回调商户的接口 + * + * @author 华为支付 + * @since 2023-10-28 + */ +@Slf4j +@RestController +@RequestMapping(path = "/test/merc/callback", produces = MediaType.APPLICATION_JSON_VALUE) +public class CallbackController { + /** + * 华为支付通知回调签名公钥 + */ + public static final String HW_PAY_PUBLIC_KEY_FOR_CALLBACK = ""; + + /** + * 支付回调模拟接口(不同的场景,用不同的接口处理) + * + * @param callbackRequest 入参 + * @return CallBackBaseResponse + */ + @PostMapping(value = "/v1/transation/result", produces = MediaType.APPLICATION_JSON_VALUE) + public CallBackBaseResponse transationResultNotify(@RequestBody Object callbackRequest) { + String callbackStr = JSONObject.toJSONString(callbackRequest); + // TransResultCallbackReq-支付回调实体类 + return VerifyTools.getCallbackResult(callbackStr, HW_PAY_PUBLIC_KEY_FOR_CALLBACK, reqString -> { + NotifyPaymentReq callbackReq = JSONObject.parseObject(reqString, NotifyPaymentReq.class); + // 商户自行业务处理 + doProcess(callbackReq); + }); + } + + /** + * 业务处理 + * + * @param reqBody + */ + private void doProcess(Object reqBody) { + log.info("Please write merchant business process here"); + } +} diff --git a/src/main/java/com/huawei/petalpay/paymentservice/example/controller/MercApiController.java b/src/main/java/com/huawei/petalpay/paymentservice/example/controller/MercApiController.java new file mode 100644 index 0000000..42a3c60 --- /dev/null +++ b/src/main/java/com/huawei/petalpay/paymentservice/example/controller/MercApiController.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved. + */ + +package com.huawei.petalpay.paymentservice.example.controller; + +import com.huawei.petalpay.paymentservice.apiservice.client.model.BaseGwRspWithSign; +import com.huawei.petalpay.paymentservice.apiservice.client.model.PreOrderCreateRequestV2; +import com.huawei.petalpay.paymentservice.apiservice.client.model.PreOrderCreateResponse; +import com.huawei.petalpay.paymentservice.apiservice.client.model.PreSignRequestV2; +import com.huawei.petalpay.paymentservice.apiservice.client.model.PreSignResponse; +import com.huawei.petalpay.paymentservice.core.client.DefaultPetalPayClient; +import com.huawei.petalpay.paymentservice.core.client.PetalPayClient; +import com.huawei.petalpay.paymentservice.example.common.CommonResponse; +import com.huawei.petalpay.paymentservice.example.common.MercConfigUtil; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 商户对华为支付相关接口的调用 + * + * @author 华为支付 + * @since 2023-10-28 + */ +@Slf4j +@RestController +@RequestMapping(path = "/test/merc/api", produces = MediaType.APPLICATION_JSON_VALUE) +public class MercApiController { + + private static PetalPayClient payClient = new DefaultPetalPayClient(MercConfigUtil.getMercConfig()); + + /** + * 预下单接口调用 + */ + @PostMapping(value = "/preorder", produces = MediaType.APPLICATION_JSON_VALUE) + public CommonResponse aggrPreOrderForAppV2() { + // 组装对象 + PreOrderCreateRequestV2 preOrderReq = getPreOrderCreateRequestV2(); + PreOrderCreateResponse response = null; + try { + response = payClient.execute("POST", "/api/v2/aggr/preorder/create/app", PreOrderCreateResponse.class, + preOrderReq); + } catch (Exception e) { + // todo 异常处理 + log.error("request error ", e); + return CommonResponse.buildErrorRsp(e.getMessage()); + } + if (!validResponse(response)) { + // todo 异常处理 + log.error("response is invalid ", response); + return CommonResponse.buildFailRsp(response); + } + return CommonResponse.buildSuccessRsp(payClient.buildOrderStr(response.getPrepayId())); + } + + /** + * 预签约接口调用 + */ + @PostMapping(value = "/presign", produces = MediaType.APPLICATION_JSON_VALUE) + public CommonResponse contractPreSignAppV2() { + // 组装对象 + PreSignRequestV2 preSignReq = getPreSignRequestV2(); + PreSignResponse response = null; + try { + response = payClient.execute("POST", "/api/v2/contract/presign/app", PreSignResponse.class, preSignReq); + } catch (Exception e) { + // todo 异常处理 + log.error("request error ", e); + return CommonResponse.buildErrorRsp(e.getMessage()); + } + if (!validResponse(response)) { + // todo 异常处理 + log.error("response is invalid ", response); + return CommonResponse.buildFailRsp(response); + } + return CommonResponse.buildSuccessRsp(payClient.buildContractStr(response.getPreSignNo())); + } + + public static boolean validResponse(BaseGwRspWithSign rsp) { + return rsp != null && "000000".equals(rsp.getResultCode()); + } + + /** + * 预下单接口请求参数组装,商户请根据业务自行实现 + */ + public static PreOrderCreateRequestV2 getPreOrderCreateRequestV2() { + return PreOrderCreateRequestV2.builder() + .mercOrderNo("pay-example-" + System.currentTimeMillis()) // 每次订单号都要变,请将pay-example-修改为商户自己的订单前缀 + .appId(MercConfigUtil.APP_ID) // appId,需要配置为与商户绑定的正确的appId + .mercNo(MercConfigUtil.MERC_NO) // 商户的商户号 + .tradeSummary("请修改为对应的商品简称") // 请修改为商品简称 + .bizType("100002") // (100001:虚拟商品购买,100002:实物商品购买,100003:预付类账号充值,100004:航旅交通服务,100005:活动票务订购,100006:商业服务消费,100007:生活服务消费,100008:租金缴纳,100009:会员费缴纳,100011:其他商家消费,100037:公共便民服务) + .totalAmount(2L) + .callbackUrl("https://www.xxxxxx.com/hw/pay/callback") //回调通知地址,通知URL必须为直接可访问的URL,要求为https地址。最大长度为512。请替换为格式正确的结果通知回调地址。 + .build(); + } + + /** + * 预签约接口请求参数组装,商户请根据业务自行实现 + */ + private PreSignRequestV2 getPreSignRequestV2() { + return PreSignRequestV2.builder() + .appId(MercConfigUtil.APP_ID) // appId,需要配置为与商户绑定的正确的appId + .mercContractCode("pay-example-" + System.currentTimeMillis()) // 签约协议号,每次请求都要变,请将pay-example-修改为商户自己的订单前缀 + .mercNo(MercConfigUtil.MERC_NO) // 商户号 + .planId("100") // 协议模板ID,该模板ID是商户在向华为支付提交代扣权限申请时由华为支付生成。请填写正确的协议模板ID。 + .callbackUrl("https://www.xxxxxx.com/hw/sign/callback") //回调通知地址,通知URL必须为直接可访问的URL,要求为https地址。最大长度为512。请替换为格式正确的结果通知回调地址。 + .build(); + } +} diff --git a/src/main/resources/petalpayconfig.properties b/src/main/resources/petalpayconfig.properties new file mode 100644 index 0000000..67a31c5 --- /dev/null +++ b/src/main/resources/petalpayconfig.properties @@ -0,0 +1,16 @@ +# 商户私钥 +PETALPAY.MERC_PRIVATE_KEY= +# 商户号 +PETALPAY.MERC_NO= +# 商户证书id +PETALPAY.MERC_AUTH_ID= +# 商户私钥签名类型 +PETALPAY.SIGN_TYPE= +# 华为支付服务域名 +PETALPAY.SERVER_HOST=https://petalpay-developer.cloud.huawei.com.cn +# 华为支付服务回调验签公钥 +PETALPAY.HW_PAY_PUBLIC_KEY_FOR_CALLBACK= +# 华为支付服务验签公钥 sessionkey +PETALPAY.HW_PUBLIC_KEY_FOR_SESSIONKEY= +# 商户号关联的APPID +PETALPAY.APPID= \ No newline at end of file diff --git a/src/test/java/com/huawei/petalpay/paymentservice/example/QuickRequestApiTest.java b/src/test/java/com/huawei/petalpay/paymentservice/example/QuickRequestApiTest.java new file mode 100644 index 0000000..34197df --- /dev/null +++ b/src/test/java/com/huawei/petalpay/paymentservice/example/QuickRequestApiTest.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved. + */ + +package com.huawei.petalpay.paymentservice.example; + +import com.huawei.petalpay.paymentservice.core.client.DefaultPetalPayClient; +import com.huawei.petalpay.paymentservice.core.client.PetalPayClient; +import com.huawei.petalpay.paymentservice.core.tools.JsonUtils; +import com.huawei.petalpay.paymentservice.example.common.CommonResponse; +import com.huawei.petalpay.paymentservice.example.common.MercConfigUtil; + +import lombok.extern.slf4j.Slf4j; + +import org.apache.commons.lang3.StringUtils; +import org.junit.Test; + +import java.util.Map; + +/** + * 快速发起一个请求 + * + * @author 华为支付 + * @since 2024-04-19 + */ +@Slf4j +public class QuickRequestApiTest { + private static PetalPayClient payClient = new DefaultPetalPayClient(MercConfigUtil.getMercConfig()); + + private Object request(String httpMethod, String apiUrl, String bodyStr) { + try { + Map body = null; + if (StringUtils.isNotBlank(bodyStr)){ + body = JsonUtils.json2Obj(bodyStr, Map.class); + } + return payClient.execute(httpMethod, apiUrl, Object.class, body); + } catch (Exception e) { + log.error("request error ", e); + return CommonResponse.buildErrorRsp(e.getMessage()); + } + } + + @Test + public void quick_send_request_by_post_test() { + log.info("RESPONSE: " + JsonUtils.obj2Json(request( + "POST", + "/api/v2/aggr/preorder/create/app", + "{}" + ))); + } + + @Test + public void quick_send_request_by_get_test() { + log.info("RESPONSE: " + JsonUtils.obj2Json(request( + "GET", + "/api/v2/aggr/transactions/merc-orders/{mercOrderNo}", + null + ))); + } +} \ No newline at end of file -- Gitee