alipayplus aps 商户注册

master
dalong306 3 years ago
parent 8890cab76f
commit 92d10e7f64

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>au.com.royalpay.payment</groupId> <groupId>au.com.royalpay.payment</groupId>
<artifactId>payment-parent</artifactId> <artifactId>payment-parent</artifactId>
<version>2.2.31</version> <version>2.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>manage</artifactId> <artifactId>manage</artifactId>

@ -1,7 +1,9 @@
package au.com.royalpay.payment.manage.merchants.core; package au.com.royalpay.payment.manage.merchants.core;
import au.com.royalpay.payment.channels.alipay.beans.plus.ApsMerchantApplication;
import au.com.royalpay.payment.channels.rpaypaymentsvc.runtime.request.entities.RPayMerchantEntity; import au.com.royalpay.payment.channels.rpaypaymentsvc.runtime.request.entities.RPayMerchantEntity;
import au.com.royalpay.payment.core.beans.ChannelMerchantInfo; import au.com.royalpay.payment.core.beans.ChannelMerchantInfo;
import au.com.royalpay.payment.core.beans.MerchantApplicationResult;
import au.com.royalpay.payment.core.exceptions.EmailException; 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.AppClientBean;
import au.com.royalpay.payment.manage.appclient.beans.AppMerchantBean; import au.com.royalpay.payment.manage.appclient.beans.AppMerchantBean;
@ -604,4 +606,11 @@ public interface ClientManager {
void selectBillCodeVersion(JSONObject manager, String clientMoniker, String version); void selectBillCodeVersion(JSONObject manager, String clientMoniker, String version);
MerchantApplicationResult alipayPlusRegisterMerchant(String clientMoniker, ApsMerchantApplication apsMerchantApplication, JSONObject manager);//alipayplus 注册商户
String queryAlipayPlusOnlineStatus(boolean isOffline,String clientMoniker, JSONObject manager);
String queryAlipayPlusOfflineStatus(String clientMoniker, JSONObject manager);
} }

@ -1,9 +1,12 @@
package au.com.royalpay.payment.manage.merchants.core.impls; package au.com.royalpay.payment.manage.merchants.core.impls;
import au.com.royalpay.payment.channels.alipay.beans.plus.AlipayPlusRegisterResult;
import au.com.royalpay.payment.channels.alipay.beans.plus.ApsMerchantApplication;
import au.com.royalpay.payment.channels.alipay.config.AlipayConfig; import au.com.royalpay.payment.channels.alipay.config.AlipayConfig;
import au.com.royalpay.payment.channels.alipay.config.AlipayEnvironment; import au.com.royalpay.payment.channels.alipay.config.AlipayEnvironment;
import au.com.royalpay.payment.channels.alipay.runtime.AlipayOnlineApi; import au.com.royalpay.payment.channels.alipay.runtime.AlipayOnlineApi;
import au.com.royalpay.payment.channels.alipay.runtime.AlipayRetailApi; import au.com.royalpay.payment.channels.alipay.runtime.AlipayRetailApi;
import au.com.royalpay.payment.channels.alipay.runtime.alipayplus.AlipayApsMerchantRegister;
import au.com.royalpay.payment.channels.alipay.runtime.entity.AlipayMerchantEntity; import au.com.royalpay.payment.channels.alipay.runtime.entity.AlipayMerchantEntity;
import au.com.royalpay.payment.channels.rpay.runtime.beans.SubRpayMerchantInfo; import au.com.royalpay.payment.channels.rpay.runtime.beans.SubRpayMerchantInfo;
import au.com.royalpay.payment.channels.rpay.runtime.impls.RPayMerchantRegister; import au.com.royalpay.payment.channels.rpay.runtime.impls.RPayMerchantRegister;
@ -113,6 +116,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.alipay.global.api.model.aps.ProductCodeType;
import com.github.miemiedev.mybatis.paginator.domain.Order; import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds; import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList; import com.github.miemiedev.mybatis.paginator.domain.PageList;
@ -7066,6 +7070,57 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
clientInfoCacheSupport.clearClientCache(client.getIntValue("client_id")); clientInfoCacheSupport.clearClientCache(client.getIntValue("client_id"));
} }
/**
* alipayplus(aps)
* @param clientMoniker
* @param apsMerchantApplication
* @param manager
* @return
*/
@Override
public MerchantApplicationResult alipayPlusRegisterMerchant(String clientMoniker, ApsMerchantApplication apsMerchantApplication, JSONObject manager) {
logger.info("====>getWebsiteType:"+apsMerchantApplication.getWebsiteType());
logger.info("====>getProductCodes:"+apsMerchantApplication.getProductCodes().toString());
boolean offline = apsMerchantApplication.getProductCodes().stream().allMatch(s->s.equalsIgnoreCase(ProductCodeType.IN_STORE_PAYMENT.toString()));
logger.info("====>offline:"+offline);
if(offline){
//todo 测试需要 先都改成线上,上线此处需要改成线下
apsMerchantApplication.setPid( AlipayEnvironment.getEnv().getAlipayPlusApsRetailConfig().getPid());
}else{
apsMerchantApplication.setPid( AlipayEnvironment.getEnv().getAlipayPlusApsOnlineConfig().getPid());
}
apsMerchantApplication.setRegion("AU");
JSONObject client= sysClientMapper.findClientByMoniker(clientMoniker);
AlipayApsMerchantRegister alipayApsMerchantRegister = Optional.ofNullable(merchantChannelApplicationManager.getRegister(AlipayApsMerchantRegister.class)).orElseThrow(() -> new ServerErrorException("No AlipayAps registry found"));
MerchantApplicationResult result=alipayApsMerchantRegister.apply(client,apsMerchantApplication,manager);
return result;
}
@Override
public String queryAlipayPlusOnlineStatus(boolean isRetail,String clientMoniker, JSONObject manager) {
JSONObject client= sysClientMapper.findClientByMoniker(clientMoniker);
client.put("isRetail",isRetail);
String pid="";
if(isRetail){
//todo 测试需要 先都改成线上,上线此处需要改成线下
pid= AlipayEnvironment.getEnv().getAlipayPlusApsRetailConfig().getPid();
}else{
pid= AlipayEnvironment.getEnv().getAlipayPlusApsOnlineConfig().getPid();
}
client.put("pid",pid);
AlipayApsMerchantRegister alipayApsMerchantRegister = Optional.ofNullable(merchantChannelApplicationManager.getRegister(AlipayApsMerchantRegister.class)).orElseThrow(() -> new ServerErrorException("No AlipayAps registry found"));
AlipayPlusRegisterResult alipayPlusRegisterResult= alipayApsMerchantRegister.findMerchant(client);
return alipayPlusRegisterResult.getRawResponse();
}
@Override
public String queryAlipayPlusOfflineStatus(String clientMoniker, JSONObject manager) {
return null;
}
private void exportLetterOfferPDF(String clientMoniker, JSONObject manage) { private void exportLetterOfferPDF(String clientMoniker, JSONObject manage) {
JSONObject info = convertClientLetterOfferInfo(clientMoniker); JSONObject info = convertClientLetterOfferInfo(clientMoniker);
String pdfPath = this.getClass().getClassLoader().getResource("").getPath() + "/templates/pdf/letter_of_offer.pdf"; String pdfPath = this.getClass().getClassLoader().getResource("").getPath() + "/templates/pdf/letter_of_offer.pdf";

@ -1,7 +1,9 @@
package au.com.royalpay.payment.manage.merchants.web; package au.com.royalpay.payment.manage.merchants.web;
import au.com.royalpay.payment.channels.alipay.beans.plus.ApsMerchantApplication;
import au.com.royalpay.payment.channels.rpaypaymentsvc.runtime.request.entities.RPayMerchantEntity; import au.com.royalpay.payment.channels.rpaypaymentsvc.runtime.request.entities.RPayMerchantEntity;
import au.com.royalpay.payment.core.beans.ChannelMerchantInfo; import au.com.royalpay.payment.core.beans.ChannelMerchantInfo;
import au.com.royalpay.payment.core.beans.MerchantApplicationResult;
import au.com.royalpay.payment.core.exceptions.InvalidShortIdException; import au.com.royalpay.payment.core.exceptions.InvalidShortIdException;
import au.com.royalpay.payment.manage.dev.core.MerchantLocationService; import au.com.royalpay.payment.manage.dev.core.MerchantLocationService;
import au.com.royalpay.payment.manage.merchants.beans.*; import au.com.royalpay.payment.manage.merchants.beans.*;
@ -1057,4 +1059,27 @@ public class PartnerManageController {
clientManager.modifyUPayProfile(manager, clientMoniker, pass.getString("key"), pass.getBooleanValue("allow")); clientManager.modifyUPayProfile(manager, clientMoniker, pass.getString("key"), pass.getBooleanValue("allow"));
} }
/**
* alipayplus
* @param clientMoniker
* @param manager
* @return
*/
@ManagerMapping(value = "/{clientMoniker}/apply_alipayplus", method = RequestMethod.POST, role = {ManagerRole.OPERATOR, ManagerRole.ADMIN})
public MerchantApplicationResult applyAlipayPlusMerchant(@PathVariable String clientMoniker, @RequestBody ApsMerchantApplication apsMerchantApplication, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
return clientManager.alipayPlusRegisterMerchant(clientMoniker,apsMerchantApplication,manager);
}
@ManagerMapping(value = "/{clientMoniker}/query/alipay_aps_online", method = RequestMethod.GET, role = {ManagerRole.OPERATOR, ManagerRole.ADMIN})
public JSONObject queryAlipayApsOnlineStatus(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
JSONObject result = new JSONObject();
result.put("response_str", clientManager.queryAlipayPlusOnlineStatus(false,clientMoniker, manager));
return result;
}
@ManagerMapping(value = "/{clientMoniker}/query/alipay_aps_retail", method = RequestMethod.GET, role = {ManagerRole.OPERATOR, ManagerRole.ADMIN})
public JSONObject queryAlipayApsOfflineStatus(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
JSONObject result = new JSONObject();
result.put("response_str", clientManager.queryAlipayPlusOnlineStatus(true,clientMoniker, manager));
return result;
}
} }

