spay
电子围栏
用户支付下单时,判断下单地址和商户二维码注册的地址,是否一致,给出提醒
快捷支付
普通快捷支付
/spay/cashier/payment/quickPay
信用卡分期支付
/spay/cashier/payment/quickPay
会调用pos的消费功能
固定二维码
/spay/fixedCodePayV2 微信支付宝 固定二维码支付接口
/spay/fixedCodePay 微信支付宝-订单二维码支付
/spay/min/pay/fixedCodePay 微信小程序支付
/unifiedNativePayV2 商户小程序反扫时创建订单
/unifiedMicroPay 商户小程序反扫支付
/spay/min/pay/cancelPay 取消支付
/spay/cashier/payment/quickPay 快捷 快捷信用卡分期支付接口
/cashier/card/queryCardList 快捷信用卡查询可列表接口
spay请求paymain参数关键日志 --> QuickCardCommonService getAllPayParamMap return
/unifiedMicroPay 云闪付微信支付宝 反扫支付接口
pcs中pos相关【wlmqAntiFraudService】
PayRefundTaskService 条码退款定时任务
/spayRefundWts spay小程序申请退款接口 统一由定时任务执行 实际退款
/api/tra/order/payOrder/refund 商户平台申请退款
String codeCacheKey = SPAY_WECHAT_INFO_CODE_BY_CACHE + map.get("token");
反欺诈
tra条码退款服务
pcs pos相关 2024-01-01
spay-unity 微信支付宝快捷条码支付
sppay-transmit-service:wlmq-20231231-42
upay-pcs:wlmq-20240101-52
spay:wlmq-20231231-21
sppay-tra:wlmq-20231231-21
收银台接口
/spay/isAbroadByIp 用户地址
/spay/min/pay/queryMchInfo 查询商户信息
abroadTradeFlag字段 //地理围栏功能 1、不做拦截 2、拦截弹框能继续支付 3、拦截弹框不能继续支付
spay/user/spayMiniLoginWithCode 商户小程序登录接口
商户小程序请求参数解密
public static void main(String[] args) {
//spay 请求参数解密方法
String data = "8cafe68f4be77090d49aa9bf584aa6744ff17466c6d8a4e1f7d3ee6d7e1ddd4bf176dc222ecdd97536bcc4573f56151362bd385031a1236c8c454e326c1bf9df44aff8e29d1712c684b6c0e8b7f825b019d2738a01052cd01b5e0f5b710b2dac762098d9228691b15eddc877dd2d8deba8dfc2d75958935d7c34a5e6fcc0ca50ee80e5518d2213b4ef97f44de95c346d1642839e6dda36be91ba58cb8b6029bfc399a5c78a2c398c72332cfbf46af1faac94f3c29e14d836b9e77f6c1bb9a90e4e43616242321444815fb674d60c17cc0c1ba78d1b82b98d1693f3c63658a7da";
String secretKey = "04c9e2e3432f84025053ba944ea072765baa5468a7948d76236dc9a781f9735a9d76862d4d3537c62b4b0ecdf5f23d9609c99c87de987aca4ae2e05a476b838f5e9a72e3dac8f1426a3fe26aed54c2a30e6f987ad828ab3fcc7e79f8c81eba58fe6be0b6b0c98e2070a9c231af1131859d80cc63bd866962271d6cbd724336c9fa";
String smSign = "5af328310057b42d6c8bc5eb6ecf1174678ec8151d33917f28485defde976a05";
//从数据库配置在获取 SPAY_SM2_PRIVATE_KEY
String sm2PublicKey = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgc2WnU+aHb/A6XcMkB6eAUk2XWvdEzYjLrtyO5gOapjugCgYIKoEcz1UBgi2hRANCAAR5/yEu7H6TYc8QsgJ+oyIczBXMVK/tPQMAVXPHSuKPLnpSLVdXcnnkgOu29Bd+L7Mjhsizm6x9xXRznZa6HeiC";
//String secretKey = Sm2Utils.platformSm2Decrypt(secretKey11);
String DecryptSecretKey = SpaySMUtil.sm2Decrypt(secretKey, sm2PublicKey);
String decryptData = SpaySMUtil.sm4Decrypt(data, DecryptSecretKey);
System.err.println(decryptData);
}
cms
类型转换时字段加密
public static void main(String[] args) {
AppOrgKeyDto old = new AppOrgKeyDto();
AppOrgKeyDto appKeyDto = new AppOrgKeyDto();
old.setPubKey("MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEfwFP6gLCuyr5ejZamfRCC5TjnQNrYc9J95oy8sJemN0kL1u8CRK8uECptjjEwig00dalfQ09aAoqLdn04JaJlQ==");
BeanConvertUtils.convert(appKeyDto, old, new cn.swiftpass.core.common.utils.security.EncryptAndDecryptConvert(true, SysSignConstants.APP_ORG_KEY_FIELD, SysSignConstants.APP_ORG_KEY_SIGN_KEY));
System.err.println("加密");
System.err.println(appKeyDto.getPubKey());
ArrayList<AppOrgKeyDto> appOrgKeyModles = new ArrayList<>();
appKeyDto.setPubKey("JAv+Q/jfTnGH7njazgMBPM1mz4NrdXgHvUsctboRLSgiXzheB8+rAguZZAiSc1jgQJgiZUVgnk/BwukpA/I+YYLQxeMwjOhDaL6g2f3KZR6f8KUMAxUqgT1BBIz67xmvuOYRR5ePoKcO7U1+psUl1IQwPgcd016uYLqA74xiooQ=");
appOrgKeyModles.add(appKeyDto);
System.err.println("=========");
System.err.println("解密");
List<AppOrgKeyDto> appOrgKeyDtoList = BeanConvertUtils.convertList(appOrgKeyModles, AppOrgKeyDto.class, new EncryptAndDecryptConvert(false, SysSignConstants.APP_ORG_KEY_FIELD, "34524f53"));
System.err.println(appOrgKeyDtoList.get(0).getPubKey());
}
导出excel
1,模板名称根据这个接口路径来匹配的
2,方法上加注解
@AutoResponseBody
3,@RequestMapping(value = "xxx.xls")
.xls结尾
批量导入
接口
/api/die/baseDataImpTask/batchImport
批量模板操作父类
AbstractTemplateBatchHandler
设备绑定批量d
DeviceInfoBindBatchHandler
固定二维码
图片大小 308*450
exportQrUrlExcel 导出二维码接口 excel
/api/cms/base/qrBatch/sampleImg 单个导出接口
商户进件审核成功-->报备-->数币报备成功-->静态码支付类型查询收款码
脚本
https://gitlab.swifer.co/zf/cleaning/private-war/-/blob/wxns-20240301/sppay-resource-lib/src/main/resources/archive/%E6%97%A0%E9%94%A1%E5%86%9C%E5%95%86%E8%A1%8C_20240301/DML/202406017_wangyufan_%E6%95%B0%E5%B8%81%E4%BF%AE%E6%94%B9.sql
无锡二维码字体
阿里巴巴普惠体
数币专用码 二维码请求地址
http://localhost:4000/api/cms/base/qrBatch/sampleImg?BigDecimal=0.01&exportType=3&resolution=1&qrType=6&qrLogo=&mchLogo=&rgbHex=00bf00&isMerchantQr=true&firstMerchantId=221520000018&ifAssignSum=1&
数币专用
http://localhost:4000/api/cms/base/qrBatch/sampleImg?BigDecimal=0.01&exportType=3&resolution=1&qrType=6&qrLogo=&mchLogo=&rgbHex=00bf00&isMerchantQr=true&firstMerchantId=221510000014&ifAssignSum=1&
带金额
http://localhost:4000/api/cms/base/qrBatch/sampleImg?BigDecimal=0.01&exportType=0&resolution=1&qrType=6&qrLogo=&mchLogo=&rgbHex=00bf00&isMerchantQr=true&amountBd=300&payTypes=1&payTypes=2&payTypes=91&payTypes=200&firstMerchantId=221510000014&
商户自助注销
商户自助注销
查询商户注销状态 :/mch/get MerchantDataController
人脸识别:mch/faceIdentify
请求类型:post
请求参数:mchId(商户号),name(姓名),idCard(身份证号),imgBase64(人脸图片)
申请注销:mch/cancelMchFaceResult
请求类型:post
请求参数:mchId(商户号)
商户进件报备
产品信息->产品类型: 取值
select * from CMS_SYS_TYPE cst WHERE TYPE_CLASS ='PRODUCT_TYPE'; -- 取TYPE_ID
select t.* from TRA_PAY_TYPE t ;-- PRODUCT_TYPE 对应 上面 TYPE_ID
api/cms/base/merchant/addNew 商户新增接口
api/cms/base/merchant/examineActivateInit 审核
/api/cms/base/merchant/editNew 编辑
当商户录完资料进件完毕后, 并无法直接进行交易, 因为此次商户的资料在 微信/支付宝/银联 等第三方侧还没有, 所以需要我们将该商户的相关资料, 按照 微信/支付宝/银联 的接口文档进行上送, 并在上送成功后, 会同步等到一个**第三方商户号,** 至此,我们可以使用这个第三方商户号调用 微信/支付宝/银联 的支付捷库进行支付; 而我们将商户资料上送给第三方的动作, 称之为 **商户报备**
syncTriggerMerchantRegister
商户进件审核成功 两种报备方式
1,手动商户报备
2,定时任务报备
1.TPS,平均相应时间,需要写清楚具体多少并发下的
2.时间改为48小时,看是否可以测出内存溢出等
3.先测原子服务(挑出使用量最多的3个接口),测完再测整体的场景
4.借鉴大信贷的测试方案、测试报告,确认稳定性测试需要采集哪些数据
5.cpu的使用率需要改为70%-75%
6.根据并发值确认数据库连接池
终端报备
商户进件 修改费率 会触发终端报备
平台登录
1、手机号登录
输入验证码后调用 /api/cms/loginVerifyCode 获取该手机号
MerchantCreateUserAfterExtender
创建用户后发送验证码
序列号
序列号生成类
SerialNoBuilder
pay-main
请求地址
http://127.0.0.1:9000/pay/gateway post
微信请求报文
<xml><body><![CDATA[移动支付]]></body>
<charset><![CDATA[UTF-8]]></charset>
<device_info><![CDATA[mini]]></device_info>
<is_minipg><![CDATA[1]]></is_minipg>
<is_raw><![CDATA[1]]></is_raw>
<mch_create_ip><![CDATA[100.96.92.0]]></mch_create_ip>
<mch_id><![CDATA[221500000016]]></mch_id>
<nonce_str><![CDATA[1719398175156]]></nonce_str>
<notify_url><![CDATA[http://spay-root:8080/spay/pay/notify]]></notify_url>
<op_user_id><![CDATA[10007403]]></op_user_id>
<out_trade_no><![CDATA[221540000008312201003188228]]></out_trade_no>
<service><![CDATA[pay.weixin.jspay]]></service>
<sign><![CDATA[B78EA191059C54401B76A6096B972919]]></sign>
<sign_type><![CDATA[MD5]]></sign_type>
<sub_appid><![CDATA[wx43d2305b7be02e44]]></sub_appid>
<sub_openid><![CDATA[oYrsP7av8izDBdzm89Vatwoo2luo]]></sub_openid>
<total_fee><![CDATA[1]]></total_fee>
<version><![CDATA[2.0]]></version>
</xml>
{"op_user_id":"151580000088","nonce_str":"1720506133748","sign":"1E10AAE0435E899385916EAF19FCBBC6","terminal_info":"{\"terminal_type\":\"11\",\"app_version\":\"1.000000\",\"terminal_id\":\"A0002695\"}","notify_url":"http://20.8.71.30:8079/spay/pay/notify?p=%7B%22qrId%22%3A%2286589db501c945d0a9afc45bdd4e6e01%22%7D","mch_id":"151580000088","body":"移动支付","version":"1.0","mch_create_ip":"58.250.18.9","sub_openid":"opigVuFHo66AZA-y2EA2ggSpnTOw","callback_url":"https://20.8.71.30:9000/spay/getCallbackUrl?outTradeNo=15158000008830229451036784628&mchId=151580000088&userId=&payType=micromessenger","device_info":"QR_CODE","out_trade_no":"15158000008830229451036784628","service":"pay.weixin.jspay","total_fee":"1","is_raw":"1","sign_type":"MD5"}
会走到对应的beanName = gateway.pay.weixin.jspay 的service
快捷信用卡
{"nonce_str":"1720181537275","trade_time":"20240705 20:12:17","sign":"21CFDB375624688F134DC3F1ECFFC8E2","mch_id":"151580000103","version":"1.0","mch_create_ip":"58.250.18.9","input_fee":"600","out_trade_no":"15158000010329904846485750717","service":"unified.trade.fastpay","total_fee":"600","sign_no":"CD120020240614000038","sign_type":"MD5","plainPin","123456"}
<xml><body><![CDATA[测试快捷支付]]></body>
<mch_create_ip><![CDATA[127.0.0.1]]></mch_create_ip>
<mch_id><![CDATA[199590000001]]></mch_id>
<nonce_str><![CDATA[1720247695]]></nonce_str>
<out_trade_no><![CDATA[1720247695]]></out_trade_no>
<plain_pin><![CDATA[123456]]></plain_pin>
<service><![CDATA[unified.trade.fastpay]]></service>
<sign><![CDATA[33E373987C07A17DF6C00C4D097F5AB6]]></sign>
<sign_no><![CDATA[CD120020230714000051]]></sign_no>
<sign_type><![CDATA[MD5]]></sign_type>
<total_fee><![CDATA[1]]></total_fee>
</xml>
zgrep '"service":"unified.trade.fastpay"' file.gz | tail -n 1
Signature error
错误
1,MerchantCheck2Filter
2,商户签名验证
3,cn.swiftpass.pay.business.signature.WftSecretService#
verifySign(cn.swiftpass.pay.commoms.sign.SignTypeEnum, java.nio.charset.Charset, java.lang.String, java.lang.String, java.lang.String)
商户限额
风控校验中 关键字【风控校验未通过,校验结果:】【已超过该商户当日限额】
代码流程
1,cn/swiftpass/action/authgateway/filter/gateway/MerchantCheckFilter.java:86
2,cn.swiftpass.pay.business.risk.handle.AbstractRiskHandle#handleWithValue
3,cn.swiftpass.pay.business.risk.handle.RiskMchInterceptHandle#handleWithValue
智慧经营
商户开通智慧经营
1,行业开放平台数据库
SYS_TRADE_APP表插入
【智慧经营】和【威到家】数据
2,host 配置智慧经营提供的公钥
3,sppay-trade-font的application.yaml配置admin.path.privateKey私钥和请求地址
4,配置的plat_pub_key
SELECT *
FROM CMS_ORG_PARAMETER_CONF
WHERE ORG_ID = '151520000001'
AND PARAMETER_NAME = 'CMS_ACCEPT_ORG_PUBLIC_SECRET_KEY_RSA';
报错【商户公钥格式不正确】
排查:open_app_org_key表中PUB_KEY字段是否有问题
//智慧经营提供sm2公钥给我们,我们进行加密然后入库
AppOrgKeyDto old = new AppOrgKeyDto();
AppOrgKeyDto appKeyDto = new AppOrgKeyDto();
old.
setPubKey("MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEfwFP6gLCuyr5ejZamfRCC5TjnQNrYc9J95oy8sJemN0kL1u8CRK8uECptjjEwig00dalfQ09aAoqLdn04JaJlQ==");
BeanConvertUtils.
convert(appKeyDto, old, new cn.swiftpass.core.common.utils.security.EncryptAndDecryptConvert(true, SysSignConstants.APP_ORG_KEY_FIELD, SysSignConstants.APP_ORG_KEY_SIGN_KEY));
System.err.
println(appKeyDto.getPubKey());//公钥加密后值
报错
【业务Key不存在】
CMS_BIZ_KEY.KEY_NAME 得和
CMS_ORG_SECRET_KEY_PARAMETER中的参数为CMS_PAY_PUBLIC_PRIVATE_KEY_NAME_*** 的PARAMETER_VALUE对应
修改CMS_BIZ_KEY和CMS_BIZ_INFO表
需重启keyservice
报错【不支持的签名方式SM2_1_1】
cms_org_secret_key表中对应org_id的商户删除就不会报错了
报错【解密失败,加密消息pdding不正确】
解决:CMS_BIZ_KEY的KEY_NAME和CMS_BIZ_KEY的DATA字段有关联
tra
退款
1,商户平台或小程序发起退款操作
2,定时任务自动审核tra【payRefundPlatformAuditTaskService】
3,定时任务执行退款tra【payRefundTaskService】->请求网关
ds://sppay-tra/sppay-tra-service-war/services/payRefundTaskService.hs
ds://sppay-tra/sppay-tra-service-war/services/payRefundPlatformAuditTaskService.hs
pcs
http://wlmg-payment-uat,swifpass.top/transactions/pos/pay //消费接口
http://wlmg-payment-uat.swiftpass.top/open/pos/signln //签到接口
行业缴费
燃气缴费
1、添加POS业务权限类型
select *
from CMS_SYS_TYPE
cst WHERE
TYPE_CLASS ='POS_ORDER_TYPE';
EPosOrderType类中添加
日夜颠倒头发少 ,单纯好骗恋爱脑 ,会背九九乘法表 ,下雨只会往家跑 ,搭讪只会说你好 ---- 2050781802@qq.com