Commit 38f1d6428fa0048313f19a1ad6b9e1be650b6eed
Merge remote-tracking branch 'origin/pay_extension' into pay_extension
Showing
16 changed files
with
218 additions
and
27 deletions
sql/ruoyi-vue-pro.sql
| @@ -982,6 +982,7 @@ CREATE TABLE `pay_channel` ( | @@ -982,6 +982,7 @@ CREATE TABLE `pay_channel` ( | ||
| 982 | -- ---------------------------- | 982 | -- ---------------------------- |
| 983 | BEGIN; | 983 | BEGIN; |
| 984 | INSERT INTO `pay_channel` VALUES (9, 'wx_pub', 0, NULL, 1, 1, 6, '{\"@class\":\"cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig\",\"appId\":\"wx041349c6f39b268b\",\"mchId\":\"1545083881\",\"apiVersion\":\"v2\",\"mchKey\":\"0alL64UDQdlCwiKZ73ib7ypaIjMns06p\",\"privateKeyContent\":\"-----BEGIN PRIVATE KEY-----\\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5q2hYE3loOQoH\\nl/2kh/epuj17W8VpV5vBl7ysJWAbBXux6mlq4gKTHD0QUQdiKtDEUm/bKC9Bi6VU\\nuklM5Y8oCaCbhjklHRbET8jsgd9phSNGviHclYRLsQRO8oXnN89kN0y7DYKm0hYd\\nmaiS12Z3v8VaImSTr4HVeHlC/z3S6mdwSr263stKt931YTcbTj/QFH7znsv9Na0u\\nX6LaMBEEAsJctWdm8Ndrd1tGh9Fzf0DA5VRXsJR3kkWspy+IwiDTPV/FDKOU9NJC\\nSxMmDePerTfkoZ2s1rltqBK0ykDJrXtxR+hTzEsKZ/KpNi8tyYpfNZsviHIlUsLP\\nFJ5UvUhpAgMBAAECggEAd90NltazqTIxpGdeCwrwOzWNnYbIclJprlhMKIJUgf1P\\nNrPTbHoOGXTAgzkcYCat8iAaMEzH/TOu/3zn92m3uqxEcEL9v1UBLqknWHAbkB6w\\ngGocqDAqYUcdNe5hvbyM+fCta5C0SQgV2PQrHOlMMICwYpkTfzhtxCdreXIYMoGg\\nJEIRkZWgrm/N7LTtNgizznuUjy6OURWjXaWKPcs3b3j6G1gLj9Vp++z4y0u51nqM\\n4R6fcvl8M6BjlcC8zo6DbOvCW8cXtuXsnru+2TPrUnsGeybJok4fEQsfW1BvpvPo\\nief38rYJn4OWxIrHcpWrhNtXtgRPeiMGFfIsEQDmVQKBgQDzXK6Nn3Nr3TFfGVTy\\n8QYrzOuY2NqzH8nnsLL6qn3HoKxTv+PcFKOTPsi6f4hIYCzBP0esRrPv0ffMu9oQ\\nJvFtCJvMmcKGtp0Q5hcj0y/XkbC3AWuahJtBv8lhKXVnQXSL0j3+ombljw4/8yN0\\nAzgBz+j/skQQgZ3sN5h+DHGtgwKBgQDDT784/2pd4m86c/uBmrwYfqu6MJo0eHJh\\n1XPtE+u8pOHyNTFk77rKobKDqN5VlrF0uEmBc/08LKhyxJ3vh/zAbcmqT1Mq778y\\nAKKUtVmvcaVDrvSQHsnhj0zt4SHGmmU34U2b9hV+nocq5VszX6/jp//HJi9bs3We\\ndAzfFCmaowKBgC1MmDVGc+6lCraf+X8LPFHU4Bnga70h8qxM6NPd/nG1R76DHn/t\\n25DiA+0rJgwK0unZxJadxoqic9TJNssA5Lmd+5o3GM2Imm311mLVwbcHqHQ4MHZf\\nrqKrd2m9lNv2hCIurVmDk1Gxsj5XHMdQfhFgSQengCHubp30r07vNA3PAoGAUEAE\\nIjdQTSMs8KeXP7mEb8wcY3R05/pVhT1fVJpK0kgtTofss7yM05V88/v+3sv8Pik6\\niqZN9tuimwWOn00Q3UA/DGtrkMjRlooMQ24AW8YmUZkhg9YivTtUMKnAZwopbLx2\\nVw7V5iDdCRMUVheK/c+ZmQpnixZBzcmBQGfYcGECgYBjEq3Mem+Aw6pXOu6+0FwH\\n9y6Xi4HhBkq0OOZZuXFtWVry7YrD3pBgzWVAZJqJCkyPKKZzCzwdbFd3u0lYBs35\\nzYgx7ug4hR+wfI980a3vxjcWGOqnOUUnUJ7ucIa+KDgnYV/bBy4jqpVreXmWAJXl\\nfyjG3eLWBrtrsI9YX6zeAA==\\n-----END PRIVATE KEY-----\\n\",\"privateCertContent\":\"-----BEGIN CERTIFICATE-----\\nMIID6TCCAtGgAwIBAgIUNkEHq6aQcF80NSYqWS58ybsJzI4wDQYJKoZIhvcNAQEL\\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\\nQ0EwHhcNMjExMDIxMDU0NTQxWhcNMjYxMDIwMDU0NTQxWjB7MRMwEQYDVQQDDAox\\nNTQ1MDgzODgxMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM\\nHuWOhuWfjuWMuuWkp+adjuWwp+aXpeeUqOWTgeW6lzELMAkGA1UEBgwCQ04xETAP\\nBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\\nuatoWBN5aDkKB5f9pIf3qbo9e1vFaVebwZe8rCVgGwV7seppauICkxw9EFEHYirQ\\nxFJv2ygvQYulVLpJTOWPKAmgm4Y5JR0WxE/I7IHfaYUjRr4h3JWES7EETvKF5zfP\\nZDdMuw2CptIWHZmoktdmd7/FWiJkk6+B1Xh5Qv890upncEq9ut7LSrfd9WE3G04/\\n0BR+857L/TWtLl+i2jARBALCXLVnZvDXa3dbRofRc39AwOVUV7CUd5JFrKcviMIg\\n0z1fxQyjlPTSQksTJg3j3q035KGdrNa5bagStMpAya17cUfoU8xLCmfyqTYvLcmK\\nXzWbL4hyJVLCzxSeVL1IaQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMC\\nBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1\\nYmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMw\\nMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IBAQBe7XgncAY/1PLbCsnMsYt11k3V\\n2cdNZ+yuCxhlOEKk3nHE6WCTL6zL0qWlTKKpnw1rE/+4OS76Tg72wWXcHfHDAOgt\\n9icp62cKx1WO3QweeZpSvLDmtdLgKKrqeIWh+rL8+ZhuAOxSkaRwcsMTWDaLeDOi\\n0pGeqvfG8WNhPxkkaSI8xbiTK641Yg9WT/Q4yfHS7Q6wg1dj9YQdo0dvVB0S2Nir\\nX9IK6PUaHDnQeFKDmKgLkDGLaKaiijEvC91wMEE6qB8b0eNhciaxq2YhGHcFmSRP\\nWUyc5CmBadt7wIOH5Z3bfuwWGxqxKjNw/baM/d+nk7hlDr01YL9c0g16B9MW\\n-----END CERTIFICATE-----\\n\",\"apiV3Key\":\"joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase\"}', NULL, '2021-10-23 17:12:10', NULL, '2021-10-23 17:12:10', b'0'); | 984 | INSERT INTO `pay_channel` VALUES (9, 'wx_pub', 0, NULL, 1, 1, 6, '{\"@class\":\"cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig\",\"appId\":\"wx041349c6f39b268b\",\"mchId\":\"1545083881\",\"apiVersion\":\"v2\",\"mchKey\":\"0alL64UDQdlCwiKZ73ib7ypaIjMns06p\",\"privateKeyContent\":\"-----BEGIN PRIVATE KEY-----\\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5q2hYE3loOQoH\\nl/2kh/epuj17W8VpV5vBl7ysJWAbBXux6mlq4gKTHD0QUQdiKtDEUm/bKC9Bi6VU\\nuklM5Y8oCaCbhjklHRbET8jsgd9phSNGviHclYRLsQRO8oXnN89kN0y7DYKm0hYd\\nmaiS12Z3v8VaImSTr4HVeHlC/z3S6mdwSr263stKt931YTcbTj/QFH7znsv9Na0u\\nX6LaMBEEAsJctWdm8Ndrd1tGh9Fzf0DA5VRXsJR3kkWspy+IwiDTPV/FDKOU9NJC\\nSxMmDePerTfkoZ2s1rltqBK0ykDJrXtxR+hTzEsKZ/KpNi8tyYpfNZsviHIlUsLP\\nFJ5UvUhpAgMBAAECggEAd90NltazqTIxpGdeCwrwOzWNnYbIclJprlhMKIJUgf1P\\nNrPTbHoOGXTAgzkcYCat8iAaMEzH/TOu/3zn92m3uqxEcEL9v1UBLqknWHAbkB6w\\ngGocqDAqYUcdNe5hvbyM+fCta5C0SQgV2PQrHOlMMICwYpkTfzhtxCdreXIYMoGg\\nJEIRkZWgrm/N7LTtNgizznuUjy6OURWjXaWKPcs3b3j6G1gLj9Vp++z4y0u51nqM\\n4R6fcvl8M6BjlcC8zo6DbOvCW8cXtuXsnru+2TPrUnsGeybJok4fEQsfW1BvpvPo\\nief38rYJn4OWxIrHcpWrhNtXtgRPeiMGFfIsEQDmVQKBgQDzXK6Nn3Nr3TFfGVTy\\n8QYrzOuY2NqzH8nnsLL6qn3HoKxTv+PcFKOTPsi6f4hIYCzBP0esRrPv0ffMu9oQ\\nJvFtCJvMmcKGtp0Q5hcj0y/XkbC3AWuahJtBv8lhKXVnQXSL0j3+ombljw4/8yN0\\nAzgBz+j/skQQgZ3sN5h+DHGtgwKBgQDDT784/2pd4m86c/uBmrwYfqu6MJo0eHJh\\n1XPtE+u8pOHyNTFk77rKobKDqN5VlrF0uEmBc/08LKhyxJ3vh/zAbcmqT1Mq778y\\nAKKUtVmvcaVDrvSQHsnhj0zt4SHGmmU34U2b9hV+nocq5VszX6/jp//HJi9bs3We\\ndAzfFCmaowKBgC1MmDVGc+6lCraf+X8LPFHU4Bnga70h8qxM6NPd/nG1R76DHn/t\\n25DiA+0rJgwK0unZxJadxoqic9TJNssA5Lmd+5o3GM2Imm311mLVwbcHqHQ4MHZf\\nrqKrd2m9lNv2hCIurVmDk1Gxsj5XHMdQfhFgSQengCHubp30r07vNA3PAoGAUEAE\\nIjdQTSMs8KeXP7mEb8wcY3R05/pVhT1fVJpK0kgtTofss7yM05V88/v+3sv8Pik6\\niqZN9tuimwWOn00Q3UA/DGtrkMjRlooMQ24AW8YmUZkhg9YivTtUMKnAZwopbLx2\\nVw7V5iDdCRMUVheK/c+ZmQpnixZBzcmBQGfYcGECgYBjEq3Mem+Aw6pXOu6+0FwH\\n9y6Xi4HhBkq0OOZZuXFtWVry7YrD3pBgzWVAZJqJCkyPKKZzCzwdbFd3u0lYBs35\\nzYgx7ug4hR+wfI980a3vxjcWGOqnOUUnUJ7ucIa+KDgnYV/bBy4jqpVreXmWAJXl\\nfyjG3eLWBrtrsI9YX6zeAA==\\n-----END PRIVATE KEY-----\\n\",\"privateCertContent\":\"-----BEGIN CERTIFICATE-----\\nMIID6TCCAtGgAwIBAgIUNkEHq6aQcF80NSYqWS58ybsJzI4wDQYJKoZIhvcNAQEL\\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\\nQ0EwHhcNMjExMDIxMDU0NTQxWhcNMjYxMDIwMDU0NTQxWjB7MRMwEQYDVQQDDAox\\nNTQ1MDgzODgxMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM\\nHuWOhuWfjuWMuuWkp+adjuWwp+aXpeeUqOWTgeW6lzELMAkGA1UEBgwCQ04xETAP\\nBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\\nuatoWBN5aDkKB5f9pIf3qbo9e1vFaVebwZe8rCVgGwV7seppauICkxw9EFEHYirQ\\nxFJv2ygvQYulVLpJTOWPKAmgm4Y5JR0WxE/I7IHfaYUjRr4h3JWES7EETvKF5zfP\\nZDdMuw2CptIWHZmoktdmd7/FWiJkk6+B1Xh5Qv890upncEq9ut7LSrfd9WE3G04/\\n0BR+857L/TWtLl+i2jARBALCXLVnZvDXa3dbRofRc39AwOVUV7CUd5JFrKcviMIg\\n0z1fxQyjlPTSQksTJg3j3q035KGdrNa5bagStMpAya17cUfoU8xLCmfyqTYvLcmK\\nXzWbL4hyJVLCzxSeVL1IaQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMC\\nBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1\\nYmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMw\\nMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IBAQBe7XgncAY/1PLbCsnMsYt11k3V\\n2cdNZ+yuCxhlOEKk3nHE6WCTL6zL0qWlTKKpnw1rE/+4OS76Tg72wWXcHfHDAOgt\\n9icp62cKx1WO3QweeZpSvLDmtdLgKKrqeIWh+rL8+ZhuAOxSkaRwcsMTWDaLeDOi\\n0pGeqvfG8WNhPxkkaSI8xbiTK641Yg9WT/Q4yfHS7Q6wg1dj9YQdo0dvVB0S2Nir\\nX9IK6PUaHDnQeFKDmKgLkDGLaKaiijEvC91wMEE6qB8b0eNhciaxq2YhGHcFmSRP\\nWUyc5CmBadt7wIOH5Z3bfuwWGxqxKjNw/baM/d+nk7hlDr01YL9c0g16B9MW\\n-----END CERTIFICATE-----\\n\",\"apiV3Key\":\"joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase\"}', NULL, '2021-10-23 17:12:10', NULL, '2021-10-23 17:12:10', b'0'); |
| 985 | +INSERT INTO `pay_channel` VALUES (10, 'alipay_wap', 0, NULL, 1, 1, 6, '{\"@class\":\"cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayPayClientConfig\",\"serverUrl\":\"https://openapi.alipaydev.com/gateway.do\",\"appId\":\"2021000118641792\",\"signType\":\"RSA2\",\"mode\":1,\"privateKey\":\"MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDV+VmQ1FiAG1IOESPpZjDFYqkFptjck3KS8uTKk/QItz8KAKcRhL6X8x2hmIiel9SIWuZjmrBO0sCHRwNpfvbNNeIcFCK7cNf/VXO4vTiokeFb5htuAeKkprWE0NTZYW0L5BIt1ogJxDRhUUQM2JWchJmbMLKl2RU7FSrmsLFwIHq85LueWGyF7zTLvurtEYWv1DflGf7cZqtW0JvWMR4PJVFdbIJ/5KgxQ5j/BJLKwapgfEZWvdsLO2AuQjCYv5yb/SvyRuUV48zAvLcIHaim/qHm5GmnZNynBeovzfBjTmVZrx0HI6S5B0yLOoRes4GBBCQpFXL8Ov9uowHHwpH9AgMBAAECggEAIQteCqDQfhA6DtQU0LGobIM9CRNoQEBBHHKIZMSOll3+TUQmiO0QJhU0iUUuLBfUia5IEC/OdI3Vj86mtz8VTEG7Bo0RhBL8OIFw2qHWQyosPG3/5HBEGRtpwvYhOOTz2zdAm3WbEq8LS9AqCzXTfRV5R18w563runEda/zzmhYRo8INr09G3HYLo83i3LPLAVMi+ndOqxtKamNc3hCehezo/34DleA2/1/giQLhqhzHzEM0KwYPmBRoij3/jnPSZFwe8sXS8PwVX9bmiXtIEluvzwMylsMqMcmL89reFRRiskbVAVV8zWqa/06wjqbSARNTTZYJa6LQ8sjsdGAJvQKBgQD0Ka0Zu77+axgy6AzXvLx0KaC+0iwobr2g8X5R07ZyqoBlPlLUcHC6nRRHIYhZLfEYBFfFpUj8osReKDWJ2euonevGFGr8OxmZe1BX+LPf+9hVWDhTmbD++ZSdgOQMJ9a4BJF4YHkYcCfWwYnsg8ZUlrmeh4+SbkgRp1x0xLswiwKBgQDgWP+YVxQz3AmRQmIAtZbqfiDzOntHJyrJC1tDEX3Q/dA6PopWUYaSqFJuGJYvUW1ycBl2skKYFlxVGQgUB3ZrhuumzINc24XSWMQoNpkewMG54qXfuSA57PzNXmHcvyLL2HQxISCD9yNJul6ecsGnPUWuaDLC16ZF/Q3ChrjQlwKBgGKCAgW02qz49k1rk+riicHwHZt/XjN94mHxrL5ExYJjyeOPDooJR2HzCABexgz83R2MewER222aGdHHNTqFwm9IL5y+Fh/nlD95IgQsIh5HFJPyQN9xzZhBh7U4EEnbNOUPasV/Xrv+XARoF0ZmL/lmykLsfH9eoRMGS+YMjV1bAoGAFttaZxXwG/x+CQufWn0lvAxPpRg/OReXd1Yt3R5qGCHT1itLAtJZiJWXmFnu6zE7ml4rafltaXtVuuHK/edovDnJxnutoodHEhAzI/m0DfsLgbnCtpFw5BXuB6pnBAuBKw2JgPvkCS3jrX5MZ44/hp9qewNosIsyCI1omnoJWE8CgYBUR1L5i1Z9sQdIw8E4MOzbc5uliTX2nJVG65bLc/+Cp3W3YoQw7RK8qiTv8XoOICMJXCBww2roM4HkbwJ3knQbbTiMyksRyLHvDuTg4UdH4pkNDxGsQND9sUd3bR5fayH0Z/QBohuLOFHP/C7WaHPwa4hZBKavibiWhmDtzdmOIw==\",\"alipayPublicKey\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv5w0ByG2xxiw///4NJiynTyjvZOX9Xb1p+A2TMJdOdwx1eWrYHv4mW7rvKfpxD5shZtU1lxzXLT3EGCAnW8f8SVDj+v+UAu3HEaKDgyqO6WA1ZLVSrCLPTb4u1C3ozbKaim88sl9+TxeaNUwuIpWshLDYoseMgRYp/VLUfpMNkueGKczkDkGH/4BY8lj/dsIItLqU9Px4PIpGCztm0vrg7mvH4XlSk5b5ui9uQ05AhS+PHTGrloY9AOrtjQTZmVebEUHf1pVmoofUr0q1TqhS9HQU1XIkxRnxOvmOcscH4rE2qMKajk4dR5rgnuNPRWSj24xwbNf3nSHDTAH7PDogwIDAQAB\",\"appCertContent\":null,\"alipayPublicCertContent\":null,\"rootCertContent\":null}', NULL, '2021-11-02 17:12:10', NULL, '2021-11-02 17:12:10', b'0'); | ||
| 985 | COMMIT; | 986 | COMMIT; |
| 986 | 987 | ||
| 987 | -- ---------------------------- | 988 | -- ---------------------------- |
| @@ -1250,7 +1251,7 @@ CREATE TABLE `pay_order_extension` ( | @@ -1250,7 +1251,7 @@ CREATE TABLE `pay_order_extension` ( | ||
| 1250 | `user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户 IP', | 1251 | `user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户 IP', |
| 1251 | `status` tinyint NOT NULL COMMENT '支付状态', | 1252 | `status` tinyint NOT NULL COMMENT '支付状态', |
| 1252 | `channel_extras` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '支付渠道的额外参数', | 1253 | `channel_extras` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '支付渠道的额外参数', |
| 1253 | - `channel_notify_data` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '支付渠道异步通知的内容', | 1254 | + `channel_notify_data` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '支付渠道异步通知的内容', |
| 1254 | `creator` varchar(64) DEFAULT '' COMMENT '创建者', | 1255 | `creator` varchar(64) DEFAULT '' COMMENT '创建者', |
| 1255 | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | 1256 | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', |
| 1256 | `updater` varchar(64) DEFAULT '' COMMENT '更新者', | 1257 | `updater` varchar(64) DEFAULT '' COMMENT '更新者', |
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayOrderCoreService.java
| 1 | package cn.iocoder.yudao.coreservice.modules.pay.service.order; | 1 | package cn.iocoder.yudao.coreservice.modules.pay.service.order; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; | 3 | import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; |
| 4 | + | ||
| 4 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO; | 5 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO; |
| 5 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO; | 6 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO; |
| 6 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO; | 7 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO; |
| 8 | +import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO; | ||
| 7 | 9 | ||
| 8 | import javax.validation.Valid; | 10 | import javax.validation.Valid; |
| 9 | 11 | ||
| @@ -46,6 +48,6 @@ public interface PayOrderCoreService { | @@ -46,6 +48,6 @@ public interface PayOrderCoreService { | ||
| 46 | * @param channelCode 渠道编码 | 48 | * @param channelCode 渠道编码 |
| 47 | * @param notifyData 通知数据 | 49 | * @param notifyData 通知数据 |
| 48 | */ | 50 | */ |
| 49 | - void notifyPayOrder(Long channelId, String channelCode, String notifyData) throws Exception; | 51 | + void notifyPayOrder(Long channelId, String channelCode, NotifyDataDTO notifyData) throws Exception; |
| 50 | 52 | ||
| 51 | } | 53 | } |
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/impl/PayOrderCoreServiceImpl.java
| @@ -18,6 +18,7 @@ import cn.iocoder.yudao.coreservice.modules.pay.service.merchant.PayChannelCoreS | @@ -18,6 +18,7 @@ import cn.iocoder.yudao.coreservice.modules.pay.service.merchant.PayChannelCoreS | ||
| 18 | import cn.iocoder.yudao.coreservice.modules.pay.service.notify.PayNotifyCoreService; | 18 | import cn.iocoder.yudao.coreservice.modules.pay.service.notify.PayNotifyCoreService; |
| 19 | import cn.iocoder.yudao.coreservice.modules.pay.service.notify.dto.PayNotifyTaskCreateReqDTO; | 19 | import cn.iocoder.yudao.coreservice.modules.pay.service.notify.dto.PayNotifyTaskCreateReqDTO; |
| 20 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayOrderCoreService; | 20 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayOrderCoreService; |
| 21 | + | ||
| 21 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO; | 22 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO; |
| 22 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO; | 23 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO; |
| 23 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO; | 24 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO; |
| @@ -26,6 +27,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | @@ -26,6 +27,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | ||
| 26 | import cn.iocoder.yudao.framework.pay.config.PayProperties; | 27 | import cn.iocoder.yudao.framework.pay.config.PayProperties; |
| 27 | import cn.iocoder.yudao.framework.pay.core.client.PayClient; | 28 | import cn.iocoder.yudao.framework.pay.core.client.PayClient; |
| 28 | import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; | 29 | import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; |
| 30 | +import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO; | ||
| 29 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; | 31 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; |
| 30 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; | 32 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; |
| 31 | import lombok.extern.slf4j.Slf4j; | 33 | import lombok.extern.slf4j.Slf4j; |
| @@ -135,9 +137,11 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { | @@ -135,9 +137,11 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { | ||
| 135 | // 调用三方接口 | 137 | // 调用三方接口 |
| 136 | PayOrderUnifiedReqDTO unifiedOrderReqDTO = PayOrderCoreConvert.INSTANCE.convert2(reqDTO); | 138 | PayOrderUnifiedReqDTO unifiedOrderReqDTO = PayOrderCoreConvert.INSTANCE.convert2(reqDTO); |
| 137 | // 商户相关字段 | 139 | // 商户相关字段 |
| 140 | + //TODO jason @芋艿 是否加一个属性 如tradeNo 支付订单号, 用这个merchantOrderId让人迷糊 | ||
| 138 | unifiedOrderReqDTO.setMerchantOrderId(orderExtension.getNo()) // 注意,此处使用的是 PayOrderExtensionDO.no 属性! | 141 | unifiedOrderReqDTO.setMerchantOrderId(orderExtension.getNo()) // 注意,此处使用的是 PayOrderExtensionDO.no 属性! |
| 139 | .setSubject(order.getSubject()).setBody(order.getBody()) | 142 | .setSubject(order.getSubject()).setBody(order.getBody()) |
| 140 | - .setNotifyUrl(genChannelPayNotifyUrl(channel)); | 143 | + .setNotifyUrl(genChannelPayNotifyUrl(channel)) |
| 144 | + .setReturnUrl(genChannelReturnUrl(channel)); | ||
| 141 | // 订单相关字段 | 145 | // 订单相关字段 |
| 142 | unifiedOrderReqDTO.setAmount(order.getAmount()).setExpireTime(order.getExpireTime()); | 146 | unifiedOrderReqDTO.setAmount(order.getAmount()).setExpireTime(order.getExpireTime()); |
| 143 | CommonResult<?> unifiedOrderResult = client.unifiedOrder(unifiedOrderReqDTO); | 147 | CommonResult<?> unifiedOrderResult = client.unifiedOrder(unifiedOrderReqDTO); |
| @@ -150,6 +154,16 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { | @@ -150,6 +154,16 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { | ||
| 150 | } | 154 | } |
| 151 | 155 | ||
| 152 | /** | 156 | /** |
| 157 | + * 根据支付渠道的编码,生成支付渠道的返回地址 | ||
| 158 | + * @param channel | ||
| 159 | + * @return | ||
| 160 | + */ | ||
| 161 | + private String genChannelReturnUrl(PayChannelDO channel) { | ||
| 162 | + return payProperties.getReturnUrl() + "/" + StrUtil.replace(channel.getCode(), "_", "-") | ||
| 163 | + + "/" + channel.getId(); | ||
| 164 | + } | ||
| 165 | + | ||
| 166 | + /** | ||
| 153 | * 根据支付渠道的编码,生成支付渠道的回调地址 | 167 | * 根据支付渠道的编码,生成支付渠道的回调地址 |
| 154 | * | 168 | * |
| 155 | * @param channel 支付渠道 | 169 | * @param channel 支付渠道 |
| @@ -181,9 +195,9 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { | @@ -181,9 +195,9 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { | ||
| 181 | 195 | ||
| 182 | @Override | 196 | @Override |
| 183 | @Transactional | 197 | @Transactional |
| 184 | - public void notifyPayOrder(Long channelId, String channelCode, String notifyData) throws Exception { | 198 | + public void notifyPayOrder(Long channelId, String channelCode, NotifyDataDTO notifyData) throws Exception { |
| 185 | // TODO 芋艿,记录回调日志 | 199 | // TODO 芋艿,记录回调日志 |
| 186 | - log.info("[notifyPayOrder][channelId({}) 回调数据({})]", channelId, notifyData); | 200 | + log.info("[notifyPayOrder][channelId({}) 回调数据({})]", channelId, notifyData.getOrigData()); |
| 187 | 201 | ||
| 188 | // 校验支付渠道是否有效 | 202 | // 校验支付渠道是否有效 |
| 189 | PayChannelDO channel = payChannelCoreService.validPayChannel(channelId); | 203 | PayChannelDO channel = payChannelCoreService.validPayChannel(channelId); |
| @@ -193,6 +207,7 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { | @@ -193,6 +207,7 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { | ||
| 193 | log.error("[notifyPayOrder][渠道编号({}) 找不到对应的支付客户端]", channel.getId()); | 207 | log.error("[notifyPayOrder][渠道编号({}) 找不到对应的支付客户端]", channel.getId()); |
| 194 | throw exception(PAY_CHANNEL_CLIENT_NOT_FOUND); | 208 | throw exception(PAY_CHANNEL_CLIENT_NOT_FOUND); |
| 195 | } | 209 | } |
| 210 | + //TODO @jason 校验 是否支付宝调用。 使用 支付宝publickey 或者payclient 加一个校验方法 | ||
| 196 | // 解析支付结果 | 211 | // 解析支付结果 |
| 197 | PayOrderNotifyRespDTO notifyRespDTO = client.parseOrderNotify(notifyData); | 212 | PayOrderNotifyRespDTO notifyRespDTO = client.parseOrderNotify(notifyData); |
| 198 | 213 | ||
| @@ -207,9 +222,10 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { | @@ -207,9 +222,10 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { | ||
| 207 | throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING); | 222 | throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING); |
| 208 | } | 223 | } |
| 209 | // 1.2 更新 PayOrderExtensionDO | 224 | // 1.2 更新 PayOrderExtensionDO |
| 225 | + //TODO @jason notifyRespDTO.getTradeStatus() 需要根据不同的状态更新成不同的值 PayOrderStatusEnum | ||
| 210 | int updateCounts = payOrderExtensionCoreMapper.updateByIdAndStatus(orderExtension.getId(), | 226 | int updateCounts = payOrderExtensionCoreMapper.updateByIdAndStatus(orderExtension.getId(), |
| 211 | PayOrderStatusEnum.WAITING.getStatus(), PayOrderExtensionDO.builder().id(orderExtension.getId()) | 227 | PayOrderStatusEnum.WAITING.getStatus(), PayOrderExtensionDO.builder().id(orderExtension.getId()) |
| 212 | - .status(PayOrderStatusEnum.SUCCESS.getStatus()).channelNotifyData(notifyData).build()); | 228 | + .status(PayOrderStatusEnum.SUCCESS.getStatus()).channelNotifyData(notifyData.getOrigData()).build()); |
| 213 | if (updateCounts == 0) { // 校验状态,必须是待支付 | 229 | if (updateCounts == 0) { // 校验状态,必须是待支付 |
| 214 | throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING); | 230 | throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING); |
| 215 | } | 231 | } |
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/config/PayProperties.java
| @@ -6,8 +6,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties; | @@ -6,8 +6,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties; | ||
| 6 | import org.springframework.validation.annotation.Validated; | 6 | import org.springframework.validation.annotation.Validated; |
| 7 | 7 | ||
| 8 | import javax.validation.constraints.NotEmpty; | 8 | import javax.validation.constraints.NotEmpty; |
| 9 | -import javax.validation.constraints.NotNull; | ||
| 10 | -import java.time.Duration; | ||
| 11 | 9 | ||
| 12 | @ConfigurationProperties(prefix = "yudao.pay") | 10 | @ConfigurationProperties(prefix = "yudao.pay") |
| 13 | @Validated | 11 | @Validated |
| @@ -25,8 +23,15 @@ public class PayProperties { | @@ -25,8 +23,15 @@ public class PayProperties { | ||
| 25 | * 退款回调地址 | 23 | * 退款回调地址 |
| 26 | * 注意点,同 {@link #payNotifyUrl} 属性 | 24 | * 注意点,同 {@link #payNotifyUrl} 属性 |
| 27 | */ | 25 | */ |
| 28 | - @NotNull(message = "短信发送频率不能为空") | 26 | + @NotEmpty(message = "短信发送频率不能为空") |
| 29 | @URL(message = "退款回调地址的格式必须是 URL") | 27 | @URL(message = "退款回调地址的格式必须是 URL") |
| 30 | private String refundNotifyUrl; | 28 | private String refundNotifyUrl; |
| 31 | 29 | ||
| 30 | + // TODO @jason:改成 payReturnUrl 。另外,可以加个 @NotEmpty,避免未填写 | ||
| 31 | + /** | ||
| 32 | + * 支付完成的返回地址 | ||
| 33 | + */ | ||
| 34 | + @URL(message = "支付返回的地址的格式必须是 URL") | ||
| 35 | + private String returnUrl; | ||
| 36 | + | ||
| 32 | } | 37 | } |
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/PayClient.java
| 1 | package cn.iocoder.yudao.framework.pay.core.client; | 1 | package cn.iocoder.yudao.framework.pay.core.client; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO; | ||
| 3 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; | 4 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; |
| 4 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; | 5 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; |
| 5 | 6 | ||
| @@ -32,6 +33,6 @@ public interface PayClient { | @@ -32,6 +33,6 @@ public interface PayClient { | ||
| 32 | * @return 解析结果 | 33 | * @return 解析结果 |
| 33 | * @throws Exception 解析失败,抛出异常 | 34 | * @throws Exception 解析失败,抛出异常 |
| 34 | */ | 35 | */ |
| 35 | - PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception; | 36 | + PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception; |
| 36 | 37 | ||
| 37 | } | 38 | } |
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/NotifyDataDTO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.framework.pay.core.client.dto; | ||
| 2 | + | ||
| 3 | +import lombok.Builder; | ||
| 4 | +import lombok.Data; | ||
| 5 | +import lombok.ToString; | ||
| 6 | + | ||
| 7 | +import java.util.Map; | ||
| 8 | + | ||
| 9 | +// TODO @jason:NotifyDataDTO=》PayNotifyDataDTO。另外注释记得加起来哈 | ||
| 10 | +@Data | ||
| 11 | +@ToString | ||
| 12 | +@Builder | ||
| 13 | +public class NotifyDataDTO { | ||
| 14 | + | ||
| 15 | + // TODO @jason:这个字段,改成 body | ||
| 16 | + private String origData; | ||
| 17 | + // TODO @jason:这个字段如果暂时没用,可以去掉。 | ||
| 18 | + //1:xml 2:form | ||
| 19 | + private int format; | ||
| 20 | + | ||
| 21 | + //form 格式的 data; | ||
| 22 | + private Map<String,String> params; | ||
| 23 | +} |
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/PayOrderNotifyRespDTO.java
| @@ -42,4 +42,14 @@ public class PayOrderNotifyRespDTO { | @@ -42,4 +42,14 @@ public class PayOrderNotifyRespDTO { | ||
| 42 | */ | 42 | */ |
| 43 | private String data; | 43 | private String data; |
| 44 | 44 | ||
| 45 | + | ||
| 46 | + /** | ||
| 47 | + * TODO @jason 结合其他的渠道定义成枚举, | ||
| 48 | + * alipay | ||
| 49 | + * TRADE_CLOSED,未付款交易超时关闭,或支付完成后全额退款。 | ||
| 50 | + * TRADE_SUCCESS, 交易支付成功 | ||
| 51 | + * TRADE_FINISHED 交易结束,不可退款。 | ||
| 52 | + */ | ||
| 53 | + private String tradeStatus; | ||
| 54 | + | ||
| 45 | } | 55 | } |
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/PayOrderUnifiedReqDTO.java
| @@ -44,11 +44,16 @@ public class PayOrderUnifiedReqDTO { | @@ -44,11 +44,16 @@ public class PayOrderUnifiedReqDTO { | ||
| 44 | @Length(max = 128, message = "商品描述信息长度不能超过128") | 44 | @Length(max = 128, message = "商品描述信息长度不能超过128") |
| 45 | private String body; | 45 | private String body; |
| 46 | /** | 46 | /** |
| 47 | - * 支付结果的回调地址 | 47 | + * 支付结果的 notify 回调地址 |
| 48 | */ | 48 | */ |
| 49 | @NotEmpty(message = "支付结果的回调地址不能为空") | 49 | @NotEmpty(message = "支付结果的回调地址不能为空") |
| 50 | - @URL(message = "支付结果的回调地址必须是 URL 格式") | 50 | + @URL(message = "支付结果的 notify 回调地址必须是 URL 格式") |
| 51 | private String notifyUrl; | 51 | private String notifyUrl; |
| 52 | + /** | ||
| 53 | + * 支付结果的 return 回调地址 | ||
| 54 | + */ | ||
| 55 | + @URL(message = "支付结果的 return 回调地址必须是 URL 格式") | ||
| 56 | + private String returnUrl; | ||
| 52 | 57 | ||
| 53 | // ========== 订单相关字段 ========== | 58 | // ========== 订单相关字段 ========== |
| 54 | 59 |
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayPayCodeMapping.java
| @@ -18,6 +18,10 @@ public class AlipayPayCodeMapping extends AbstractPayCodeMapping { | @@ -18,6 +18,10 @@ public class AlipayPayCodeMapping extends AbstractPayCodeMapping { | ||
| 18 | if (Objects.equals(apiCode, "10000")) { | 18 | if (Objects.equals(apiCode, "10000")) { |
| 19 | return GlobalErrorCodeConstants.SUCCESS; | 19 | return GlobalErrorCodeConstants.SUCCESS; |
| 20 | } | 20 | } |
| 21 | + // alipay wap api code 返回为null, 暂时定为-9999 | ||
| 22 | + if(Objects.equals(apiCode, "-9999")){ // TODO @jason:空格要注意哈。if () { | ||
| 23 | + return GlobalErrorCodeConstants.SUCCESS; | ||
| 24 | + } | ||
| 21 | return null; | 25 | return null; |
| 22 | } | 26 | } |
| 23 | 27 |
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java
| @@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.alipay; | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.alipay; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.bean.BeanUtil; | 3 | import cn.hutool.core.bean.BeanUtil; |
| 4 | import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; | 4 | import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; |
| 5 | +import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO; | ||
| 5 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; | 6 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; |
| 6 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; | 7 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; |
| 7 | import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; | 8 | import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; |
| @@ -68,7 +69,7 @@ public class AlipayQrPayClient extends AbstractPayClient<AlipayPayClientConfig> | @@ -68,7 +69,7 @@ public class AlipayQrPayClient extends AbstractPayClient<AlipayPayClientConfig> | ||
| 68 | } | 69 | } |
| 69 | 70 | ||
| 70 | @Override | 71 | @Override |
| 71 | - public PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception { | 72 | + public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception { |
| 72 | // TODO 芋艿:待完成 | 73 | // TODO 芋艿:待完成 |
| 73 | return null; | 74 | return null; |
| 74 | } | 75 | } |
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java
| 1 | package cn.iocoder.yudao.framework.pay.core.client.impl.alipay; | 1 | package cn.iocoder.yudao.framework.pay.core.client.impl.alipay; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.bean.BeanUtil; | 3 | import cn.hutool.core.bean.BeanUtil; |
| 4 | +import cn.hutool.core.date.DateUtil; | ||
| 4 | import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; | 5 | import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; |
| 6 | +import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO; | ||
| 5 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; | 7 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; |
| 6 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; | 8 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; |
| 7 | import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; | 9 | import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; |
| @@ -14,6 +16,9 @@ import com.alipay.api.request.AlipayTradeWapPayRequest; | @@ -14,6 +16,9 @@ import com.alipay.api.request.AlipayTradeWapPayRequest; | ||
| 14 | import com.alipay.api.response.AlipayTradeWapPayResponse; | 16 | import com.alipay.api.response.AlipayTradeWapPayResponse; |
| 15 | import lombok.SneakyThrows; | 17 | import lombok.SneakyThrows; |
| 16 | 18 | ||
| 19 | +import java.util.Map; | ||
| 20 | +import java.util.Objects; | ||
| 21 | + | ||
| 17 | /** | 22 | /** |
| 18 | * 支付宝【手机网站】的 PayClient 实现类 | 23 | * 支付宝【手机网站】的 PayClient 实现类 |
| 19 | * 文档:https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay | 24 | * 文档:https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay |
| @@ -45,12 +50,16 @@ public class AlipayWapPayClient extends AbstractPayClient<AlipayPayClientConfig> | @@ -45,12 +50,16 @@ public class AlipayWapPayClient extends AbstractPayClient<AlipayPayClientConfig> | ||
| 45 | model.setBody(reqDTO.getBody()); | 50 | model.setBody(reqDTO.getBody()); |
| 46 | model.setTotalAmount(calculateAmount(reqDTO.getAmount()).toString()); | 51 | model.setTotalAmount(calculateAmount(reqDTO.getAmount()).toString()); |
| 47 | model.setProductCode("QUICK_WAP_PAY"); // TODO 芋艿:这里咋整 | 52 | model.setProductCode("QUICK_WAP_PAY"); // TODO 芋艿:这里咋整 |
| 48 | - model.setSellerId("2088102147948060"); // TODO 芋艿:这里咋整 | ||
| 49 | - // TODO 芋艿:userIp + expireTime | 53 | + //TODO 芋艿:这里咋整 jason @芋艿 可以去掉吧, |
| 54 | + // TODO @jason: 这个支付方式,需要有 sellerId 么? | ||
| 55 | + //model.setSellerId("2088102147948060"); | ||
| 56 | + model.setTimeExpire(DateUtil.format(reqDTO.getExpireTime(),"yyyy-MM-dd HH:mm:ss")); | ||
| 57 | + // TODO 芋艿:userIp | ||
| 50 | // 构建 AlipayTradeWapPayRequest | 58 | // 构建 AlipayTradeWapPayRequest |
| 51 | AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest(); | 59 | AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest(); |
| 52 | request.setBizModel(model); | 60 | request.setBizModel(model); |
| 53 | - | 61 | + request.setNotifyUrl(reqDTO.getNotifyUrl()); |
| 62 | + request.setReturnUrl(reqDTO.getReturnUrl()); | ||
| 54 | // 执行请求 | 63 | // 执行请求 |
| 55 | AlipayTradeWapPayResponse response; | 64 | AlipayTradeWapPayResponse response; |
| 56 | try { | 65 | try { |
| @@ -58,13 +67,31 @@ public class AlipayWapPayClient extends AbstractPayClient<AlipayPayClientConfig> | @@ -58,13 +67,31 @@ public class AlipayWapPayClient extends AbstractPayClient<AlipayPayClientConfig> | ||
| 58 | } catch (AlipayApiException e) { | 67 | } catch (AlipayApiException e) { |
| 59 | return PayCommonResult.build(e.getErrCode(), e.getErrMsg(), null, codeMapping); | 68 | return PayCommonResult.build(e.getErrCode(), e.getErrMsg(), null, codeMapping); |
| 60 | } | 69 | } |
| 61 | -// TODO 芋艿:sub Code | ||
| 62 | - return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping); | 70 | + |
| 71 | + // TODO 芋艿:sub Code | ||
| 72 | + if(response.isSuccess() && Objects.isNull(response.getCode()) && Objects.nonNull(response.getBody())){ | ||
| 73 | + //成功alipay wap 成功 code 为 null , body 为form 表单 | ||
| 74 | + return PayCommonResult.build("-9999", "Success", response, codeMapping); | ||
| 75 | + }else { | ||
| 76 | + return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping); | ||
| 77 | + } | ||
| 63 | } | 78 | } |
| 64 | 79 | ||
| 80 | + // TODO @jason: 注释记得补下哈 | ||
| 81 | + /** | ||
| 82 | + * //https://opendocs.alipay.com/open/203/105286 | ||
| 83 | + * @param data 通知结果 | ||
| 84 | + * @return | ||
| 85 | + * @throws Exception | ||
| 86 | + */ | ||
| 65 | @Override | 87 | @Override |
| 66 | - public PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception { | ||
| 67 | - // TODO 芋艿:待完成 | ||
| 68 | - return null; | 88 | + public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception { |
| 89 | + Map<String, String> params = data.getParams(); | ||
| 90 | + return PayOrderNotifyRespDTO.builder().orderExtensionNo(params.get("out_trade_no")) | ||
| 91 | + .channelOrderNo(params.get("trade_no")).channelUserId(params.get("seller_id")) | ||
| 92 | + .tradeStatus(params.get("trade_status")) | ||
| 93 | + .successTime(DateUtil.parse(params.get("notify_time"), "yyyy-MM-dd HH:mm:ss")) | ||
| 94 | + .data(data.getOrigData()).build(); | ||
| 69 | } | 95 | } |
| 96 | + | ||
| 70 | } | 97 | } |
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/wx/WXPubPayClient.java
| @@ -8,6 +8,7 @@ import cn.hutool.core.util.StrUtil; | @@ -8,6 +8,7 @@ import cn.hutool.core.util.StrUtil; | ||
| 8 | import cn.iocoder.yudao.framework.common.util.io.FileUtils; | 8 | import cn.iocoder.yudao.framework.common.util.io.FileUtils; |
| 9 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | 9 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; |
| 10 | import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; | 10 | import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; |
| 11 | +import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO; | ||
| 11 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; | 12 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; |
| 12 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; | 13 | import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; |
| 13 | import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; | 14 | import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; |
| @@ -131,14 +132,14 @@ public class WXPubPayClient extends AbstractPayClient<WXPayClientConfig> { | @@ -131,14 +132,14 @@ public class WXPubPayClient extends AbstractPayClient<WXPayClientConfig> { | ||
| 131 | } | 132 | } |
| 132 | 133 | ||
| 133 | @Override | 134 | @Override |
| 134 | - public PayOrderNotifyRespDTO parseOrderNotify(String data) throws WxPayException { | ||
| 135 | - WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data); | 135 | + public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws WxPayException { |
| 136 | + WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data.getOrigData()); | ||
| 136 | Assert.isTrue(Objects.equals(notifyResult.getResultCode(), "SUCCESS"), "支付结果非 SUCCESS"); | 137 | Assert.isTrue(Objects.equals(notifyResult.getResultCode(), "SUCCESS"), "支付结果非 SUCCESS"); |
| 137 | // 转换结果 | 138 | // 转换结果 |
| 138 | return PayOrderNotifyRespDTO.builder().orderExtensionNo(notifyResult.getOutTradeNo()) | 139 | return PayOrderNotifyRespDTO.builder().orderExtensionNo(notifyResult.getOutTradeNo()) |
| 139 | .channelOrderNo(notifyResult.getTransactionId()).channelUserId(notifyResult.getOpenid()) | 140 | .channelOrderNo(notifyResult.getTransactionId()).channelUserId(notifyResult.getOpenid()) |
| 140 | .successTime(DateUtil.parse(notifyResult.getTimeEnd(), "yyyyMMddHHmmss")) | 141 | .successTime(DateUtil.parse(notifyResult.getTimeEnd(), "yyyyMMddHHmmss")) |
| 141 | - .data(data).build(); | 142 | + .data(data.getOrigData()).build(); |
| 142 | } | 143 | } |
| 143 | 144 | ||
| 144 | } | 145 | } |
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/PayOrderController.java
| @@ -6,17 +6,21 @@ import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayOrderCoreServic | @@ -6,17 +6,21 @@ import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayOrderCoreServic | ||
| 6 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO; | 6 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO; |
| 7 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO; | 7 | import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO; |
| 8 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 8 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 9 | +import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO; | ||
| 9 | import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; | 10 | import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; |
| 10 | import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitReqVO; | 11 | import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitReqVO; |
| 11 | import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitRespVO; | 12 | import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitRespVO; |
| 12 | import io.swagger.annotations.Api; | 13 | import io.swagger.annotations.Api; |
| 13 | import io.swagger.annotations.ApiOperation; | 14 | import io.swagger.annotations.ApiOperation; |
| 14 | import lombok.extern.slf4j.Slf4j; | 15 | import lombok.extern.slf4j.Slf4j; |
| 16 | +import org.springframework.http.MediaType; | ||
| 15 | import org.springframework.validation.annotation.Validated; | 17 | import org.springframework.validation.annotation.Validated; |
| 16 | import org.springframework.web.bind.annotation.*; | 18 | import org.springframework.web.bind.annotation.*; |
| 17 | 19 | ||
| 18 | import javax.annotation.Resource; | 20 | import javax.annotation.Resource; |
| 19 | 21 | ||
| 22 | +import java.util.Map; | ||
| 23 | + | ||
| 20 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 24 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 21 | import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; | 25 | import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; |
| 22 | 26 | ||
| @@ -54,7 +58,7 @@ public class PayOrderController { | @@ -54,7 +58,7 @@ public class PayOrderController { | ||
| 54 | @ApiOperation("通知微信公众号支付的结果") | 58 | @ApiOperation("通知微信公众号支付的结果") |
| 55 | public String notifyWxPayOrder(@PathVariable("channelId") Long channelId, | 59 | public String notifyWxPayOrder(@PathVariable("channelId") Long channelId, |
| 56 | @RequestBody String xmlData) throws Exception { | 60 | @RequestBody String xmlData) throws Exception { |
| 57 | - payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.WX_PUB.getCode(), xmlData); | 61 | + payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.WX_PUB.getCode(), NotifyDataDTO.builder().origData(xmlData).build()); |
| 58 | return "success"; | 62 | return "success"; |
| 59 | } | 63 | } |
| 60 | 64 | ||
| @@ -72,4 +76,28 @@ public class PayOrderController { | @@ -72,4 +76,28 @@ public class PayOrderController { | ||
| 72 | return "success"; | 76 | return "success"; |
| 73 | } | 77 | } |
| 74 | 78 | ||
| 79 | + @PostMapping(value = "/notify/alipay-wap/{channelId}", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) | ||
| 80 | + @ApiOperation("支付宝wap页面回调") | ||
| 81 | + public String notifyAliPayWapPayOrder(@PathVariable("channelId") Long channelId, | ||
| 82 | + @RequestParam Map<String, String> params, | ||
| 83 | + @RequestBody String originData) throws Exception { | ||
| 84 | + //TODO @jason 校验 是否支付宝调用。 使用 支付宝publickey payclient 或许加一个校验方法 | ||
| 85 | + payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.ALIPAY_WAP.getCode(), NotifyDataDTO.builder().params(params).origData(originData).build()); | ||
| 86 | + return "success"; | ||
| 87 | + } | ||
| 88 | + | ||
| 89 | + // TODO @jason 如果有些字段不注释,可以删除哈。不然 IDEA 会报警 | ||
| 90 | + /** | ||
| 91 | + * https://opendocs.alipay.com/open/203/105285#%E5%89%8D%E5%8F%B0%E5%9B%9E%E8%B7%B3%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E | ||
| 92 | + * @param channelId | ||
| 93 | + * @return | ||
| 94 | + * @throws Exception | ||
| 95 | + */ | ||
| 96 | + @GetMapping(value = "/return/alipay-wap/{channelId}") | ||
| 97 | + @ApiOperation("支付宝wap页面回跳") | ||
| 98 | + public String returnAliPayWapPayOrder(@PathVariable("channelId") Long channelId){ | ||
| 99 | + //TODO @jason 校验 是否支付宝调用。 支付宝publickey 可以根据 appId 跳转不同的页面 | ||
| 100 | + return "支付成功"; | ||
| 101 | + } | ||
| 102 | + | ||
| 75 | } | 103 | } |
yudao-user-server/src/main/resources/application-local.yaml
| @@ -153,5 +153,6 @@ yudao: | @@ -153,5 +153,6 @@ yudao: | ||
| 153 | - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 | 153 | - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 |
| 154 | demo: false # 关闭演示模式 | 154 | demo: false # 关闭演示模式 |
| 155 | pay: | 155 | pay: |
| 156 | - pay-notify-url: http://niubi.natapp1.cc/api/pay/order/notify | ||
| 157 | - refund-notify-url: http://niubi.natapp1.cc/api/pay/refund/notify | 156 | + pay-notify-url: http://jg6rde.natappfree.cc/api/pay/order/notify |
| 157 | + refund-notify-url: http://jg6rde.natappfree.cc/api/pay/refund/notify | ||
| 158 | + return-url: http://jg6rde.natappfree.cc/api/pay/order/return |
yudao-user-server/src/main/resources/static/pay_alipay_wap.html
0 → 100644
| 1 | +<!DOCTYPE html> | ||
| 2 | +<html> | ||
| 3 | +<head> | ||
| 4 | + <meta charset="UTF-8"> | ||
| 5 | + <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/> | ||
| 6 | + <title>支付测试页</title> | ||
| 7 | + <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script> | ||
| 8 | +</head> | ||
| 9 | +<body> | ||
| 10 | +<div>点击如下按钮,发起支付的测试</div> | ||
| 11 | +<div> | ||
| 12 | + <button id="alipay_wap">支付宝h5</button> | ||
| 13 | +</div> | ||
| 14 | +<div id="dynamic_form"></div> | ||
| 15 | +</body> | ||
| 16 | +<script> | ||
| 17 | + // TODO @jason:copy 过来后,有些注释要改过来哈 | ||
| 18 | + let shopOrderId = undefined; | ||
| 19 | + let payOrderId = undefined; | ||
| 20 | + let server = 'http://127.0.0.1:28080'; | ||
| 21 | + //let server = 'http://niubi.natapp1.cc'; | ||
| 22 | + // TODO openid | ||
| 23 | + //let openid = "ockUAwIZ-0OeMZl9ogcZ4ILrGba0"; | ||
| 24 | + $(function() { | ||
| 25 | + // 自动发起商城订单编号 | ||
| 26 | + $.ajax({ | ||
| 27 | + url: server + "/api/shop/order/create", | ||
| 28 | + method: 'POST', | ||
| 29 | + success: function( result ) { | ||
| 30 | + if (result.code !== 0) { | ||
| 31 | + alert('创建商城订单失败,原因:' + result.msg) | ||
| 32 | + return; | ||
| 33 | + } | ||
| 34 | + shopOrderId = result.data.id; | ||
| 35 | + payOrderId = result.data.payOrderId; | ||
| 36 | + console.log("商城订单:" + shopOrderId) | ||
| 37 | + console.log("支付订单:" + payOrderId) | ||
| 38 | + } | ||
| 39 | + }) | ||
| 40 | + }); | ||
| 41 | + // 微信公众号 | ||
| 42 | + $( "#alipay_wap").on( "click", function() { | ||
| 43 | + // 提交支付 | ||
| 44 | + $.ajax({ | ||
| 45 | + url: server + "/api/pay/order/submit", | ||
| 46 | + method: 'POST', | ||
| 47 | + dataType: "json", | ||
| 48 | + contentType: "application/json", | ||
| 49 | + data: JSON.stringify({ | ||
| 50 | + "id": payOrderId, | ||
| 51 | + "channelCode": 'alipay_wap' | ||
| 52 | + }), | ||
| 53 | + success: function( result ) { | ||
| 54 | + if (result.code !== 0) { | ||
| 55 | + alert('提交支付订单失败,原因:' + result.msg) | ||
| 56 | + return; | ||
| 57 | + } | ||
| 58 | + alert('点击确定,开始支付'); | ||
| 59 | + // 开始调用微信支付 | ||
| 60 | + let data = result.data.invokeResponse; | ||
| 61 | + $("#dynamic_form").html(data.body); | ||
| 62 | + } | ||
| 63 | + }) | ||
| 64 | + }); | ||
| 65 | +</script> | ||
| 66 | +</html> |
yudao-user-server/src/main/resources/static/pay.html renamed to yudao-user-server/src/main/resources/static/pay_wx_pub.html