@ -2,16 +2,75 @@ app:
alipay: alipay:
host: https://mapi-hk.alipay.com/gateway.do host: https://mapi-hk.alipay.com/gateway.do
merchants: merchants:
online: - key: hmwjrganlzb4aqgggdgdlod7l3lsjkn6
key: hmwjrganlzb4aqgggdgdlod7l3lsjkn6
pid: 2088821643021586 pid: 2088821643021586
pid-type: ONLINE
biz-type: ONLINE
private-key: classpath:data/crypt/alipay_private.pem private-key: classpath:data/crypt/alipay_private.pem
public-key: classpath:data/crypt/alipay_public.pem public-key: classpath:data/crypt/alipay_public.pem
sftp-password: XNBB3S sftp-password: XNBB3S
sftp-username: openvisePTY sftp-username: openvisePTY
retail: - key: jb5mt4vhtlzg1xlc0k967sib7v81sba6
key: jb5mt4vhtlzg1xlc0k967sib7v81sba6
pid: 2088721525235246 pid: 2088721525235246
pid-type: RETAIL
biz-type: RETAIL
sftp-password: XNBB3S sftp-password: XNBB3S
sftp-username: openvisePTY sftp-username: openvisePTY
- pid: SANDBOX_5Y2Z6G2Y6CD006426
bill-pid: ''
pid-type: CONNECT
biz-type: RETAIL
api-prefix: /ams
private-key-string: |-
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC7Q56Mi0ESd7lIImLl/qvoHry8M1pg6qMyzzsMsHe6kMMculI7B7G2/fGpSS2JC46jZrVRb/fYf1NLehhAh1MK51md/7dEgqjkowtXIjhEQTPXwTWWkxtnb/l+KoqWtBrkOfMIef+O6QbqvveneLlCq9wMnvKNsj0p9GtUKxYUyxY8Nwuc2tf2wG2zKuh0JoRMLMRMayr7WdhAy4jatJS5pDjJqoIxyhD6X7fPleoeJgzyYSZAPgnH01TSO5ePFQZ/7SxDRC8+D5rAnefsridaabmeBQG2QWf4Gz7qPuavnZfwKzkjptj390+D0PAR3f3JCvYXTrRRUGKdVpiuuFAbAgMBAAECggEBAJrmxUjWi9494Kq1nv9HGWYpvs8i33jZvmNyHhNSCcfupSanTQv9QljvWK5ClQMO509sz0FtECQqtnjxpwwBpISZeH0EoNFwD0sJP4E1EjwLf1nSPYSvbPS0IDnn8LnWg4QUF2AEoovRYGJf0zXZ2801ohFijZr+PC/vObTm6x4IsVasse+urTpAKb1XBnkOF2eKFTM4JdRHFSl4Uk0npdPtULUEvACpsORrBVjJz1dWjIkvHeOrqv5rKR1bxuRlhiDcVoDb7oDD3KIqR93YljOI0mdXLm2DuboGEpj0yKZYU+RaPWxMOErRT99UIAAVpPDVjGKZdt95K6BrWoqxq7kCgYEA5bzUMCM6/0jLt/kmuwkOF+zckz4DLtWFlosGrf658of9PQIvjkZbun3TcpJ2aQ8g7k2qFAUvwc5Uy5G0lW+uCIRA7zcKd2Rz4Rb4Q8qgI+9bIOuDjmvg36zOvqg3xuepoYq/2jcFGR+cBFGpbEu0VWESW3vytDsMosDp4xYkvt0CgYEA0KvSnx9ZqNHINQJCTgLd+mWbEv4lTSDXwi/OBtS8O7tTQRw73OkpOXobXv/vhTV4KimPOWTFFSEZcY7Rl0eyFV7rQD+gIioTCpt4m/ez/zImCv11tQWBqa/GoqZ0d0P9HPgmVjMh8Be0CVTEzGgXeOD2mcP+0WJCns/Js2s2j1cCgYEAk6EOMYjSJq4eyzA+JT6iYdmBvNTCstvfJmhceH8R+rpMj2HSMXkhBOxKbnuTv9tK7BfYTVkv4Ti34MDW7JiBm1NxbsdN4H8av/BExTt2QOFVDAiL13+XV+TyTi5G+Xhw1zAULSPiEMzxMw1O9BqJ3butUkCKLCst6YBSS+0027kCgYEAn+BFiyzV4QZ5wkNs0aBYupRGcBLQOXvEUz+VNp6faZRogSZEp0jtEOCBQBQPS5xf6M3Wsj6G0V1+xQaLhsCjrMQAskUNR5+83w+nJLhv7EJb62euW3dQlNXb9ppZ+VbaAuwNU1Xx1qYShmOwNHw8H50c00rbXUlPiaXh/9lRABkCgYBC9cIcIEutg3hmOlGrRVSSNnuYVO2MuLAIK1KnQftpZHZ+euuCnhPaoC3ZOtenWoBwgS6qV4Mpxq30qcc/mUouErpqUcrNxawlVgWjTSwNd6rT2MBg1lcOxpqsR9ZWolBp4nHvnbLxhI+2KiXpRV9Y8Gbkw1jI8/tMYcSEJsOfEA==
public-key-string: |-
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqME6KAPZcMlFuy19J+RAj34PaS6iuyjINzQvdjR808IeVQAcLdUULMEgCTSQLshC606GFoGkN5nOouoMCZQmPv9hbZSWcDHMrPNNVYuAqwk0N80FSnASNPtlucoqzVjAaqgXD88hqjODCIS/b9LWrprCA3q3aAfVQu3eQLoFM1nn9EdznCp0uVClHgLtwj1rMRkjN+4CSwOW66/RNzsgnDJMkrTlRDeJCrbdXAs0Q3MWQEQv2z1fd34U1yyY2StkHbfKAVp2cCzhSl26K3LcCooDv9VDSv3BDH58sBQ8TIprIW0EsDA4jbLXEDEKXIjqIOaC/+x8jXyRpci17ZvRowIDAQAB
pid-host: https://open-sea.alipay.com
- pid: SANDBOX_5Y2Z6G2Y6CD006410
bill-pid: ''
pid-type: APS
biz-type: RETAIL
api-prefix: /aps
private-key-string: |-
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC7Q56Mi0ESd7lIImLl/qvoHry8M1pg6qMyzzsMsHe6kMMculI7B7G2/fGpSS2JC46jZrVRb/fYf1NLehhAh1MK51md/7dEgqjkowtXIjhEQTPXwTWWkxtnb/l+KoqWtBrkOfMIef+O6QbqvveneLlCq9wMnvKNsj0p9GtUKxYUyxY8Nwuc2tf2wG2zKuh0JoRMLMRMayr7WdhAy4jatJS5pDjJqoIxyhD6X7fPleoeJgzyYSZAPgnH01TSO5ePFQZ/7SxDRC8+D5rAnefsridaabmeBQG2QWf4Gz7qPuavnZfwKzkjptj390+D0PAR3f3JCvYXTrRRUGKdVpiuuFAbAgMBAAECggEBAJrmxUjWi9494Kq1nv9HGWYpvs8i33jZvmNyHhNSCcfupSanTQv9QljvWK5ClQMO509sz0FtECQqtnjxpwwBpISZeH0EoNFwD0sJP4E1EjwLf1nSPYSvbPS0IDnn8LnWg4QUF2AEoovRYGJf0zXZ2801ohFijZr+PC/vObTm6x4IsVasse+urTpAKb1XBnkOF2eKFTM4JdRHFSl4Uk0npdPtULUEvACpsORrBVjJz1dWjIkvHeOrqv5rKR1bxuRlhiDcVoDb7oDD3KIqR93YljOI0mdXLm2DuboGEpj0yKZYU+RaPWxMOErRT99UIAAVpPDVjGKZdt95K6BrWoqxq7kCgYEA5bzUMCM6/0jLt/kmuwkOF+zckz4DLtWFlosGrf658of9PQIvjkZbun3TcpJ2aQ8g7k2qFAUvwc5Uy5G0lW+uCIRA7zcKd2Rz4Rb4Q8qgI+9bIOuDjmvg36zOvqg3xuepoYq/2jcFGR+cBFGpbEu0VWESW3vytDsMosDp4xYkvt0CgYEA0KvSnx9ZqNHINQJCTgLd+mWbEv4lTSDXwi/OBtS8O7tTQRw73OkpOXobXv/vhTV4KimPOWTFFSEZcY7Rl0eyFV7rQD+gIioTCpt4m/ez/zImCv11tQWBqa/GoqZ0d0P9HPgmVjMh8Be0CVTEzGgXeOD2mcP+0WJCns/Js2s2j1cCgYEAk6EOMYjSJq4eyzA+JT6iYdmBvNTCstvfJmhceH8R+rpMj2HSMXkhBOxKbnuTv9tK7BfYTVkv4Ti34MDW7JiBm1NxbsdN4H8av/BExTt2QOFVDAiL13+XV+TyTi5G+Xhw1zAULSPiEMzxMw1O9BqJ3butUkCKLCst6YBSS+0027kCgYEAn+BFiyzV4QZ5wkNs0aBYupRGcBLQOXvEUz+VNp6faZRogSZEp0jtEOCBQBQPS5xf6M3Wsj6G0V1+xQaLhsCjrMQAskUNR5+83w+nJLhv7EJb62euW3dQlNXb9ppZ+VbaAuwNU1Xx1qYShmOwNHw8H50c00rbXUlPiaXh/9lRABkCgYBC9cIcIEutg3hmOlGrRVSSNnuYVO2MuLAIK1KnQftpZHZ+euuCnhPaoC3ZOtenWoBwgS6qV4Mpxq30qcc/mUouErpqUcrNxawlVgWjTSwNd6rT2MBg1lcOxpqsR9ZWolBp4nHvnbLxhI+2KiXpRV9Y8Gbkw1jI8/tMYcSEJsOfEA==
public-key-string: |-
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqME6KAPZcMlFuy19J+RAj34PaS6iuyjINzQvdjR808IeVQAcLdUULMEgCTSQLshC606GFoGkN5nOouoMCZQmPv9hbZSWcDHMrPNNVYuAqwk0N80FSnASNPtlucoqzVjAaqgXD88hqjODCIS/b9LWrprCA3q3aAfVQu3eQLoFM1nn9EdznCp0uVClHgLtwj1rMRkjN+4CSwOW66/RNzsgnDJMkrTlRDeJCrbdXAs0Q3MWQEQv2z1fd34U1yyY2StkHbfKAVp2cCzhSl26K3LcCooDv9VDSv3BDH58sBQ8TIprIW0EsDA4jbLXEDEKXIjqIOaC/+x8jXyRpci17ZvRowIDAQAB
pid-host: https://open-sea.alipay.com
enabled: true
- pid: SANDBOX_5Y372Y2YBKQN02382
bill-pid: ''
pid-type: APS
biz-type: ONLINE
api-prefix: /aps
private-key-string: |-
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDWXsXs+dZPb/cd
BSmffOCjjoXLBQmAtrr9etHQBRUARP2jROppMYlvpfHkBvDlSs8mkz5dNeFF9L0z
QblRWxgW2658nq6u833CjPgTROsLEQZIrJuGCWwQuNslv8ACoKW/FippMDLnDUfk
/41TfzIiMhVrAUuy7P14pa/O8fIrDXMU/G1jknhPfvpLqkPfAB9N2Bf/F61XZsNN
3Xco8X/wW8EdGaw1NdS2hjNvAvuxlcVexqPwXoECJgPQNip/9G/a+8NmKn7hLL1V
8eXyC2J5pBMGq+H52Z2Su/jTyK9h5Qs9j42rQaBp06PHxfK4PhziIVaskLSqNO+j
IrONpumzAgMBAAECggEAEepHtj9G5sqfp0A4M0j3aRPPIKFiIuyige6SvETAdY5O
eCeZQ4NNThRbO8hMt4zh9QJXMuj+057ZdQAoIaFwSPDBC08joCFfQDQRw2J+FiWt
FcO/F5uP+XHJdsUooc+VKnwKvVG231Jf0MZ+pBy8Ltlqqs+n6OMfZ8bJA416xJgq
35tfzKA1orpXtMk8YF7RrCnUlAxYWG5t30kqS/i7k0XtnaG26f0x/TllA+bT8G0I
Sv6JHlJYUh7GwjRmvt9DWnCIWCfr0HnIfDG28Hj1ZrIgpCULiM9/0JHB0DYj7xWn
kIYnN8M+aPi0uc10GPKpf6Z9d6BfKlTjkwjSSBADGQKBgQD9lPqEBUuYQYrG+mqJ
3eQQ/ydt7LJ+q9k2Nv0v0yxp2VeZfGHy3IpJzL3tg38+YXY+BpUa30QjyEjD+TCz
+9Q/DR/d0chR+2+ZKB69RA39GjLNvebS6IogAzZi0+a4h48iB+4o9E39vJNZEfZt
ICa+QYBdfJuJ/hYfmmeVafTixwKBgQDYahML6Oj14qw+8ymEXToPwdYRs7+bikiw
BKU3t5jj+74kYGMBA5i1AdYA9pl7QZaLUPToPOyfG+YWzWKes1VrAq55h3h44S1S
REBK7pct9EmeXBajAmYJf+4smamWgmNvfOB1f6K4Bvz/wr/eSiOAXBtt2OMKe1H/
kr0E85XVtQKBgCftYDCPYOK9VyuTXFkO3g0rD7tILKazSkU2DVGNb43PEfLx2b5S
qVeLbFBMhyl8URDdGncbtm/n5kUtJFUCjt3KpDzZ/i+iZmT4Izbr00QJ7vvkLccB
pFX8C4EuGkLt3USfeQlrxifwnEbHBEUUbeVBDQQrTZZBspwRRMQK5esbAoGAT7bi
xSRJiyivYZCX3lWoqV0wyNx424YYOB297cQG4RM9epC2Zw04FpRSi5BKAIisNyze
yRyH3COeoQ+OH/7Wm9AlDEbGLWBkHUVemTtBHIA7DcXF4M1lYGJrDKqdOP9WOR66
Xw1gloCceGj3251bblB/GfslxhqenZEjZsuCiXECgYAYSe9ZS2pK06NG/0qqEK2t
LktRAEZLMZNKoCfTZ73Tv/3RbIKOTih/0u1esAz8ZNDba1rCY/Yk7tEnn7TdBmh6
tZ2ioys08F2bZingLcTGes1s86/ideNGeoKT2e+071dD/AfdTqchaFRZdYlyPrF7
Geg8LExk9alI9NEyoD7cKA==
public-key-string: |-
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkuBPpcDeFpO12FUgi4UGHWCJ6OdPp0GVvYFUSJzJ+KNUodFpmgw306rNA+0Q5Bn/mw9aaqGCCmZYPpF4TnzGqQcLrAFABW+tpUfGj3WwNndhLyCBnqvp740iufsCaLvzlZyQplL8CBQ4AQPdIVa4YlCiX+AxJNq+kXsNvgUKK0iDLujYE6XzgjOCSq03tFfY3ry58DoEvf86WmS+fP7zAl77kmDf1CmJa5V06aviUlzmuyo/p8m3fUucB1Fv3WNF7qRpNPkMuL6jjHenb9LzWr1tieRTd7mZxOd9KOq75CJiX4XiTHhWbvd2pW/NIkDPZ9dAJPSK57mrh+e7zgT2pQIDAQAB
pid-host: https://open-sea.alipayplus.com
enabled: true
sftp-host: sftp.alipay.com sftp-host: sftp.alipay.com

