@Sign
@NotNull(message = "必须指定是否匿名支付", groups = ConfirmAction.class)
private Boolean anonymous;
+ @Sign
+ @NotEmpty(message = "流水类型不能为空", groups = {InitAction.class, ConfirmAction.class})
+ private String dtltype;
/**请求IP*/
@Sign
private String spip;
+ public String getDtltype() {
+ return dtltype;
+ }
+
+ public void setDtltype(String dtltype) {
+ this.dtltype = dtltype;
+ }
+
public String getSpip() {
return spip;
}
QrcodePayParam param = new QrcodePayParam();
param.setAmount(1);
- param.setAnonymous(true);
+ param.setAnonymous(false);
param.setBillno(DateUtil.getNow());
param.setQrcodeFormat("origin");
param.setTransdate(DateUtil.getNow("yyyyMMdd"));
param.setTranstime(DateUtil.getNow("HHmmss"));
- param.setTenantid("default");
+ //param.setTenantid("default");
param.setShopaccno("2000000012");
- param.setQrcode("286972142340737770");
+ param.setQrcode("134869374484110144");
+ param.setDtltype("canteen");
+ param.setSpip("172.28.43.3");
QrcodePayResponse response = consumePropxy.qrcodePayInit(param);
assertThat("qrcodeInit " + response.getRetmsg() + response.getException(),
response.getRetcode(), equalTo(0));
response = consumePropxy.qrcodePayConfirm(param);
- assertThat("qrcodeConfirm " + response.getRetmsg() + response.getException(),
+ assertThat("qrcodeConfirm:" + response.getRetmsg() + response.getException()+",query="+response.isRequireQuery(),
response.getRetcode(), equalTo(0));
}
@Service
public class QrcodePatternServiceImpl implements QrcodePatternService {
- private final QrcodePatternDao qrcodePatternDao;
-
- public QrcodePatternServiceImpl(QrcodePatternDao qrcodePatternDao) {
- this.qrcodePatternDao = qrcodePatternDao;
- }
-
- @Override
- @Cacheable(cacheNames = "qrcode_pattern_cache", key = "@tenantHolder.genKey('qrcode_pattern')")
- public List<QrcodePattern> getAllQrcodePattern() {
- return qrcodePatternDao.findByTenantid(TenantContext.getTenantSchema());
- }
-
- @Override
- @CacheEvict(cacheNames = "qrcode_pattern_cache", key = "@tenantHolder.genKey('qrcode_pattern') + '.*'")
- public void deleteAllQrcodePattern() {
- qrcodePatternDao.deleteByTenantid(TenantContext.getTenantSchema());
- }
-
- @Override
- @CacheEvict(cacheNames = "qrcode_pattern_cache", key = "@tenantHolder.genKey('qrcode_pattern') + '.*'")
- public QrcodePattern saveOrUpdateQrcodePattern(@NotNull QrcodePattern pattern) {
- if (pattern.getTenantid() == null || pattern.getTenantid().isEmpty()) {
- pattern.setTenantid(TenantContext.getTenantSchema());
+ private final QrcodePatternDao qrcodePatternDao;
+
+ public QrcodePatternServiceImpl(QrcodePatternDao qrcodePatternDao) {
+ this.qrcodePatternDao = qrcodePatternDao;
+ }
+
+ @Override
+ @Cacheable(cacheNames = "qrcode_pattern_cache", key = "@tenantHolder.genKey('qrcode_pattern')")
+ public List<QrcodePattern> getAllQrcodePattern() {
+ return qrcodePatternDao.findByTenantid(TenantContext.getTenantSchema());
+ }
+
+ @Override
+ @CacheEvict(cacheNames = "qrcode_pattern_cache", key = "@tenantHolder.genKey('qrcode_pattern') + '.*'", allEntries = true)
+ public void deleteAllQrcodePattern() {
+ qrcodePatternDao.deleteByTenantid(TenantContext.getTenantSchema());
+ }
+
+ @Override
+ @CacheEvict(cacheNames = "qrcode_pattern_cache", key = "@tenantHolder.genKey('qrcode_pattern') + '.*'", allEntries = true)
+ public QrcodePattern saveOrUpdateQrcodePattern(@NotNull QrcodePattern pattern) {
+ if (pattern.getTenantid() == null || pattern.getTenantid().isEmpty()) {
+ pattern.setTenantid(TenantContext.getTenantSchema());
+ }
+ return qrcodePatternDao.save(pattern);
+ }
+
+ @Override
+ @Cacheable(cacheNames = "qrcode_pattern_cache", key = "@tenantHolder.genKey('qrcode_pattern', #sourceType)")
+ public List<QrcodePattern> findAllBySourcetype(String sourceType) {
+ return qrcodePatternDao.findBySourceTypeAndTenantid(sourceType, TenantContext.getTenantSchema());
}
- return qrcodePatternDao.save(pattern);
- }
-
- @Override
- @Cacheable(cacheNames = "qrcode_pattern_cache", key = "@tenantHolder.genKey('qrcode_pattern', #sourceType)")
- public List<QrcodePattern> findAllBySourcetype(String sourceType) {
- return qrcodePatternDao.findBySourceTypeAndTenantid(sourceType, TenantContext.getTenantSchema());
- }
}
private String accdate; //记账日期
@Column(name = "USERID", length = 32)
- @NotNull
private String userid; //用户ID,或账号
@Column(name = "ACCNO", length = 32)
val response = alipayClient.execute(request)
if ("10000" == response.code) {
if (response.isSuccess) {
- agentResponse.agentRefno = response.tradeNo
agentResponse.code = AgentCode.SUCCESS
- agentResponse.agentCode = AgentResponse.AGENTCODE_SUCCESS
+ agentResponse.agentRefno = response.tradeNo
+ agentResponse.agentMsg = response.msg
+ agentResponse.agentCode = response.code
+ qrcodePayTrans.agentRefno = response.tradeNo
+ agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodePayTrans)
} else {
agentResponse.code = AgentCode.FAIL
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
- agentResponse.agentMsg = response.subMsg
+ agentResponse.agentMsg = response.msg
+ agentResponse.agentCode = response.code
logger.error { "支付宝:${response.code},${response.msg},${response.subCode},${response.subMsg}" }
}
} else if ("10003" == response.code || "20000" == response.code) {
agentResponse.code = AgentCode.REQUIRE_QUERY
- agentResponse.agentMsg = "支付请求已提交,等待用户支付"
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
+ agentResponse.agentMsg = response.msg
+ agentResponse.agentCode = response.code
logger.error { "支付宝:${response.code},${response.msg},${response.subCode},${response.subMsg}" }
} else {
agentResponse.code = AgentCode.FAIL
agentResponse.agentMsg = response.msg
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
+ agentResponse.agentCode = response.code
logger.error { "支付宝:${response.code},${response.msg},${response.subCode},${response.subMsg}" }
}
} catch (e: AlipayApiException) {
val response = alipayClient.sdkExecute(request)
if (response.isSuccess) {
agentResponse.agentRefno = response.tradeNo
- agentResponse.code = AgentCode.REQUIRE_QUERY
- agentResponse.agentCode = AgentResponse.AGENTCODE_SUCCESS
+ agentResponse.agentMsg = response.msg
+ agentResponse.agentCode = response.code
//body 为APP
agentResponse.agentBody = response.body
} else {
agentResponse.code = AgentCode.FAIL
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
- agentResponse.agentMsg = response.subMsg
+ agentResponse.agentMsg = response.msg
+ agentResponse.agentCode = response.code
logger.error { "支付宝:${response.code},${response.msg},${response.subCode},${response.subMsg}" }
}
} catch (e: AlipayApiException) {
logger.error { "支付宝:${e.message}" }
agentResponse.code = AgentCode.FAIL
- agentResponse.agentMsg = "调用支付宝异常"
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
}
}
return agentResponse
val response = alipayClient.execute(request)
if (response.isSuccess) {
agentResponse.code = AgentCode.SUCCESS
- agentResponse.agentCode = AgentResponse.AGENTCODE_SUCCESS
+ agentResponse.agentMsg = response.msg
+ agentResponse.agentCode = response.code
agentResponse.dtlStatus = DtlStatus.REFUND
} else {
agentResponse.code = AgentCode.FAIL
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
- agentResponse.agentMsg = "支付宝退款失败"
+ agentResponse.agentMsg = response.msg
+ agentResponse.agentCode = response.code
}
}
return agentResponse
if (response.isSuccess) {
//check response.totalAmount
agentResponse.code = AgentCode.SUCCESS
- agentResponse.agentCode = AgentResponse.AGENTCODE_SUCCESS
+ agentResponse.agentMsg = response.msg
+ agentResponse.agentCode = response.code
when (response.tradeStatus) {
"TRADE_SUCCESS", "TRADE_FINISHED" -> agentResponse.dtlStatus = DtlStatus.SUCCESS
"TRADE_CLOSED" -> agentResponse.dtlStatus = DtlStatus.REFUND
}
} else {
agentResponse.code = AgentCode.FAIL
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
- agentResponse.agentMsg = "支付宝查询失败"
+ agentResponse.agentMsg = response.msg
+ agentResponse.agentCode = response.code
}
}
return agentResponse
var agentResponse = AgentResponse()
if (refno.isNullOrEmpty()) {
agentResponse.code = AgentCode.FAIL
- agentResponse.agentMsg = "返回流水号为空"
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
return agentResponse
}
var transaction = consumePayService.getTransactionMainDtl(refno, null, null)
if (transaction == null) {
agentResponse.code = AgentCode.REFNO_NOT_EXISTS
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
return agentResponse
}
if (transaction.status == TradeDict.DTL_STATUS_SUCCESS) {
agentResponse.code = AgentCode.SUCCESS
- agentResponse.agentMsg = "流水已成功,不能重复入账"
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
return agentResponse
}
val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, false, false)
if (config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY].isNullOrEmpty()) {
agentResponse.code = AgentCode.CONFIG_ERROR
- agentResponse.agentMsg = "商户公钥未配置"
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
return agentResponse
}
var flag = AlipaySignature.rsaCheckV1(param, config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY], "UTF-8", "RSA2")
true -> {
//total amt 校验 map["total_amount"]
var tradeno = param["trade_no"]
- if(tradeno.isNullOrEmpty()){
+ if (tradeno.isNullOrEmpty()) {
transactionService.success(transaction.refno)
- }else{
- transactionService.success(transaction.refno,tradeno, true)
+ } else {
+ transactionService.success(transaction.refno, tradeno, true)
}
agentResponse.code = AgentCode.SUCCESS
- agentResponse.agentCode = AgentResponse.AGENTCODE_SUCCESS
agentResponse
}
false -> {
logger.error { "支付宝签名校验错误" }
agentResponse.code = AgentCode.FAIL
- agentResponse.agentMsg = "签名校验错误"
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
agentResponse
}
}
import com.supwisdom.dlpay.util.PaytypeUtil
import mu.KotlinLogging
import org.apache.commons.lang.StringUtils
+import org.springframework.http.converter.StringHttpMessageConverter
import org.springframework.stereotype.Service
import org.springframework.web.client.RestTemplate
+import java.nio.charset.StandardCharsets
@Service
}
bean.generalCheckSign()
var xml = bean.generalCheckXML()
+ restTemplate.messageConverters[1] = StringHttpMessageConverter(StandardCharsets.UTF_8)
var res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_OAUTHCODE, xml, String::class.java)
var eleMap = XmlUtils.parseXml(res.body)
var retcode = eleMap["return_code"]
qrcodeTrans.agentUserId = openid
var ip = personIdentityDao.getByThirdUid(openid)
if (ip != null) {
- qrcodeTrans.agentUserId = ip.person.userid
+ qrcodeTrans.userid = ip.person.userid
}
agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
agentResponse.code = AgentCode.SUCCESS
- agentResponse.agentCode = AgentResponse.AGENTCODE_SUCCESS
+ agentResponse.agentCode = retcode
+ agentResponse.agentMsg = eleMap["return_msg"]
} else {
logger.error { "code=${eleMap["err_code"]},des=${eleMap["err_code_des"]}" }
agentResponse.code = AgentCode.FAIL
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
- agentResponse.agentMsg = "二维码身份查询失败"
+ agentResponse.agentCode = eleMap["err_code"]
+ agentResponse.agentMsg = eleMap["err_code_des"]
}
}
return agentResponse
this.out_trade_no = transaction.refno
this.total_fee = MoneyUtil.YuanToFen(transaction.shopDtl.amount)
this.spbill_create_ip = qrcodeTrans.spip
+ this.body = "POS扫微信二维码支付"
}
bean.generalPaySign()
var xml = bean.generaPayXML()
+ restTemplate.messageConverters[1] = StringHttpMessageConverter(StandardCharsets.UTF_8)
var res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_QRCODEPAY, xml, String::class.java)
var eleMap = XmlUtils.parseXml(res.body)
var retcode = eleMap["return_code"]
var resultCode = eleMap["result_code"]
var openid = eleMap["openid"]
+ var errorCode = eleMap["err_code"]
if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
&& !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode && !openid.isNullOrEmpty()) {
agentResponse.code = AgentCode.SUCCESS
- agentResponse.agentCode = AgentResponse.AGENTCODE_SUCCESS
+ agentResponse.agentCode = resultCode
agentResponse.dtlStatus = DtlStatus.SUCCESS
- } else {
- logger.error { "code=${eleMap["err_code"]},des=${eleMap["err_code_des"]}" }
+ agentResponse.agentMsg = eleMap["return_msg"]
+ agentResponse.agentRefno = eleMap["transaction_id"]
+ qrcodeTrans.agentRefno = eleMap["transaction_id"]
+ agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
+ } else if("SYSTEMERROR"==errorCode||"BANKERROR"==errorCode||"USERPAYING"==errorCode){
+ logger.error { "code=${errorCode},des=${eleMap["err_code_des"]}" }
agentResponse.code = AgentCode.REQUIRE_QUERY
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
- agentResponse.agentMsg = "请查询支付结果"
+ agentResponse.agentCode = eleMap["err_code"]
+ agentResponse.agentMsg = eleMap["err_code_des"]
+ agentResponse.agentRefno = eleMap["transaction_id"]
+ qrcodeTrans.agentRefno = eleMap["transaction_id"]
+ agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
+ }else{
+ agentResponse.code = AgentCode.FAIL
+ agentResponse.agentCode = eleMap["err_code"]
+ agentResponse.agentMsg = eleMap["err_code_des"]
+ logger.error { "code=${errorCode},des=${eleMap["err_code_des"]}" }
}
}
return agentResponse
//TODO IP 问题
bean.generaSign()
val xml = bean.generaXML()
+ restTemplate.messageConverters[1] = StringHttpMessageConverter(StandardCharsets.UTF_8)
var res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_UNIONPAY, xml, String::class.java)
var eleMap = XmlUtils.parseXml(res.body)
var retcode = eleMap["return_code"]
var resultCode = eleMap["result_code"]
- val mweb_url = eleMap["mweb_url"]
+ val mwebUrl = eleMap["mweb_url"]
if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
- && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode && !mweb_url.isNullOrEmpty()) {
+ && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode && !mwebUrl.isNullOrEmpty()) {
agentResponse.code = AgentCode.REQUIRE_QUERY
- agentResponse.agentCode = AgentResponse.AGENTCODE_SUCCESS
- agentResponse.agentBody = mweb_url
+ agentResponse.agentCode =resultCode
+ agentResponse.agentMsg = eleMap["return_msg"]
+ agentResponse.agentBody = mwebUrl
agentResponse.agentRefno = eleMap["prepay_id"]
} else {
logger.error { "code=${eleMap["err_code"]},des=${eleMap["err_code_des"]}" }
agentResponse.code = AgentCode.FAIL
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
- agentResponse.agentMsg = "预下单失败"
+ agentResponse.agentCode = eleMap["err_code"]
+ agentResponse.agentMsg = eleMap["err_code_des"]
}
}
return agentResponse
}
bean.generalQuerySign()
val xml = bean.generalQueryXML()
+ restTemplate.messageConverters[1] = StringHttpMessageConverter(StandardCharsets.UTF_8)
var res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_QUERY, xml, String::class.java)
var eleMap = XmlUtils.parseXml(res.body)
var retcode = eleMap["return_code"]
var resultCode = eleMap["result_code"]
- val trade_state = eleMap["trade_state"]
+ val tradeState = eleMap["trade_state"]
if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
&& !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode) {
agentResponse.code = AgentCode.REQUIRE_QUERY
- agentResponse.agentCode = AgentResponse.AGENTCODE_SUCCESS
- when (trade_state) {
+ agentResponse.agentCode = resultCode
+ agentResponse.agentMsg = eleMap["return_msg"]
+ when (tradeState) {
"SUCCESS" -> agentResponse.dtlStatus = DtlStatus.SUCCESS
"REFUND" -> agentResponse.dtlStatus = DtlStatus.REFUND
"NOTPAY", "CLOSED", "REVOKED", "PAYERROR" -> agentResponse.dtlStatus = DtlStatus.FAIL
"USERPAYING" -> agentResponse.dtlStatus = DtlStatus.WAIT
}
} else {
- logger.error { "code=${eleMap["err_code"]},des=${eleMap["err_code_des"]}" }
+ logger.error { "code=${eleMap["err_code"]}},des=${eleMap["err_code_des"]}" }
agentResponse.code = AgentCode.FAIL
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
- agentResponse.agentMsg = "查询失败"
+ agentResponse.agentCode = eleMap["err_code"]
+ agentResponse.agentMsg = eleMap["err_code_des"]
}
}
return agentResponse
if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
&& !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode ) {
agentResponse.code = AgentCode.REQUIRE_QUERY
- agentResponse.agentCode = AgentResponse.AGENTCODE_SUCCESS
+ agentResponse.agentCode =resultCode
agentResponse.agentRefno = eleMap["refund_id"]
+ agentResponse.agentMsg = eleMap["return_msg"]
} else {
logger.error { "code=${eleMap["err_code"]},des=${eleMap["err_code_des"]}" }
agentResponse.code = AgentCode.FAIL
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
- agentResponse.agentMsg = "退款申请失败失败:${eleMap["err_code_des"]}"
+ agentResponse.agentCode = eleMap["err_code"]
+ agentResponse.agentMsg = eleMap["err_code_des"]
}
}
return agentResponse
transactionService.success(transaction.refno,transid, true)
}
agentResponse.code = AgentCode.SUCCESS
- agentResponse.agentCode = AgentResponse.AGENTCODE_SUCCESS
+ agentResponse.agentCode = resultCode
} else {
agentResponse.code = AgentCode.FAIL
- agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
- agentResponse.agentMsg = "${param["err_code"]}:${param["err_code_des"]}"
+ agentResponse.agentCode = param["err_code"]
+ agentResponse.agentMsg = param["err_code_des"]
logger.error { "code=${param["err_code"]},des=${param["err_code_des"]}" }
}
return agentResponse
fun downloadBill(shopacc:String,accdate:String):BaseResp
}
-@Component("wechatpayAgent")
+@Component("wechatAgent")
class WeChatPayAgentService(val consumePayService: ConsumePayService,
val wechatService: WechatService) : AgentPayService {
override fun auth(shopaccno: String?, billno: String?): AgentResponse {
fun logPostMethods(joinPoint: ProceedingJoinPoint, body: Any): Any {
return try {
if (body is APIRequestParam) {
- TenantContext.setTenantSchema(body.tenantid)
+ //TenantContext.setTenantSchema(body.tenantid)
body.checkParam()
if (requestSignCheck &&
val qrcodeTrans = agentServiceProxy.qrcodePayTransFindByMerchIdAndBillno(param.shopaccno,
param.billno) ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
.fail(apiResponse, TradeErrorCode.BUSINESS_DEAL_ERROR, "未找到billno"))
- if (qrcodeTrans.refno.isNotEmpty()) {
+ if (!qrcodeTrans.refno.isNullOrEmpty()) {
return ResponseEntity.ok(ResponseBodyBuilder.create()
.fail(apiResponse, TradeErrorCode.BUSINESS_DEAL_ERROR, "该交易已确认,请查询结果"))
}
"支付方式<${qrcodeTrans.sourceType}>不支持匿名支付"))
}
qrcodeTrans.spip = param.spip
-
+ val dtlType = consumePayService.getDtltypeDictionary(param.dtltype, Dictionary.DTLTYPES)
//2. 初始化交易流水
// sourcetype 资产类科目
val stSubject = accountUtilServcie.readSubject(sourceType.paySubjno)
setTransInfo(param.transdate, param.transtime, TradeCode.TRANSCODE_QRCODE, qrcodeTrans.sourceType)
setOutTransInfo(qrcodeTrans.agentMerchId, qrcodeTrans.billno)
payinfo = qrcodeSummary(sourceType)
+ description = dtlType.dictcaption
+ dtltype = param.dtltype
}
val shopacc = accountUtilServcie.readShopbyShopaccno(qrcodeTrans.agentMerchId)
}
fun oppositeAccNo(): String {
- return this.oppAccno
+ return if (hasOpposite()) this.oppAccno else ""
}
fun oppositeAccName(): String {
- return this.oppAccName
+ return if (hasOpposite()) this.oppAccName else ""
}
fun setOpposite(accno: String, accName: String) {
throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
"商户交易金额不正确")
}
- if (!it.hasOpposite()) {
- throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
- "商户交易对方账户未设置")
+ if (hasPerson()) {
+ if (!person().isAnonymous() && !it.hasOpposite()) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "商户交易对方账户未设置")
+ }
}
}
}
INSERT INTO TB_QRCODE_PATTERN(ID, PATTERN, SOURCETYPE, TENANTID)
VALUES(1, '28\d{16}', 'alipay', '{tenantid}');
INSERT INTO TB_QRCODE_PATTERN(ID, PATTERN, SOURCETYPE, TENANTID)
-VALUES(2, '13\d{16}', 'wechatpay', '{tenantid}');
+VALUES(2, '13\d{16}', 'wechat', '{tenantid}');
----------------------------------------------------
commit;
\ No newline at end of file