@ -338,4 +338,76 @@
</div> </div>
</div> </div>
</div> </div>
<!--AlipayPlus (aps) -->
<div class="box box-warning">
<div class="box-header">
<h4 class="text-green">AlipayPlus Logs</h4>
</div>
<div class="box-body table-responsive">
<p ng-if="!wechatLogs.length">No Data</p>
<table class="table table-hover" ng-if="wechatLogs.length">
<thead>
<tr>
<th>Date Start</th>
<th>Date End</th>
<th>Settle Date</th>
<th>Pay Fee</th>
<th>Refund Fee</th>
<th>Net Fee</th>
<th>Poundage</th>
<th>Settlement Fee</th>
<th>Unsettled</th>
<th style="text-align: center;">Validation</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="log in wechatLogs">
<td ng-bind="log.start_date.substr(0,10)"></td>
<td ng-bind="log.end_date.substr(0,10)"></td>
<td ng-bind="log.settle_date.substr(0,10)"></td>
<td ng-bind="log.pay_fee"></td>
<td ng-bind="log.refund_fee"></td>
<td>{{log.net_fee}}
<span ng-if="log.sys_net_fee==log.net_fee" style="color: #0BB20C">&nbsp;&nbsp;(System:{{log.sys_net_fee}})</span>
<span ng-if="log.sys_net_fee!=log.net_fee" style="color: crimson">&nbsp;&nbsp;(System:{{log.sys_net_fee}})</span>
</td>
<td>{{log.surcharge}}
<span ng-if="log.sys_surcharge==log.surcharge" style="color: #0BB20C">&nbsp;&nbsp;(System:{{log.sys_surcharge}})</span>
<span ng-if="log.sys_surcharge!=log.surcharge" style="color: crimson">&nbsp;&nbsp;(System:{{log.sys_surcharge}})</span>
</td>
<td>{{log.settlement_fee}}
<span ng-if="log.sys_settlement_fee==log.settlement_fee" style="color: #0BB20C">&nbsp;&nbsp;(System:{{log.sys_settlement_fee}})</span>
<span ng-if="log.sys_settlement_fee!=log.settlement_fee" style="color: crimson">&nbsp;&nbsp;(System:{{log.sys_settlement_fee}})</span>
</td>
<td ng-bind="log.unsettle_fee"></td>
<td ng-if="log.sys_settlement_fee==log.settlement_fee" style="font-size:25px;text-align: center;"><a
role="button" ng-click="verifySettleLog(log)"><i
class="fa fa-check-circle text-green" uib-tooltip="校验通过"></i></a></td>
<td ng-if="log.sys_settlement_fee!=log.settlement_fee" style="font-size:25px;text-align: center;"><a
role="button" ng-click="verifySettleLog(log)"><i
class="fa fa-exclamation-circle text-red" uib-tooltip="校验未通过:点击重新验证"></i></a></td>
</tr>
</tbody>
</table>
<div class="panel-footer">
<div class="row">
<uib-pagination ng-if="wechatLogs.length"
class="pagination"
total-items="wechatPagination.totalCount"
boundary-links="true"
ng-model="wechatPagination.page"
items-per-page="wechatPagination.limit"
max-size="10"
ng-change="loadWechatLogs()"
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;"></uib-pagination>
<div class="col-xs-12">Total Records:{{wechatPagination.totalCount}};Total
Pages:{{wechatPagination.totalPages}}
</div>
</div>
</div>
</div>
</div>
</div> </div>

@ -6385,6 +6385,67 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
$scope.loadSubMerchantInfos() $scope.loadSubMerchantInfos()
}) })
} }
$scope.applyAlipayPlusRetailMerchantId = function () {
$uibModal
.open({
templateUrl: '/static/payment/partner/templates/apply_alipayplus_sub_merchant_id.html',
controller: 'applyAlipayPlusSubMerchantIdCtrl',
resolve: {
subMerchantInfo: function () {
return $scope.partner
},
online: false,
},
})
.result.then(function () {
$scope.loadSubMerchantInfos()
})
}
$scope.applyAlipayPlusOnlineMerchantId = function () {
$uibModal
.open({
templateUrl: '/static/payment/partner/templates/apply_alipayplus_sub_merchant_id.html',
controller: 'applyAlipayPlusSubMerchantIdCtrl',
resolve: {
subMerchantInfo: function () {
return $scope.partner
},
online: true,
},
})
.result.then(function () {
$scope.loadSubMerchantInfos()
})
}
$scope.queryAlipayPlusApsOnline = function () {
$http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipay_aps_online').then(
function (resp) {
commonDialog.alert({
title: 'AlipayPlus Online Apply Status',
content: resp.data.response_str,
type: 'info',
})
},
function (resp) {
commonDialog.alert({ title: 'Error', content: '查询失败:' + resp.data.message, type: 'error' })
}
)
};
$scope.queryAlipayPlusApsRetail = function () {
$http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipay_aps_retail').then(
function (resp) {
commonDialog.alert({
title: 'AlipayPlus Retail Apply Status',
content: resp.data.response_str,
type: 'info',
})
},
function (resp) {
commonDialog.alert({ title: 'Error', content: '查询失败:' + resp.data.message, type: 'error' })
}
)
};
// 刷新Wechat Sub Merchant Id // 刷新Wechat Sub Merchant Id
$scope.queryWechatSubMerchantIdStatus = function () { $scope.queryWechatSubMerchantIdStatus = function () {
$http.get('/sys/partners/' + $scope.partner.client_moniker + '/get_merchant_ids/' + $scope.partnerInfo.sub_merchant_id + '/status').then( $http.get('/sys/partners/' + $scope.partner.client_moniker + '/get_merchant_ids/' + $scope.partnerInfo.sub_merchant_id + '/status').then(
@ -6973,7 +7034,134 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
} }
}, },
]) ])
app.controller('updateApplyWxSubMerchantIdCtrl', [ /**
* 申请alipayplus
*/
app.controller('applyAlipayPlusSubMerchantIdCtrl', [
'$scope',
'$http',
'$uibModal',
'$state',
'subMerchantInfo',
'$filter',
'commonDialog',
'online',
function ($scope, $http, $uibModal, $state, subMerchantInfo, $filter, commonDialog,online) {
$scope.subMerchantInfo = angular.copy(subMerchantInfo)
$scope.subMerchantInfo.online=online;
$scope.subMerchantInfo.merchantDisplayName = $scope.subMerchantInfo.short_name;
$scope.subMerchantInfo.registrationAddress= $scope.subMerchantInfo.address;
// if ($scope.subMerchantInfo.client_pay_type) {
// if ($scope.subMerchantInfo.client_pay_type.indexOf('1') >= 0 && $scope.subMerchantInfo.client_pay_type.indexOf('2') >= 0) {
// $scope.subMerchantInfo.payment_type_online = true;
// $scope.subMerchantInfo.business_type_offline = true;
// } else if ($scope.subMerchantInfo.client_pay_type.indexOf('1') >= 0) {
// $scope.subMerchantInfo.business_type_offline = true
// } else if ($scope.subMerchantInfo.client_pay_type.indexOf('2') >= 0) {
// $scope.subMerchantInfo.business_type_agreement = true
// }
// } else {
// $scope.subMerchantInfo.payment_type_online = true;
// $scope.subMerchantInfo.business_type_offline = true;
// }
if($scope.subMerchantInfo.online) {
$scope.title = "AlipayPlus-aps(Online)Registration";
}else{
$scope.title = "AlipayPlus-aps(Retail)Registration";
}
$scope.subMerchantInfo.websiteType = 'WEB';
$scope.subMerchantInfo.website= $scope.subMerchantInfo.company_website;
$scope.subMerchantInfo.legalName = $scope.subMerchantInfo.company_name;
$scope.subMerchantInfo.registrationType='OTHER_IDENTIFICATION_NO'
if ($scope.subMerchantInfo.business_structure) {
$scope.subMerchantInfo.businessType = $scope.subMerchantInfo.business_structure != 'Registered body(Sole Trader)' ? 'ENTERPRISE' : 'INDIVIDUAL'
}
$scope.subMerchantInfo.shareholderName= $scope.subMerchantInfo.representativeInfo.representative_person;
$scope.subMerchantInfo.representativeName= $scope.subMerchantInfo.representativeInfo.representative_person;
$scope.subMerchantInfo.storeAddress= $scope.subMerchantInfo.address;
$scope.subMerchantInfo.registrationNo= $scope. subMerchantInfo.acn ? $scope.subMerchantInfo.acn : $scope.subMerchantInfo.abn;
$scope.subMerchantInfo.storeMCC=$scope.subMerchantInfo.alipayindustry;
$scope.subMerchantInfo.storeName=$scope.subMerchantInfo.store_name;
$scope.alipayMccCategory = {}
$scope.loadAlipayCategory = function () {
$http.get('/static/data/alipayMcc.json').then(function (resp) {
$scope.alipayMccCategory = resp.data
})
}
$scope.loadAlipayCategory()
$scope.onAlipayMccSelect = function (selectedItem) {
$scope.subMerchantInfo.alipay_category = selectedItem.label
$scope.subMerchantInfo.alipayindustry = selectedItem.mccCode
}
$scope.onAlipayStoreMccSelect = function (selectedItem) {
$scope.subMerchantInfo.storeMCC_category = selectedItem.label
$scope.subMerchantInfo.storeMCC = selectedItem.mccCode
}
$scope.saveAlipayApply = function (form) {
$scope.errmsg = null
if (form.$invalid) {
angular.forEach(form, function (item, key) {
if (key.indexOf('$') < 0) {
item.$dirty = true
}
})
return;
}
var params = {
websiteType: $scope.subMerchantInfo.websiteType,
merchantDisplayName: $scope.subMerchantInfo.merchantDisplayName,
merchantMCC: $scope.subMerchantInfo.alipayindustry,
legalName: $scope.subMerchantInfo.legalName,
registrationType: $scope.subMerchantInfo.registrationType,
registrationNo: $scope.subMerchantInfo.registrationNo,
businessType: $scope.subMerchantInfo.businessType,
shareholderName: $scope.subMerchantInfo.shareholderName,
shareholderId: $scope.subMerchantInfo.shareholderId,
representativeName: $scope.subMerchantInfo.representativeName,
representativeId: $scope.subMerchantInfo.representativeId,
storeName: $scope.subMerchantInfo.storeName,
storeMCC: $scope.subMerchantInfo.storeMCC,
storeAddress: $scope.subMerchantInfo.storeAddress,
registrationAddress: $scope.subMerchantInfo.registrationAddress,
}
params.productCodes=[];
if($scope.subMerchantInfo.online){
params.productCodes.push('CASHIER_PAYMENT');
}else{
params.productCodes.push('IN_STORE_PAYMENT');
}
params.websites=[]
if($scope.subMerchantInfo.online){
params.websites.push($scope.subMerchantInfo.website);
}
$http.post('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/apply_alipayplus', params).then(
function (resp) {
if(resp.data.success) {
commonDialog.alert({ title: 'Success', content: "注册成功!", type: 'success' })
}else{
commonDialog.alert({title: 'Error', content: "注册失败!", type: 'error'})
}
$scope.$close()
},
function (resp) {
$scope.flag = false
commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' })
}
)
};
},
])
app.controller('updateApplyWxSubMerchantIdCtrl', [
'$scope', '$scope',
'$http', '$http',
'$uibModal', '$uibModal',

@ -0,0 +1,284 @@
<div class="content">
<form novalidate name="subForm">
<div class="row">
<div class="col-sm-12">
<div class="panel panel-default">
<div class="panel-heading" > {{title}}</div>
<div class="panel-body">
<div class="form-horizontal">
<div class="form-group"
ng-class="{'has-error':subForm.merchantDisplayName.$invalid && subForm.merchant_storename.$dirty}">
<label class="control-label col-sm-4" for="merchantDisplayName_input">Merchant DisplayName</label>
<div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.merchantDisplayName"
type="text" name="merchantDisplayName" id="merchantDisplayName_input" required maxlength="50">
<div ng-messages="subForm.merchantDisplayName.$error" ng-if="subForm.merchantDisplayName.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Length is more than 50</p>
</div>
</div>
</div>
<!--<div class="form-group"-->
<!--ng-class="{'has-error':subForm.merchant_name.$invalid && subForm.merchant_name.$dirty}">-->
<!--<label class="control-label col-sm-4">* Payment Type</label>-->
<!--<div class="col-sm-8">-->
<!--<span class="checkbox-inline">-->
<!--<input type="checkbox" ng-model="subMerchantInfo.payment_type_online"> <p>Online Payment</p>-->
<!--</span>-->
<!--<span class="checkbox-inline">-->
<!--<input type="checkbox" ng-model="subMerchantInfo.business_type_offline"><p>Offline Payment</p>-->
<!--</span>-->
<!--<span class="checkbox-inline">-->
<!--<input type="checkbox" ng-model="subMerchantInfo.business_type_agreement"><p>Agreement Payment</p>-->
<!--</span>-->
<!--</div>-->
<!--</div>-->
<div class="form-group"
ng-class="{'has-error':partnerForm.alipay_category.$invalid && partnerForm.alipay_category.$dirty}">
<label class="control-label col-sm-4"
for="alipay_category">*Alipay Category</label>
<div class="col-sm-8" >
<input class="form-control" id="alipay_category" required
name="alipay_category" readonly
ng-model="subMerchantInfo.alipayindustry|partner_alipay_industry"
multi-level-select-popup="alipayMccCategory"
on-select="onAlipayMccSelect($selected)"
chose-one-level="false">
<div ng-messages="partnerForm.alipay_category.$error"
ng-if="partnerForm.alipay_category.$dirty">
<p class="small text-danger" ng-message="required">Required
Field</p>
</div>
</div>
</div>
<div class="form-group" ng-if="subMerchantInfo.online"
ng-class="{'has-error':subForm.websites.$invalid && subForm.websites.$dirty}">
<label class="control-label col-sm-4" for="websites_input">* Web site</label>
<div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.website"
type="text" name="websites" id="websites_input" required maxlength="1000">
<div ng-messages="subForm.websites.$error" ng-if="subForm.websites.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Length is more than 1000</p>
</div>
</div>
</div>
<div class="form-group" ng-if="subMerchantInfo.online"
ng-class="{'has-error':subForm.websiteType.$invalid && subForm.websiteType.$dirty}">
<label class="control-label col-sm-4">* WebsiteType</label>
<div class="col-sm-8">
<div class="radio-inline">
<input type="radio" name="websiteType" value="WEB" ng-model="subMerchantInfo.websiteType"/>
<label>Web</label>
</div>
<div class="radio-inline">
<input type="radio" name="websiteType" value="APP" ng-model="subMerchantInfo.websiteType"/>
<label>App</label>
</div>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':subForm.legalName.$invalid && subForm.legalName.$dirty}">
<label class="control-label col-sm-4" for="legalName_input">* Legal Name</label>
<div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.legalName"
type="text" name="legalName" id="legalName_input" required maxlength="256">
<div ng-messages="subForm.legalName.$error" ng-if="subForm.legalName.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Length is more than 256</p>
</div>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':subForm.registrationType.$invalid && subForm.registrationType.$dirty}">
<label class="control-label col-sm-4">* Registration Type</label>
<div class="col-sm-8">
<div class="radio-inline">
<input type="radio" name="registrationType" value="US_FEDERAL_EIN" ng-model="subMerchantInfo.registrationType"/>
<label> (Employer Identification Number) EIN of US merchant.</label>
</div>
<div class="radio-inline">
<input type="radio" name="registrationType" value="ENTERPRISE_REGISTRATION_NO" ng-model="subMerchantInfo.registrationType"/>
<label>Merchant registration ID.</label>
</div>
<div class="radio-inline">
<input type="radio" name="registrationType" value="INDEPENDENT_CONTRACTOR_LICENSE_NO" ng-model="subMerchantInfo.registrationType"/>
<label>The license number of ride-share driver or taxi driver.</label>
</div>
<div class="radio-inline">
<input type="radio" name="registrationType" value="OTHER_IDENTIFICATION_NO" ng-model="subMerchantInfo.registrationType"/>
<label>Other registration type. </label>
</div>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':subForm.registrationNo.$invalid && subForm.registrationNo.$dirty}">
<label class="control-label col-sm-4" for="registrationNo_input">* Registration No</label>
<div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.registrationNo"
type="text" name="registrationNo" id="registrationNo_input" required maxlength="64">
<div ng-messages="subForm.registrationNo.$error" ng-if="subForm.registrationNo.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Length is more than 64</p>
</div>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':subForm.registrationAddress.$invalid && subForm.registrationAddress.$dirty}">
<label class="control-label col-sm-4" for="registrationAddress_input">* Registration Address</label>
<div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.registrationAddress"
type="text" name="registrationAddress" id="registrationAddress_input" required maxlength="256">
<div ng-messages="subForm.registrationAddress.$error" ng-if="subForm.registrationAddress.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Length is more than 64</p>
</div>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':subForm.businessType.$invalid && subForm.businessType.$dirty}">
<label class="control-label col-sm-4"
for="businessType_select">* Business Type</label>
<div class="col-sm-8">
<select class="form-control" ng-model="subMerchantInfo.businessType"
id="businessType_select"
name="businessType" required>
<option value="">Please Choose</option>
<option value="ENTERPRISE" >ENTERPRISE</option>
<option value="INDIVIDUAL">INDIVIDUAL</option>
</select>
<div ng-messages="subForm.businessType.$error" ng-if="subForm.businessType.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
</div>
</div>
</div>
<!--ng-if="subMerchantInfo.businessType == 'ENTERPRISE'"-->
<div class="form-group" ng-if="subMerchantInfo.businessType == 'ENTERPRISE'"
ng-class="{'has-error':subForm.shareholderName.$invalid && subForm.shareholderName.$dirty}">
<label class="control-label col-sm-4" for="shareholderName_input">* Shareholder Name</label>
<div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.shareholderName"
type="text" name="shareholderName" id="shareholderName_input" required maxlength="128">
<div ng-messages="subForm.shareholderName.$error" ng-if="subForm.shareholderName.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Length is more than 128</p>
</div>
</div>
</div>
<div class="form-group" ng-if="subMerchantInfo.businessType == 'ENTERPRISE'"
ng-class="{'has-error':subForm.shareholderId.$invalid && subForm.shareholderId.$dirty}">
<label class="control-label col-sm-4" for="shareholderId_input">* Shareholder Id</label>
<div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.shareholderId"
type="text" name="shareholderId" id="shareholderId_input" required maxlength="128">
<div ng-messages="subForm.shareholderId.$error" ng-if="subForm.shareholderId.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Length is more than 128</p>
</div>
</div>
</div>
<div class="form-group" ng-if="subMerchantInfo.businessType == 'ENTERPRISE'"
ng-class="{'has-error':subForm.representativeName.$invalid && subForm.representativeName.$dirty}">
<label class="control-label col-sm-4" for="representativeName_input">* Representative Name</label>
<div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.representativeName"
type="text" name="representativeName" id="representativeName_input" required maxlength="128">
<div ng-messages="subForm.representativeName.$error" ng-if="subForm.representativeName.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Length is more than 128</p>
</div>
</div>
</div>
<div class="form-group" ng-if="subMerchantInfo.businessType == 'ENTERPRISE'"
ng-class="{'has-error':subForm.representativeId.$invalid && subForm.representativeId.$dirty}">
<label class="control-label col-sm-4" for="representativeId_input">* Representative Id</label>
<div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.representativeId"
type="text" name="representativeId" id="representativeId_input" required maxlength="128">
<div ng-messages="subForm.representativeId.$error" ng-if="subForm.representativeId.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Length is more than 128</p>
</div>
</div>
</div>
<!-- 店铺名称 -->
<div class="form-group" ng-if="!subMerchantInfo.online"
ng-class="{'has-error':subForm.storeName.$invalid && subForm.storeName.$dirty}">
<label class="control-label col-sm-4" for="storeName_input">* Store Name</label>
<div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.storeName"
type="text" name="storeName" id="storeName_input" required maxlength="256">
<div ng-messages="subForm.storeName.$error" ng-if="subForm.storeName.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Length is more than 256</p>
</div>
</div>
</div>
<!-- 店铺MCC -->
<div class="form-group" ng-if="!subMerchantInfo.online"
ng-class="{'has-error':partnerForm.storeMCC.$invalid && partnerForm.storeMCC.$dirty}">
<label class="control-label col-sm-4"
for="storeMCC">*Store MCC</label>
<div class="col-sm-8" >
<input class="form-control" id="storeMCC" required
name="storeMCC" readonly
ng-model="subMerchantInfo.storeMCC|partner_alipay_industry"
multi-level-select-popup="alipayMccCategory"
on-select="onAlipayStoreMccSelect($selected)"
chose-one-level="false">
<div ng-messages="partnerForm.storeMCC.$error"
ng-if="partnerForm.storeMCC.$dirty">
<p class="small text-danger" ng-message="required">Required
Field</p>
</div>
</div>
</div>
<!-- 商店地址-->
<div class="form-group" ng-if="!subMerchantInfo.online"
ng-class="{'has-error':subForm.storeAddress.$invalid && subForm.storeAddress.$dirty}">
<label class="control-label col-sm-4" for="storeAddress_input">* Store Address</label>
<div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.storeAddress"
type="text" name="storeAddress" id="storeAddress_input" maxlength="256" required>
<div ng-messages="subForm.storeAddress.$error" ng-if="subForm.storeAddress.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Length is more than 256</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="btn-group margin-bottom margin-top">
<button class="btn btn-success" type="button"
ng-click="saveAlipayApply(subForm)">Submit
</button>
</div>
</div>
</div>
</form>
</div>

@ -232,6 +232,89 @@
</div> </div>
</div> </div>
</div> </div>
<div class="content content-mine">
<div class="row">
<div class="col-sm-12">
<div class="box-solid">
<div class="panel panel-default">
<div class="panel-heading">
<div class="flex-between">
<div class="flex-align-center">
<img src="/static/images/alipay_online.png" style="width: 16px;height: 16px;"
uib-tooltip="AlipayPlus" />
<h5 style="margin-left: 5px;">
AlipayPlus(Retail) : <span ng-bind="partnerInfo.ali_sub_merchant_id"></span>
<span ng-if="!partnerInfo.ali_sub_merchant_id">none</span>
</h5>
<a role="button"
ng-click="modifySubMerchantId(partnerInfo.ali_sub_merchant_id,'AlipayPlus')"
style="margin-left: 5px;"><i class="fa fa-edit"></i></a>
</div>
<div>
<button role="button" class="btn btn-info" title="Apply Sub Merchant Id"
ng-click="applyAlipayPlusRetailMerchantId()">
<i class="fa fa-plus"></i> Apply
</button>
<button role="button" class="btn btn-info" ng-click="queryAlipayPlusApsRetail()">
<i class="fa fa-search"></i> Result
</button>
</div>
</div>
</div>
<div class="panel-body">
<div style="display: flex;justify-content: center;">
<small style="color: rgba(0,0,0,.25);">No Data</small>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="content content-mine">
<div class="row">
<div class="col-sm-12">
<div class="box-solid">
<div class="panel panel-default">
<div class="panel-heading">
<div class="flex-between">
<div class="flex-align-center">
<img src="/static/images/alipay_online.png" style="width: 16px;height: 16px;"
uib-tooltip="AlipayPlus" />
<h5 style="margin-left: 5px;">
AlipayPlus(Online) : <span ng-bind="partnerInfo.ali_sub_merchant_id"></span>
<span ng-if="!partnerInfo.ali_sub_merchant_id">none</span>
</h5>
<a role="button"
ng-click="modifySubMerchantId(partnerInfo.ali_sub_merchant_id,'AlipayPlus')"
style="margin-left: 5px;"><i class="fa fa-edit"></i></a>
</div>
<div>
<button role="button" class="btn btn-info" title="Apply Sub Merchant Id"
ng-click="applyAlipayPlusOnlineMerchantId()">
<i class="fa fa-plus"></i> Apply
</button>
<button role="button" class="btn btn-info" ng-click="queryAlipayPlusApsOnline()">
<i class="fa fa-search"></i> Result
</button>
</div>
</div>
</div>
<div class="panel-body">
<div style="display: flex;justify-content: center;">
<small style="color: rgba(0,0,0,.25);">No Data</small>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Rpay+ --> <!-- Rpay+ -->
<div class="content content-mine"> <div class="content content-mine">
<div class="row"> <div class="row">

Loading…
Cancel
Save