Commit 1ab773c2 by 郑建康(PHP)

增加慧收钱支付通道、宝付代付通道

1 parent f29dba34
Showing with 3081 additions and 17 deletions
......@@ -7,4 +7,4 @@
/examples_bak/
/composer.lock
/examples/wxconfig-bak.php
/examples/wx/pem/
/examples/wx/pem/
\ No newline at end of file
File mode changed
......@@ -19,7 +19,7 @@ vusbRwH3/38ET7udBdVdE6poga1Z0al+0njMwVypnNwy+eLWhkhrWmpLh3OjfQJAI3BV8JS6xzKh
DNo+tkHVXLY9H2kdWFoYTvuLexHAgrsnHxONOlSA5hcVLd1B3p9utOt3QeDf6x2i1lqhTH2w8gzj
vsnx13tWqg==
-----END RSA PRIVATE KEY-----', //RSA私钥
'notify_url' => '', //通知地址
'notify_url' => 'www.test.com', //通知地址
'use_sandbox' => false,
'return_raw' => false
];
......
......@@ -15,7 +15,7 @@ $callback = new TestNotify();
$_POST['req'] = '%3C%3Fxml+version%3D%221.0%22+encoding%3D%22GBK%22+standalone%3D%22yes%22%3F%3E%3Cxml%3E%3Ccurr_type%3ECNY%3C%2Fcurr_type%3E%3Cins_cd%3E08A9999999%3C%2Fins_cd%3E%3Cmchnt_cd%3E0002900F0370542%3C%2Fmchnt_cd%3E%3Cmchnt_order_no%3E2019062017530653068450564957%3C%2Fmchnt_order_no%3E%3Corder_amt%3E1%3C%2Forder_amt%3E%3Corder_type%3EWECHAT%3C%2Forder_type%3E%3Crandom_str%3ELBY9GBWNNFV2RSTJX9PK549HGZK9J5U7%3C%2Frandom_str%3E%3Creserved_addn_inf%3E10054c238f670a2e9649a8b100f20562%3C%2Freserved_addn_inf%3E%3Creserved_bank_type%3ECFT%3C%2Freserved_bank_type%3E%3Creserved_buyer_logon_id%3E%3C%2Freserved_buyer_logon_id%3E%3Creserved_channel_order_id%3E2019062017530653068450564957%3C%2Freserved_channel_order_id%3E%3Creserved_coupon_fee%3E0%3C%2Freserved_coupon_fee%3E%3Creserved_fund_bill_list%3E%3C%2Freserved_fund_bill_list%3E%3Creserved_fy_settle_dt%3E20190620%3C%2Freserved_fy_settle_dt%3E%3Creserved_fy_trace_no%3E060001686318%3C%2Freserved_fy_trace_no%3E%3Creserved_is_credit%3E0%3C%2Freserved_is_credit%3E%3Creserved_settlement_amt%3E1%3C%2Freserved_settlement_amt%3E%3Cresult_code%3E000000%3C%2Fresult_code%3E%3Cresult_msg%3ESUCCESS%3C%2Fresult_msg%3E%3Csettle_order_amt%3E1%3C%2Fsettle_order_amt%3E%3Csign%3E2lvzV829wI5miCS%2FYPkdhcPMmwwd5Z3en%2BNeXfwgEqvqXNXbUeMipHM9JeNZX1l3zuCnSgEyyQWcijeyzPSOC5UiOoxSGOwx1tsQPF9rDUFu25ApVz%2B7hT6rn5R3bc9zK0phgYjdkkKF64%2BCrWsI4gEnJHIyo568FgDqyVziXhA%3D%3C%2Fsign%3E%3Cterm_id%3E%3C%2Fterm_id%3E%3Ctransaction_id%3E4200000334201906209673443163%3C%2Ftransaction_id%3E%3Ctxn_fin_ts%3E20190620175355%3C%2Ftxn_fin_ts%3E%3Cuser_id%3EoUpF8uBpoepFxyJcDAonTatbs8Zc%3C%2Fuser_id%3E%3C%2Fxml%3E';
try {
$ret = Notify::run($channel, $config, $callback);
var_dump($ret);
// var_dump($ret);
} catch (PayException $e) {
echo $e->errorMessage();
exit;
......
No preview for this file type
-----BEGIN CERTIFICATE-----
MIIDFjCCAn+gAwIBAgIJAKIW6tKw+5gIMA0GCSqGSIb3DQEBBQUAMGYxDzANBgNV
BAMTBlJvb3RDQTEPMA0GA1UECxMGQmFvZm9vMQ8wDQYDVQQKEwZCYW9mb28xETAP
BgNVBAcTCFNoYW5naGFpMREwDwYDVQQIEwhTaGFuZ2hhaTELMAkGA1UEBhMCQ04w
HhcNMTQxMjIyMTAxMTE0WhcNMjQxMjE5MTAxMTE0WjBmMQ8wDQYDVQQDEwZSb290
Q0ExDzANBgNVBAsTBkJhb2ZvbzEPMA0GA1UEChMGQmFvZm9vMREwDwYDVQQHEwhT
aGFuZ2hhaTERMA8GA1UECBMIU2hhbmdoYWkxCzAJBgNVBAYTAkNOMIGfMA0GCSqG
SIb3DQEBAQUAA4GNADCBiQKBgQCpBL+SzNNpeJVAhP8XO91dPrQHf6w2k7aqwnWG
jnYjRlmy7iaeUJT/wb3PoH+ioGNTJyPHvfYHalEmvi133K3N8NdHizaYTjm1hgNB
hBIK8aPZCR76C3UtQPv4mqA5fTZEWnRbr8JrVJoFNEN2+4JQwCeDtaC3OzPPflET
t6zdOQIDAQABo4HLMIHIMB0GA1UdDgQWBBSjwZD5kVF2fblxVW68Z2iWSvakoDCB
mAYDVR0jBIGQMIGNgBSjwZD5kVF2fblxVW68Z2iWSvakoKFqpGgwZjEPMA0GA1UE
AxMGUm9vdENBMQ8wDQYDVQQLEwZCYW9mb28xDzANBgNVBAoTBkJhb2ZvbzERMA8G
A1UEBxMIU2hhbmdoYWkxETAPBgNVBAgTCFNoYW5naGFpMQswCQYDVQQGEwJDToIJ
AKIW6tKw+5gIMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAcg56wgbV
yZjb1mD3NZH3PIdodOA4CP5XC/fWQqJMSFB9ngvR/hH058E2+QiWHhN5HkQgmeOR
xkuiDTVKosyylEYVsyFNaKKASufKH2eVXc4fUj/vd660ictNbbwTYuV4m7r5ZI8O
4avXIZc6APJTqHAXYK84LzvSaQtXbPhJA0E=
-----END CERTIFICATE-----
No preview for this file type
-----BEGIN CERTIFICATE-----
MIIDgDCCAmigAwIBAgIFEFmDdYIwDQYJKoZIhvcNAQEFBQAwITELMAkGA1UEBhMC
Q04xEjAQBgNVBAoTCUNGQ0EgT0NBMTAeFw0xNjEwMjQwNzIzMjRaFw0yMTEwMjQw
NzIzMjRaMHExCzAJBgNVBAYTAkNOMRIwEAYDVQQKEwlDRkNBIE9DQTExDzANBgNV
BAsTBkJhb2ZvbzEZMBcGA1UECxMQT3JnYW5pemF0aW9uYWwtMTEiMCAGA1UEAwwZ
QmFvZm9vQOWuneS7mEBaNjg4MTk5OTlAMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
gYkCgYEA30bgCAY6agzuJccSKfLe/2NeOeUm2GZFuajai6CB9E0SOg6QymWuGw/f
XyL6rcZd/eavew1Ec2EDTeq4DgVudah6HZbI3EXt2TSxLpn6AwDMwKgSGhWpxR2V
1HnEiIyTOCjdWe5gUJl62UnE5acErjO0G9w+o+qGy13r0/ZZ6h0CAwEAAaOB8jCB
7zAfBgNVHSMEGDAWgBTR2+mIguXdGo9MqgCMvnzyqxv22TBIBgNVHSAEQTA/MD0G
CGCBHIbvKgEBMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24v
dXMvdXMtMTQuaHRtMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly9jcmwuY2ZjYS5j
b20uY24vUlNBL2NybDQ0MDEuY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQURqt0
qRdCkRebpuVAmkiDlMQj95IwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwME
MA0GCSqGSIb3DQEBBQUAA4IBAQAHTgkQg47p4Fy5PCFcdGzX5LnHqyHK/cysjcpo
lHSj89/s/kX1pXU7Jqgp/FD1RJu/Ng6rmgHSNDR9ZHwapdc++PRSxDBN/+2BnR6J
4CoxHb0e7sjDddb7R1ceTuRXNjZuruV80j5HFycgrHSsSLI/LeZq1up0NLM+YOxt
/+zsnkAiGfLvRCVTlppwgfhpsT1LhdVvrDkYMedbgrA1zqL/kbXe0DIdb8kn2G8Q
7zR8SEYPXnWsDR2Ktno53mxKhx9kg3DQayWMudNY8qy+So0uBT1CqCsWR7SWoMpX
VSnKLXWBCRDqevVt4B2fpTHoo4uM4oZDggYaf14ky90d0lWH
-----END CERTIFICATE-----
No preview for this file type
-----BEGIN CERTIFICATE-----
MIIDgDCCAmigAwIBAgIFEFmDdYIwDQYJKoZIhvcNAQEFBQAwITELMAkGA1UEBhMC
Q04xEjAQBgNVBAoTCUNGQ0EgT0NBMTAeFw0xNjEwMjQwNzIzMjRaFw0yMTEwMjQw
NzIzMjRaMHExCzAJBgNVBAYTAkNOMRIwEAYDVQQKEwlDRkNBIE9DQTExDzANBgNV
BAsTBkJhb2ZvbzEZMBcGA1UECxMQT3JnYW5pemF0aW9uYWwtMTEiMCAGA1UEAwwZ
QmFvZm9vQOWuneS7mEBaNjg4MTk5OTlAMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
gYkCgYEA30bgCAY6agzuJccSKfLe/2NeOeUm2GZFuajai6CB9E0SOg6QymWuGw/f
XyL6rcZd/eavew1Ec2EDTeq4DgVudah6HZbI3EXt2TSxLpn6AwDMwKgSGhWpxR2V
1HnEiIyTOCjdWe5gUJl62UnE5acErjO0G9w+o+qGy13r0/ZZ6h0CAwEAAaOB8jCB
7zAfBgNVHSMEGDAWgBTR2+mIguXdGo9MqgCMvnzyqxv22TBIBgNVHSAEQTA/MD0G
CGCBHIbvKgEBMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24v
dXMvdXMtMTQuaHRtMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly9jcmwuY2ZjYS5j
b20uY24vUlNBL2NybDQ0MDEuY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQURqt0
qRdCkRebpuVAmkiDlMQj95IwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwME
MA0GCSqGSIb3DQEBBQUAA4IBAQAHTgkQg47p4Fy5PCFcdGzX5LnHqyHK/cysjcpo
lHSj89/s/kX1pXU7Jqgp/FD1RJu/Ng6rmgHSNDR9ZHwapdc++PRSxDBN/+2BnR6J
4CoxHb0e7sjDddb7R1ceTuRXNjZuruV80j5HFycgrHSsSLI/LeZq1up0NLM+YOxt
/+zsnkAiGfLvRCVTlppwgfhpsT1LhdVvrDkYMedbgrA1zqL/kbXe0DIdb8kn2G8Q
7zR8SEYPXnWsDR2Ktno53mxKhx9kg3DQayWMudNY8qy+So0uBT1CqCsWR7SWoMpX
VSnKLXWBCRDqevVt4B2fpTHoo4uM4oZDggYaf14ky90d0lWH
-----END CERTIFICATE-----
No preview for this file type
-----BEGIN CERTIFICATE-----
MIICAjCCAWugAwIBAgIGAXbQH8mSMA0GCSqGSIb3DQEBDQUAMCExEjAQBgNVBAoMCUNGQ0EgT0NB
MTELMAkGA1UEBhMCQ04wHhcNMjEwMTA1MDExODMyWhcNMzYwMTAxMDExODMyWjBoMREwDwYDVQQD
DAhrY2JlYmFuazEXMBUGA1UECwwOa2NiZWJhbmstcnV5YW4xGTAXBgNVBAsMEE9yZ2FuaXphdGlv
bmFsLTExEjAQBgNVBAoMCUNGQ0EgT0NBMTELMAkGA1UEBhMCQ04wgZ8wDQYJKoZIhvcNAQEBBQAD
gY0AMIGJAoGBAIx53Mx7XGTejcIu8w3WgSxDcspaRMBoigQLU3MZnQHNoDUaVZI021nmkE/10+hT
c9lCdkXQ1A0hJADYp4M3a9G5qpkfZhlu6nDyRrkhB5wbzIvVPF8b9+QS2ELTY0Pqxldhn6jI+qx4
xriJtnYOjaqcczwRqZRIWyk6jv9Sw5glAgMBAAEwDQYJKoZIhvcNAQENBQADgYEATWdN8CvaWVQA
Ie5y2SLv8Xsps8pUAvNdiUr1nPZK/gImwEaCAypd8E3QRZOZ3kFpLg8DtitmUoBvaQ8ZGS+0JCht
zfv7RmpvWutCWj5AfcAmGuRVXEHeP6lTv03hvbRXKBlJSq0MqIBRxBNOaqTFx/i8IDys/HAgBhnJ
UVgjoh8=
-----END CERTIFICATE-----
\ No newline at end of file
No preview for this file type
-----BEGIN CERTIFICATE-----
MIIDCTCCAfGgAwIBAgIGAYeYhhppMA0GCSqGSIb3DQEBDQUAMCExEjAQBgNVBAoMCUNGQ0EgT0NB
MTELMAkGA1UEBhMCQ04wIBcNMjMwNDE5MDc1ODU4WhgPMjA1MDA5MDQwNzU4NThaMGgxETAPBgNV
BAMMCGtjYmViYW5rMRcwFQYDVQQLDA5rY2JlYmFuay1ydXlhbjEZMBcGA1UECwwQT3JnYW5pemF0
aW9uYWwtMTESMBAGA1UECgwJQ0ZDQSBPQ0ExMQswCQYDVQQGEwJDTjCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAL1yumLW9aFca2yuZjDBv1oblPpqxQe6bxXPBaAyyKiwI61RFCk1GVFo
mPtm1RhENXNfZy8fwGCuEP4UofGDKe4G3ddIx+n0rA5pvZ6p2nRW8Vp9C6C7O5RRrCUQWW2LZq9k
e0Lpe7m4kvPv6FoKrDfljbYjHewzx+wEdBoyltalL07xJ75maWGJU8l/cSqDb78n+4N+uqhlKb29
qnyhfZ/BVfgD3bDmrLyO0g2PJ4xM9q2EfUIWknpf5zqIwGUeQown/QJ9Bs2mSUSDPLNQ93QzKOMj
B3NyEHhRFfXToR80ozr6w1zjO/FKi5oWr1hPYiM0vHLR1Ya9Vg+ZbZGJ+Y8CAwEAATANBgkqhkiG
9w0BAQ0FAAOCAQEAJ+2GgbDacEq8Y95+zRo66NXSNwj7XVGlibM+UN9CJrg0nWoRxt58xQUTCBE6
o3kGpKk5s1fMI3I6+1EG3TWZEB4ViqT+LVPgkYC7BobgbSLSQNhJkVqQGNDP/vVjesqEu0b9ykV3
KLMScietn0tpwQt4RvwIEXJF6XRvX2U2lrDbB63SvkrqDSGw/7bm7YqcFyPsGfwot34AhZ+61OTT
6C7ziw5DNGLbj62fBl/HsivvUClr/5k5X9UKC+RVYeAp7e7SDgjtd9jfhfA5De0dyazu06f9LvMu
JdjqRkotlKg8/JYkkSLMxJuW7U9wB4x2ME8aekg3tfZs6B1eO9tReQ==
-----END CERTIFICATE-----
\ No newline at end of file
No preview for this file type
-----BEGIN CERTIFICATE-----
MIIDCTCCAfGgAwIBAgIGAYeYip3AMA0GCSqGSIb3DQEBDQUAMCExEjAQBgNVBAoMCUNGQ0EgT0NB
MTELMAkGA1UEBhMCQ04wIBcNMjMwNDE5MDgwMzUzWhgPMjA1MDA5MDQwODAzNTNaMGgxETAPBgNV
BAMMCGtjYmViYW5rMRcwFQYDVQQLDA5rY2JlYmFuay1ydXlhbjEZMBcGA1UECwwQT3JnYW5pemF0
aW9uYWwtMTESMBAGA1UECgwJQ0ZDQSBPQ0ExMQswCQYDVQQGEwJDTjCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBALYPjL4VLm0awYyHdtsTELLixB7efvPjd9u+Edd9Ht+KQ3I0GCEUvoOe
gnrCljbkWNe1t4CXHg7/mI1PTCKYzdkG7jeGvgNeuxFqdgxbKfzCojRR3FOMn1GUw99XZXh6japk
oDoSUbeF7fCtiSXhyOD6P+wzSPuh4hjqSTvzWZjDGL8svgdbav+7kWLNdwFDUh5nTJ4NyfejOqdy
l+QnfmdncnmGq4qpumIzrtX9QQh4uhggJ0WiZ7NtSHg9wp6Jc6F77K9vZw8SrvXIpG9H+xTWbkdJ
iYu0sROzXa6XcUD08LqrQPBc8R2uOneJdaIg7gLNUlpYVHZGiqKoQeqbBOUCAwEAATANBgkqhkiG
9w0BAQ0FAAOCAQEAHybso+WrC9tnOoDEzB6atUfjmlmRXvrCW4TzMGWoS7UfZJi4Gc+TXKhcqK26
fFWADfhKOJ75wyIUFL3c+YWAJ/pSYQR6c1DnSHvGd9OnOZs5G2W7dX0PiLDz68faOTpiMCojC9Ud
km3dpiUHS7FZcHI4Rrn/w+azvo/Ce1xMVrxq6FX0cicCmoiQEy1l1rUvrfUkQYLqTEgd36+L6Mff
oTlgHaWUgf43Gnn1YlH0UiJnVShPfpagXAhMz/jM5d5R1CChnLPMBHbnF3oXIh/3ywqlbG5kZDb3
ba8DPD6ZQ0qdNp9boo6Jb3JH0lhs6eTHEw6YXtyThHX8QF68fAll9Q==
-----END CERTIFICATE-----
\ No newline at end of file
<?php
/**
*
* @createTime: 2023-04-24 18:37
* @description: 慧收钱配置文件
*/
return [
/* 测试账号 begin */
// 'key'=> '86a8eec5ae958e9948b7450439cc57e2', //商户key
// 'merchantNo' => '814000473149', //商户号
// 'appid' => 'wxb63c89abb9243ad0', //微信公众号APPID
// 'private_key' => dirname(__FILE__) .'/certFile/hsq/hsq_demo_pri.pfx', //私钥
// 'public_key' => dirname(__FILE__) .'/certFile/hsq/hsq_demo_pub.cer', //公钥
// 'private_key_pass' => '123456', //私钥密码
// 'request_url' => 'https://test-api.huishouqian.com/api/acquiring',
/* 测试账号 end */
/* 猎电 begin */
// 'key'=> '86a88c6b33321988db7ae217aa4ed36a', //商户key
// 'merchantNo' => '862003023920', //商户号
// 'appid' => 'wxbda017d7ba602dda', //微信公众号APPID
// 'private_key' => dirname(__FILE__) .'/certFile/hsq/liedian_pri.pfx', //私钥
// 'public_key' => dirname(__FILE__) .'/certFile/hsq/liedian_pub.cer', //公钥
// 'private_key_pass' => 'Ldcharge888', //私钥密码
/* 猎电 begin */
/* 猎维(智能充) begin */
'key'=> '6a84817f0214990c0e52871aa33ca777', //商户key
'merchantNo' => '861002923881', //商户号
'appid' => 'wx7d8e1164d40f77be', //微信公众号APPID
// 'private_key' => dirname(__FILE__) .'/certFile/hsq/liewei_pri.pfx', //私钥
'private_key' => '-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDXwmROITU7SwEN
CEuPuLdpD1xAXafgvDXbDWR/Loj4VQnWVil3Yp6XKvec29uYj8mBDymGmJwn+zSi
vSzl6ZzoGdS1bBpaTCC9tUT0+PSXuR+piWqtgXPstuwWCT7tg19hDo36J4pZoTJC
J4VCnO7ZsSuDr/xhHIbBs6/IC/JPo5GKZ1sroIJpGrSa/bhYpTAq7md5LY/Shri5
YoKMSz+2HpRVmnrsboEoGYS/CeNwegbzJXajFl0T1RLKMV5hWyLJjfNkEiv0bOrd
ZiYgqMblfUNnxH0SiPWT2mCLUXnAExIgH77qbt6krnwMPWTkjKtMnVa3adPyCQgg
NEFw1AvBAgMBAAECggEAQfE5st9XY53S3mbQoUZ1V/jH2yxEqN0dIKwBMRXJ6wwi
i42d8s0DZ3RMZXaUsRYRIg6+RFLUNywBtFNZK5OwzwdGCYTWsQ5fW1vRjYWhS9Xa
pXhIUGsmQQzPLxT4VKM4PXOzVOdM04P+1lU511gbcBFEGWVqH0wWq5D9goiUMF5f
6JZH8D5eu06bIss1WK8LK6p0gpizyPvRLNnJFEDSPm+QYjd//x7Dq4GN1RnlvjzO
qaXM2lFUFB+i9Fv+/rGl0aK0x9jnwF9FZYqbS1TczLkAXkjWDUz74+rM86qlQ6vr
DJMjtA+1PNtm3bp08MZEd6jGhCc1HhDAfhn17r90gQKBgQDvHs+ucy5KfXXcQpR/
9RCbBrgIMQjvVusv1FuSgp2enSd2da+ngmqnNzCKfo/IgwfFTGZ+XJpoL/s5C2Jk
2/rWtilP99dOPum8T4Ow7Rn1doQoO5LgQyBefo2ukbRkeHEcfGonE1DBbTid93Vy
yRj6rz5rSYAfd4pGSMa8GQbK6QKBgQDm/WtYFEJ7e+whgq+DVk8VEYgXLzsDluMN
4ibj/23l0Rafrfim50HnqgmaSPeGg8r+uaFP2RqCsAP86xGy6S+sHrxcVCemGJoW
ipzXvgyHVeZN6/EkSQSG0IEcbvJe15s6RChPbzEDXdiJ/pOcytCkS4Gn26cTOCOF
P93wy42DGQKBgQDPTeX9NqwuNkCk2TAHEv33eMa5i1FUtgUlrTRKe2SM63AX+gVz
8tPl7inuF7Utv7NP8GF3MW9H3jkthloiWLhJxxlf091cX5yh/kmMbLIxpTMD8knu
lSON6KeKbZV3+RcO/CnHgK5lUvxfrvaqsf8u7hjuSIWEQk2li1iIICZMaQKBgQDO
5HVdMuhJSjm52h/ydz/mEwneGkO1d1Rvfvxugr6gdaLZ6y0n8UKqiTaIpopuRWVw
ujuuFTsViypHQxVbNlmoxO7Zk9bfgnGhdw38fxEhtuLNMGOQqIYRanf6S7VzFZLH
oXypiWJRLaFiGE+GxHIUdjzvaGJBaKsIEqhroSZjIQKBgCePXQbCGno8hHM2N6ME
qQYYnfqrXsO7KMUHB+Soq/kApqHDXhfzjN4wScnyku2j5Wm6AES6RWRTyWiJmXys
2fY4O3MK04L5iazSRRt3XWncHUGjxmuxBwHv2FnUnGCqTvwBvmAW4+Y999Gnx/bb
o/jP9AKFHhvs9aCh2SawdrE9
-----END PRIVATE KEY-----
',
// 'public_key' => dirname(__FILE__) .'/certFile/hsq/liewei_pub.cer', //公钥
'public_key' => '-----BEGIN CERTIFICATE-----
MIIDCTCCAfGgAwIBAgIGAYeYip3AMA0GCSqGSIb3DQEBDQUAMCExEjAQBgNVBAoMCUNGQ0EgT0NB
MTELMAkGA1UEBhMCQ04wIBcNMjMwNDE5MDgwMzUzWhgPMjA1MDA5MDQwODAzNTNaMGgxETAPBgNV
BAMMCGtjYmViYW5rMRcwFQYDVQQLDA5rY2JlYmFuay1ydXlhbjEZMBcGA1UECwwQT3JnYW5pemF0
aW9uYWwtMTESMBAGA1UECgwJQ0ZDQSBPQ0ExMQswCQYDVQQGEwJDTjCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBALYPjL4VLm0awYyHdtsTELLixB7efvPjd9u+Edd9Ht+KQ3I0GCEUvoOe
gnrCljbkWNe1t4CXHg7/mI1PTCKYzdkG7jeGvgNeuxFqdgxbKfzCojRR3FOMn1GUw99XZXh6japk
oDoSUbeF7fCtiSXhyOD6P+wzSPuh4hjqSTvzWZjDGL8svgdbav+7kWLNdwFDUh5nTJ4NyfejOqdy
l+QnfmdncnmGq4qpumIzrtX9QQh4uhggJ0WiZ7NtSHg9wp6Jc6F77K9vZw8SrvXIpG9H+xTWbkdJ
iYu0sROzXa6XcUD08LqrQPBc8R2uOneJdaIg7gLNUlpYVHZGiqKoQeqbBOUCAwEAATANBgkqhkiG
9w0BAQ0FAAOCAQEAHybso+WrC9tnOoDEzB6atUfjmlmRXvrCW4TzMGWoS7UfZJi4Gc+TXKhcqK26
fFWADfhKOJ75wyIUFL3c+YWAJ/pSYQR6c1DnSHvGd9OnOZs5G2W7dX0PiLDz68faOTpiMCojC9Ud
km3dpiUHS7FZcHI4Rrn/w+azvo/Ce1xMVrxq6FX0cicCmoiQEy1l1rUvrfUkQYLqTEgd36+L6Mff
oTlgHaWUgf43Gnn1YlH0UiJnVShPfpagXAhMz/jM5d5R1CChnLPMBHbnF3oXIh/3ywqlbG5kZDb3
ba8DPD6ZQ0qdNp9boo6Jb3JH0lhs6eTHEw6YXtyThHX8QF68fAll9Q==
-----END CERTIFICATE-----', //公钥
'private_key_pass' => 'Ldcharge888', //私钥密码
/* 猎维(智能充) begin */
'returnUrl' => '', //异步回调地址
];
<?php
require_once __DIR__ . '/../../autoload.php';
use Payment\Common\PayException;
use Payment\Client\Charge;
use Payment\Config;
date_default_timezone_set('Asia/Shanghai');
$config = require_once __DIR__ . '/config.php';
//print_r($config);die;
$payData = [
'transNo' => "WechatPay".date("YmdHis"), //商户订单号
'orderAmt' => 1,//交易金额(单位分)
'goodsInfo' => '支付测试', //商品说明
'openid' => 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o',
'longitude' => '171.21', //经度
'latitude' => '22.33', //纬度
];
try {
$ret = Charge::run(Config::HSQ_CHANNEL_LITE, $config, $payData);
} catch (PayException $e) {
echo $e->errorMessage();
exit;
}
echo json_encode($ret, JSON_UNESCAPED_UNICODE);
\ No newline at end of file
<?php
require_once __DIR__ . '/../../autoload.php';
require_once __DIR__ . '/../testNotify.php';
use Payment\Common\PayException;
use Payment\Client\Notify;
use Payment\Config;
date_default_timezone_set('Asia/Shanghai');
$config = require_once __DIR__ . '/config.php';
$_POST['req'] = [
'method' => 'CALLBACK',
'format' => 'json',
'signType' => 'RSA2',
'signContent' => '{"transNo":"WechatPay20230505172514","payType":"WECHAT_APPLET","orderAmt":1,"goodsInfo":"支付测试","returnUrl":null,"requestDate":"20230505172514","memo":"{\"openid\":\"oUpF8uMuAJO_M2pxb1Q9zNjWeS6o\",\"appid\":\"wxb63c89abb9243ad0\",\"spbillCreateIp\":\"127.0.0.1\",\"longitude\":null,\"latitude\":null}"}',
'version' => '1.0',
'merchantNo' => '814000473149',
// 'sign' => '219518285f7faea08921f367ec05958f629ef61d0216bf826599cf51d7541feeb08fb2e07f88b83f33f4db8443d81a2beafd0b1affbd8a2d529d8a6d7b6bc3445700edc448d666ac139acd7115dc61d6e7691527e7b05a1143006eef4ef7d67114359e833dc73a1f01a6cf3711e1955e268f2f47978d683fed54127d23a40f72',
'sign' => '68d9975afec900871fc36212c2ccedac08ffea2b3f212f5d5d37ff8af78bd77f12dfa77cdfd291a2bcda61d462b9ef11c3479707f35300b76c361b4a87f6dcb856a5e1e56c2cdc6e894ce69ffee6fe2c5709dd4756779ac389a717d35cb203406135bc77a403735cd5da630f28f5cdd22259d32d2a07e4a5febb15f894940f9e',
];
try {
$ret = Notify::run(Config::HSQ_CHARGE, $config, new TestNotify());
var_dump($ret);
} catch (PayException $e) {
echo $e->errorMessage();
}
\ No newline at end of file
<?php
require_once __DIR__ . '/../../autoload.php';
require_once __DIR__ . '/../testNotify.php';
use Payment\Common\PayException;
use Payment\Client\Notify;
use Payment\Config;
date_default_timezone_set('Asia/Shanghai');
$config = require_once __DIR__ . '/transferConfig.php';
$_POST['req'] = [
'sign' => '34856bef9cc8c19e93010d912661f886276b949f4d033854c0f2aaf2ecbd5a9d025195cc5c6a8ae61801e4dbc33757201a09e0d3f46d00a7e4d27bca07697dc7d6b3a4e1a573a88bc0d74f6ca6ac57710aed4bbd6566261a48deb8c7ddbe1b0aca448347378a589b276b0a926726f3617f3131c2dc2add7d57bf6f05037f4bd14a07ff256fb06decbad159ec8f60611bc9b1133c63334159b847950c505d78ad410d9e273f5ea8f915efe339a46c5d2edf472db46a7a69aaa7c528d90e4fe0cbb50bbfb882b627bb0bcf663960bd3a412ca264914cd3844ca415097e051bad8e9531dbcd46eef5c06b06cf23b331a2ee3345e59c9c1b336b4d348feb241fbb356453adb98075c72929e1933d14cc2fa1e1740c4f906b5ec3cd71887c4448ebebfec0b67a77d4469ac23648f9195acc1749a86cf1e455904f8f01d8ac4e787f607d74b055c82989277ddbd1a7b31110e0a5adc20757181895eaf671bdc19eac5e887333edf2487a94c58408c012754310451b3924becbcaed999059eda07cc6d15b6580dd31a714ec38be9cc3b9c1220ffd93292d86b533ad1b38625253bcb717ab02a44d333ba72ad301323c3e49a93268503d2a44c211926d9103615c4b552a803839993e428d332347f1b1b657656eba00a08616a14a11e4e57b2fb0aad12e0103b9a1ed714de8b7f39fd5caaab38d0405f93643cf7d0b4f034f5f90859d886614a576a27421c9a62c2aaef0b6a9ed2b0db3d1f1736cddd3e23ab53fb710e558122cfde4c32e803c00aa32ef0f5e362e7119f856661fca83af68aa5ca671dd923c55731bfcc1d51e748049545a6e4abf26b4096261ecc5dd9a0ea071592aaac4864f06dce9f817ce5bce846ca509a48189439a7a2e401bbc50801742bad27c',
];
try {
$ret = Notify::run(Config::HSQ_TRANSFER, $config, new TestNotify());
var_dump($ret);
} catch (PayException $e) {
echo $e->errorMessage();
}
\ No newline at end of file
<?php
require_once __DIR__ . '/../../autoload.php';
use Payment\Common\PayException;
use Payment\Client\Query;
use Payment\Config;
date_default_timezone_set('Asia/Shanghai');
$config = require_once __DIR__ . '/config.php';
$payData = [
'transNo' => 'WechatPay20230506225945', //商户订单号
'queryType' => 1, //查询类型
];
try {
$ret = Query::run(Config::HSQ_QUERY, $config, $payData);
} catch (PayException $e) {
exit($e->errorMessage());
}
echo json_encode($ret, JSON_UNESCAPED_UNICODE);
\ No newline at end of file
<?php
require_once __DIR__ . '/../../autoload.php';
use Payment\Common\PayException;
use Payment\Client\Query;
use Payment\Config;
date_default_timezone_set('Asia/Shanghai');
$config = require_once __DIR__ . '/config.php';
$payData = [
'transNo' => 'WechatRefund20230426234103',//原退款交易对应的商户订单号
];
try {
$ret = Query::run(Config::HSQ_QUERY_REFUND, $config, $payData);
} catch (PayException $e) {
exit($e->errorMessage());
}
echo json_encode($ret, JSON_UNESCAPED_UNICODE);
\ No newline at end of file
<?php
require_once __DIR__ . '/../../autoload.php';
use Payment\Common\PayException;
use Payment\Client\Query;
use Payment\Config;
date_default_timezone_set('Asia/Shanghai');
$config = require_once __DIR__ . '/transferConfig.php';
//代付交易一次处理的请求条数(payData)有限制,不超过 5 个,超过 5 个:交易请求记录条数超过上限!
//请求报文体中的 trans_no 要求全局唯一,如果发现有重复则报错
//代付交易查证一次处理的请求条数(payData)有限制,不超过 5 个,超过 5 报:交易请求记录条数超过上限!
//批量查询的多笔订单每笔订单时间间隔不得超过 24 小时
//测试环境必须传 trans_batchid 正式环境不需要
$payData = [
// [
// 'trans_batchid' => 24716624, //宝付批次号
// 'trans_no' => "TN16826631972112", //商户订单号
// ],
[
// 'trans_batchid' => '291675877', //宝付批次号
'trans_no' => "TN16833643347311", //商户订单号
],
];
try {
$ret = Query::run(Config::HSQ_QUERY_TRANSFER, $config, $payData);
} catch (PayException $e) {
echo $e->errorMessage();
exit;
}
echo json_encode($ret, JSON_UNESCAPED_UNICODE);
\ No newline at end of file
<?php
require_once __DIR__ . '/../../autoload.php';
use Payment\Common\PayException;
use Payment\Client\Refund;
use Payment\Config;
date_default_timezone_set('Asia/Shanghai');
$config = require_once __DIR__ . '/config.php';
$payData = [
'transNo' => "WechatRefund".date("YmdHis"), //退款订单号
'refundType' => 1, //退款类型,
'origTransNo' => 'WechatPay20230426234103',//原商户订单号
'origOrderAmt' => 1, //原订单金额
'orderAmt' => 1, //退款金额
'requestDate' => date('YmdHis'), //原交易日期(Ymd,如:20190620)
'refundReason' => '商品已售完',//退款原因
];
try {
$ret = Refund::run(Config::HSQ_REFUND, $config, $payData);
} catch (PayException $e) {
echo $e->errorMessage();
exit;
}
echo json_encode($ret, JSON_UNESCAPED_UNICODE);
\ No newline at end of file
<?php
require_once __DIR__ . '/../../autoload.php';
use Payment\Common\PayException;
use Payment\Client\Transfer;
use Payment\Config;
date_default_timezone_set('Asia/Shanghai');
$config = require_once __DIR__ . '/transferConfig.php';
/*
* 代付交易一次处理的请求条数(payData)有限制,不超过 5 个,超过 5 个:交易请求记录条数超过上限!
* 请求报文体中的 trans_no 要求全局唯一,如果发现有重复则报错
*/
$payData = [
// [
// 'trans_no' => "TN" . strtotime(date('Y-m-d H:i:s',time())) . rand(1000,9999), //商户订单号
// 'trans_money' => 1,//转账金额,单位:元
// 'to_acc_name' => '王勇', //收款人姓名
// 'to_acc_no' => '6212262201023557228', //收款人银行帐号
// 'to_bank_name' => '中国工商银行', //收款人银行名称
// //支付方式说明:对私可不填写省、市、支行;对公必须填写。
// 'to_pro_name' => '上海市', //收款人开户行省名
// 'to_city_name' => '上海市', //收款人开户行市名
// 'to_acc_dept' => '支行', // 收款人开户行机构名
// 'trans_card_id' => '310115200501018559', //银行卡身份证件号码
// ],
[
'trans_no' => "TN" . strtotime(date('Y-m-d H:i:s',time())) . rand(1000,9999), //商户订单号
'trans_money' => 1,//转账金额,单位:元
'to_acc_name' => '郑健康', //收款人姓名
'to_acc_no' => '6217921957329496', //收款人银行帐号
'to_bank_name' => '浦发银行', //收款人银行名称
'trans_card_id' => '610112199210152519', //银行卡身份证件号码
],
];
try {
$ret = Transfer::run(Config::HSQ_TRANSFER, $config, $payData);
} catch (PayException $e) {
echo $e->errorMessage();
exit;
}
echo json_encode($ret, JSON_UNESCAPED_UNICODE);
\ No newline at end of file
<?php
/**
*
* @createTime: 2023-04-24 18:37
* @description: 宝付代付配置文件
*/
return [
/* demo begin */
// 'member_id'=> '100000178', //商户号
// 'terminal_id' => '100000859', //终端号
// 'private_key' => dirname(__FILE__) .'/certFile/baofoo/demo_pri.pfx', //私钥
// 'private_key' => '-----BEGIN PRIVATE KEY-----
//MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAPI7Hb+2X0/1r4+x
//JXBoFRgFSN9G4xSSvlfKFd6ynYpHklLLfNG6z21bw+DDWvrkNpcbAjAzfgMZAXmB
//JKQRTMQM9RBxu2978ot1KJJBfk1Njw1lWrYCZiQ1uaNhXykHrBHYiBxDE/uVSAEm
//Q9IJyxB++khsNe7WWT2re2JW+OzfAgMBAAECgYEAz5OLRbth6CKRJODYRYBb+y6k
//KPoVJI8v4AlEPofv6wy0PpE0UIH2uS83J0ghkfi5Mzoo4OdvZ/Yoxle9738HuRrD
//VYzDgsr2mGmr11ESVhe7jmdrPryURai0qedjpSVgfY9QrQsgOilPR+GYkkOh0szh
//wkm4KHIKx8bdxpHvHCECQQD+IGFGNHov+3/HQJmcuqLRUizEbsi4mkKhiqcInQ48
//2o+7uoysVYjszIkAlpDXVlxMqPEeVn0p9rVChJxiBMlxAkEA9ARJECnNP+y6eePT
//6ueii10p1wajUjcxL30bqYLPVWuhSICmttCoNiApIj4HFQSQBxDZXoSODEuo9m3T
//WJFzTwJBAN7wXSYP55msk36jx59dhHUKGEgDwIdinU3Gq5682b69JxdUIxEUwNis
//3wvrCwo+sx51n4Iz8f4cdwvx9pdvB6ECQQDd9Lfwt9U2fEHydUVhumijk45nRGZy
//djmLFKWAvreQ32HI7Ry31XvsH7zKpNkUSR4pDy5pRvFeRcPew28mdMcJAkAPW9D4
//FCgJAfH1v1be8YkP44sJ4nRlcm03hOx8/Ebp/Xx+lqHNsf0RIg+vO9PuD7vEm3ZA
//z5UXe4TamX6HwMxH
//-----END PRIVATE KEY-----
//',
// 'public_key' => dirname(__FILE__) .'/certFile/baofoo/demo_pub.cer', //公钥
// 'public_key' => '-----BEGIN CERTIFICATE-----
//MIIDFjCCAn+gAwIBAgIJAKIW6tKw+5gIMA0GCSqGSIb3DQEBBQUAMGYxDzANBgNV
//BAMTBlJvb3RDQTEPMA0GA1UECxMGQmFvZm9vMQ8wDQYDVQQKEwZCYW9mb28xETAP
//BgNVBAcTCFNoYW5naGFpMREwDwYDVQQIEwhTaGFuZ2hhaTELMAkGA1UEBhMCQ04w
//HhcNMTQxMjIyMTAxMTE0WhcNMjQxMjE5MTAxMTE0WjBmMQ8wDQYDVQQDEwZSb290
//Q0ExDzANBgNVBAsTBkJhb2ZvbzEPMA0GA1UEChMGQmFvZm9vMREwDwYDVQQHEwhT
//aGFuZ2hhaTERMA8GA1UECBMIU2hhbmdoYWkxCzAJBgNVBAYTAkNOMIGfMA0GCSqG
//SIb3DQEBAQUAA4GNADCBiQKBgQCpBL+SzNNpeJVAhP8XO91dPrQHf6w2k7aqwnWG
//jnYjRlmy7iaeUJT/wb3PoH+ioGNTJyPHvfYHalEmvi133K3N8NdHizaYTjm1hgNB
//hBIK8aPZCR76C3UtQPv4mqA5fTZEWnRbr8JrVJoFNEN2+4JQwCeDtaC3OzPPflET
//t6zdOQIDAQABo4HLMIHIMB0GA1UdDgQWBBSjwZD5kVF2fblxVW68Z2iWSvakoDCB
//mAYDVR0jBIGQMIGNgBSjwZD5kVF2fblxVW68Z2iWSvakoKFqpGgwZjEPMA0GA1UE
//AxMGUm9vdENBMQ8wDQYDVQQLEwZCYW9mb28xDzANBgNVBAoTBkJhb2ZvbzERMA8G
//A1UEBxMIU2hhbmdoYWkxETAPBgNVBAgTCFNoYW5naGFpMQswCQYDVQQGEwJDToIJ
//AKIW6tKw+5gIMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAcg56wgbV
//yZjb1mD3NZH3PIdodOA4CP5XC/fWQqJMSFB9ngvR/hH058E2+QiWHhN5HkQgmeOR
//xkuiDTVKosyylEYVsyFNaKKASufKH2eVXc4fUj/vd660ictNbbwTYuV4m7r5ZI8O
//4avXIZc6APJTqHAXYK84LzvSaQtXbPhJA0E=
//-----END CERTIFICATE-----
//', //公钥
// 'private_key_pass' => '123456', //私钥密码
// 'base_url' => 'https://paytest.baofoo.com/baofoo-fopay/pay', //测试接口上线时取消注释
/* demo end */
/* 猎电 begin */
// 'member_id'=> '1272710', //商户号
// 'terminal_id' => '80808', //终端号
// 'private_key' => dirname(__FILE__) .'/certFile/baofoo/liedian_pri.pfx', //私钥
// 'public_key' => dirname(__FILE__) .'/certFile/baofoo/liedian_pub.cer', //公钥
// 'private_key_pass' => 'Ldcharge888', //私钥密码
/* 猎电 end */
/* 猎维(智能充) begin */
'member_id'=> '1272712', //商户号
'terminal_id' => '80814', //终端号
// 'private_key' => dirname(__FILE__) .'/certFile/baofoo/liewei_pri.pfx', //私钥
'private_key' => '-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDI3+qU67U/JPFF
nOL5qOt8QsbG6gHxUv/PjYNnMyLy6UXf04EXNfAPeqzHLg1n4RCU2EHazoeGufby
rnQfgb4q6xaq1RykxP2gCUPEj6VdpC82K99Gj6gMiquvU3AdhTMFBZnGWx3ZdU8O
IbFO0yplOjUXAYwpeYAAu2FxUxoXr6gKR+KXQpmKe+fTQSXeF6c/qAysNOut4L6L
YmbO+hErb0qVqpCcDt07MI9PFJ2vOiWAGoLToePcgNMX9jFcfvLzSc1srJnKYL+k
GFrlomwRWzhQK7u1/OADknb8D4DwAoEGaDwqqgO+5xSfT9QN+c4Ns/OS0x8F7K4Z
Xg5CJnxxAgMBAAECggEAW7/at7aJjJPlF/S2v23mUVV20Xgk9wMAEN8EO+jhd64Q
2lESz3U1dvyDWl6whNgJ6NJ2EejvghwCrYn9RD7Qi23hZpn8gU3wwl4489jgoUrS
vZ2AWAxZp5DXJjeoJ/OlABA00qLfmWm5eCzvfZ95586UXTO5v1/dlXgA4/AfJN2o
DVf7T/yktKtJ4AAayHVQ0Na7m1bLlQGNVpKe9p9868ioflTFpXxpFa/ALmal4HBz
VSPbZh4pmz5IT6SeRkbBE/qJc99y60BDwAcFJ7xPA78IYmaHCphfXXNUhjNOH/HD
GyBor38ir3vDEtd3KKyM9WOnT5Mi5f/KbQv3wMsj+QKBgQDKGpgjRaklP7x/VKFr
hgSlV3Vnwd4JW4kYbylAfQ0DqsLVEm8FANyptz9RtFXZaXgv92u70LD94Aa+Y3RO
MLNw79A3bHMI4P7LQwg9fW8PzrlnZhimgBT3glDIkVB/k7/hpzPHQBd8GpgOvIsl
BS+IrCoi6q0Ins1YLLep57RsDwKBgQD+cWe7jlqxU3QtyBqquRbGz3OnYLb8OCD/
aSRAkIG6KN0ir2b0y6KN8epzjNURfTT8yiXV9frN226tFoHNdUQmZY3kwz2HCVcn
OkxLdmJ5745eC/erYG6jnD2/XxC6E3uAoLxRVxVkrOQmjMNmoXLNg73f4uGQS6FB
mOvLXbAPfwKBgD2jpsr7L/9gVQkwspqsoTYcWn5url2EQWfmX1p/yTxZFFsP6DRK
cwKAFRvCOHy6oiFfAMijeZe0f9oJUyuVxuSm/4Yn2V3X4V3078pxOzJDBmD2zoXZ
gouKf0DssPR4B4m3CR+3+HGtWrsD3hxIXJr+h0tm76c1Z8OAv/Nd67UZAoGAGn9i
5yRfC4J+Ydop9MeLuK6YA8FNrRyHSzH+5X5nFCT3SoprtWiTiCa+XMQ42DZq0zyW
Dh8svE1yzDHA2M2yiDEhQsaWXL67RcmLcnxkqwAommCyrTVAsGcwAwL6cfZfcTjM
A8iG4NIkfGNCYijEFOT4XB17khReOb+cJrSeBi8CgYAv/8eDFUByQlEjiJruIaLz
px8i10gUHVgCj1Cfeieftp6A2r6cpcPHCH3XPgYB79c2HLFdDV17E8vFxiouI4xz
3GIGef+eCn486yTn7fkijMoRrE3Ds4WUawC4ESYYPC6wF5x6DnBtP7I+z1VXMwzW
6YxH6Zx/J/4c8CcYm2PdqQ==
-----END PRIVATE KEY-----
',
'public_key' => dirname(__FILE__) .'/certFile/baofoo/liewei_pub.cer', //公钥
'private_key_pass' => 'Ldcharge888', //私钥密码
/* 猎维(智能充) end */
];
File mode changed
......@@ -6,7 +6,7 @@
*/
return [
'use_sandbox' => true,// 是否使用 微信支付仿真测试系统
'use_sandbox' => false,// 是否使用 微信支付仿真测试系统
'app_id' => 'wxxxxxx', // 公众账号ID
'mch_id' => 'xxxxx',// 商户id
......
<?php
namespace Payment\Charge\Fu;
use Payment\Common\Fu\Data\BackBarChargeData;
use Payment\Common\Fu\Data\Charge\BarChargeData;
use Payment\Common\Fu\FuBaseStrategy;
use Payment\Common\FuConfig;
/**
* Class FuScanCharge
* @package Payment\Charge\Fu
*/
class FuBarCharge extends FuBaseStrategy
{
public function getBuildDataClass()
{
return BarChargeData::class;
}
protected function getReqUrl($url = null)
{
return parent::getReqUrl($url ?? FuConfig::MICROPAY_URL);
}
/**
* 处理扫码支付的返回值
* @param array $ret
* @return array|mixed
* @throws \Payment\Common\PayException
*/
protected function retData(array $ret)
{
$back = new BackBarChargeData($this->config, $ret);
$backData = $back->getData();
return $backData;
}
}
<?php
namespace Payment\Charge\Fu;
use Payment\Common\Fu\Data\Cancel\CloseData;
use Payment\Common\Fu\FuBaseStrategy;
use Payment\Common\FuConfig;
/**
* Class FuClose
* @package Payment\Charge\Fu
*/
class FuClose extends FuBaseStrategy
{
public function getBuildDataClass()
{
return CloseData::class;
}
protected function getReqUrl($url = null)
{
return parent::getReqUrl($url ?? FuConfig::CLOSE_URL);
}
/**
* retData
* @param array $data
* @return array|mixed
*/
protected function retData(array $data)
{
$backData = [
'order_type' => $data['order_type'] ?? '', //订单类型
'order_no' => $data['mchnt_order_no'] ?? '', //商户订单号, 商户系统内部的订单号
];
return $backData;
}
}
<?php
namespace Payment\Charge\Fu;
use Payment\Common\Fu\Data\BackScanChargeData;
use Payment\Common\Fu\Data\Charge\ScanChargeData;
use Payment\Common\Fu\FuBaseStrategy;
use Payment\Common\FuConfig;
/**
* Class FuScanCharge
* @package Payment\Charge\Fu
*/
class FuScanCharge extends FuBaseStrategy
{
public function getBuildDataClass()
{
return ScanChargeData::class;
}
protected function getReqUrl($url = null)
{
return parent::getReqUrl($url ?? FuConfig::SCANPAY_URL);
}
/**
* 处理扫码支付的返回值
* @param array $ret
* @return array|mixed
* @throws \Payment\Common\PayException
*/
protected function retData(array $ret)
{
$back = new BackScanChargeData($this->config, $ret);
$backData = $back->getData();
return $backData;
}
}
<?php
namespace Payment\Charge\Hsq;
use Payment\Common\Hsq\Data\BackPubChargeData;
use Payment\Common\Hsq\Data\Charge\PubChargeData;
use Payment\Common\Hsq\HsqBaseStrategy;
use Payment\Common\HsqConfig;
/**
* Class FuPubCharge
* @package Payment\Charge\Fu
*/
class HsqPubCharge extends HsqBaseStrategy
{
public function getBuildDataClass()
{
$this->config->method = HsqConfig::UNIFIED_URL;
return PubChargeData::class;
}
protected function getReqUrl($url = null)
{
return parent::getReqUrl($url);
}
/**
* 处理支付的返回值。直接返回与微信文档对应的字段
* @param array $ret
*
* @return array $data 包含以下键
*
* ```php
* $data = [
* 'appId' => '', // 公众号id
* 'package' => '', // 订单详情扩展字符串 统一下单接口返回的prepay_id参数值,提交格式如:prepay_id=***
* 'nonceStr' => '', // 随机字符串
* 'timeStamp' => '', // 时间戳
* 'signType' => '', // 签名算法,暂支持MD5
* 'paySign' => '', // 签名
* ];
* ```
*
* @throws \Payment\Common\PayException
*/
protected function retData(array $ret)
{
$back = new BackPubChargeData($this->config, $ret);
// $back->setSign();
$backData = $back->getData();
// $backData['paySign'] = $backData['sign'];
// 移除sign
unset($backData['sign']);
// 公众号支付返回数组结构
return $backData;
}
}
......@@ -46,6 +46,9 @@ use Payment\Charge\YS\YSScanCharge;
use Payment\Charge\WNFPay\WNFCharge;
use Payment\Charge\YSE\YSEPubCharge;
use Payment\Charge\Hsq\HsqPubCharge;
use Payment\Common\BaseStrategy;
use Payment\Common\PayException;
......@@ -216,8 +219,15 @@ class ChargeContext
case Config::WNF_ALI_APP:
$this->channel = new WNFCharge($config);
break;
//慧收钱
case Config::HSQ_CHANNEL_LITE:
$this->channel = new HsqPubCharge($config);
break;
default:
throw new PayException('当前支持:支付宝、微信、招商一网通、通联支付、米付支付、扫呗支付、富友支付、联拓富、易生支付、微诺付。');
throw new PayException('当前支持:支付宝、微信、招商一网通、通联支付、米付支付、扫呗支付、富友支付、联拓富、易生支付、微诺付、慧收钱。');
}
} catch (PayException $e) {
throw $e;
......
......@@ -67,7 +67,11 @@ class Charge
//微诺付
Config::WNF_WECHAT_LITE,
Config::WNF_ALI_APP
Config::WNF_ALI_APP,
//慧收钱
Config::HSQ_CHANNEL_LITE,
];
/**
......
......@@ -35,6 +35,11 @@ class Notify
Config::YS_CHARGE, //易生
Config::YSE_CHARGE, //银盛
Config::HSQ_CHARGE, //慧收钱
Config::HSQ_TRANSFER, //慧收钱代付
];
/**
......
......@@ -51,6 +51,12 @@ class Query
Config::YSE_QUERY,//易生
Config::WNF_QUERY,//微诺付
Config::HSQ_QUERY, //慧收钱
Config::HSQ_QUERY_REFUND, //慧收钱查询退款
Config::HSQ_QUERY_TRANSFER, //宝付代付交易状态查证接口
];
/**
......
......@@ -42,7 +42,9 @@ class Refund
Config::YSE_REFUND,//银盛支付
Config::WNF_REFUND //微诺付
Config::WNF_REFUND, //微诺付
Config::HSQ_REFUND, //微诺付
];
/**
......
......@@ -25,6 +25,10 @@ class Transfer
'cmb_wallet',// 招行一网通
Config::APPLE_PAY,// Apple Pay
Config::HSQ_TRANSFER, //慧收钱代付交易接口
];
/**
......@@ -63,7 +67,9 @@ class Transfer
try {
$instance = self::getInstance($channel, $config);
$ret = $instance->transfer($metadata);
} catch (PayException $e) {
throw $e;
}
......
......@@ -69,6 +69,11 @@ abstract class BaseData
$this->channel = Config::SW_T_PAY;
}elseif ($config instanceof WnfConfig) {
$this->channel = Config::WNF_PAY;
}elseif ($config instanceof HsqConfig) {
$this->channel = Config::HSQ_PAY;
}elseif ($config instanceof HsqTransConfig) {
$this->channel = Config::BAOFOO_PAY;
$tmp = $reqData;unset($reqData);$reqData['reqData'] = $tmp;
}
$this->data = array_merge($config->toArray(), $reqData);//配置信息合并
try {
......@@ -128,6 +133,7 @@ abstract class BaseData
}
$data = $this->retData;
}
switch ($this->channel) {
case Config::TL_PAY:
$this->retData['sign'] = ArrayUtil::SignArray($data, $this->md5Key); //签名
......@@ -181,6 +187,12 @@ abstract class BaseData
$signStr = ArrayUtil::createLinkstring($values);
$this->makeSign($signStr);
break;
case Config::HSQ_PAY:
$this->retData['sign'] = $this->makeSign(ArrayUtil::createLinkstring($data));
break;
case Config::BAOFOO_PAY:
$this->retData['data_content'] = $this->makeSign($data['data_content']);
break;
default:
$values = ArrayUtil::removeKeys($data, ['sign']);
$values = ArrayUtil::arraySort($values);
......
......@@ -27,5 +27,6 @@ abstract class ChargeBaseData extends FuBaseData
// 检查商品名称
if (empty($this->subject)) throw new PayException('必须提供商品名称');
}
}
......@@ -51,6 +51,8 @@ final class FuConfig extends ConfigInterface
public $privateKey; //私钥
public $spbillCreateIp;
/**
* FuConfig constructor.
* @param array $config
......
<?php
namespace Payment\Common\Fu\Data;
/**
* Class BackBarChargeData
* @package Payment\Common\Fu\Data
*/
class BackBarChargeData extends FuBaseData
{
public function getData()
{
$this->retData = [
'order_no' => $this->reserved_mchnt_order_no, //商户订单号
'out_order_no' => $this->reserved_fy_order_no, //富友订单号
'order_type' => $this->order_type, //订单类型
'amount' => $this->total_amount, //订单金额
'user_id' => $this->buyer_id ?? '', //用户在商户的id
'buyer_id' => $this->reserved_buyer_logon_id ?? '', //买家在渠道登录账号
'transaction_id' => $this->transaction_id,
'channel_order_id' => $this->reserved_channel_order_id, //条码流水号,用户账单二维码对应的流水
'time_end' => empty($this->reserved_txn_fin_ts) ? '' : date('Y-m-d H:i:s', strtotime($this->reserved_txn_fin_ts)), //用户支付时间
'bank_type' => $this->reserved_bank_type ?? '', //付款方式
'return_param' => $this->addn_inf ?? '', //附加数据
];
return parent::getData();
}
protected function buildData()
{
}
protected function checkDataParam()
{
}
}
<?php
namespace Payment\Common\Hsq\Data;
use Payment\Common\PayException;
/**
* Class BackPubChargeData
* @package Payment\Common\Fu\Data
*/
class BackPubChargeData extends HsqBaseData
{
public function getData()
{
$data = [];
if(!empty($this->result))
{
$result = json_decode($this->result,true);
// error => Array
// (
// [orderStatus] => FAIL
// [respCode] => 200102
// [respMsg] => 用户ID不能为空
// )
// success => Array
// (
// [channelOrderNo] => 23042623411110491231100567786529
// [orderAmt] => 1
// [orderStatus] => PROCESSING
// [payType] => WECHAT_APPLET
// [qrCode] => {"appId":"wxb63c89abb9243ad0","timeStamp":"1682505329","nonceStr":"9143196887f84ee4a6c62d83f42d844e","package":"prepay_id=wx2618352949503409354c827c2915ab0000","signType":"RSA","paySign":"qDp85A9fHWjLGFpaqmMoRifO9ZHbH6Kfc8X6jxaZ4EKz+OMumFaXMUlAG6tWWl1T6o4dMw35d0O8YvCWseK2V4yXHW0jxcf/0SJ95HD2sPJHtmFeaw7NQGv2jMdAKngewr0pLK9n+EVyNGwfZyCZbg7hzlPK80zD7Sb7/fnaoK0cl5uMwXqOEsE9w1lW4vGUSHEnV/W/R3O/r070ipSYLNG0DXuuisFJIDQexZgV6vbRHs4RyTeOzA7gufWt2ABAGrwcqAVjASdkNx3WPHsNVHCr44YiU6o5C737vn/nqU4d4Clxh+NdK4oFxawbM8McM2UCi0/771hr5w66W35c4A=="}
// [respCode] => 100201
// [respMsg] => 交易处理中,请稍后查询
// [tradeNo] => 25000020230426234103D00000800098
// [transNo] => WechatPay20230426234103
// )
if(!empty($result['qrCode']))
{
$qrCode = json_decode($result['qrCode'],true);
switch ($result['payType'])
{
case 'WECHAT_APPLET': //微信
$data = $qrCode;
break;
case 'ALI_APPLET': //支付宝
$data = [];
break;
default:
}
}
}
$this->retData['package'] = $data;
$this->retData['other'] = [
'channelOrderNo' => $result['channelOrderNo'] ?: '',
'tradeNo' => $result['tradeNo'] ?: '',
'transNo' => $result['transNo'] ?: '',
];
return parent::getData();
}
protected function buildData()
{
}
protected function checkDataParam()
{
}
}
<?php
namespace Payment\Common\Fu\Data;
/**
* Class BackScanChargeData
* @package Payment\Common\Fu\Data
*/
class BackScanChargeData extends FuBaseData
{
public function getData()
{
$data = [
'qrcode' => $this->qr_code ?? '',
'session_id' => $this->session_id
];
$this->retData['package'] = $data;
$this->retData['other'] = [
'out_trade_no' => $this->reserved_fy_order_no ?: '',
'channel_trade_no' => $this->reserved_channel_order_id ?: '',
'attach' => $this->reserved_addn_inf ?: ''
];
return parent::getData();
}
protected function buildData()
{
}
protected function checkDataParam()
{
}
}
<?php
namespace Payment\Common\Fu\Data\Cancel;
use Payment\Common\Fu\Data\FuBaseData;
use Payment\Common\PayException;
/**
* Class CancelData
* @package Payment\Common\Fu\Data\Cancel
*/
class CancelData extends FuBaseData
{
protected function checkDataParam()
{
if (empty($this->order_no) || mb_strlen($this->order_no) > 30) throw new PayException('商户系统订单号不能为空且长度不能超过30位');
if (empty($this->refund_no) || mb_strlen($this->refund_no) > 30) throw new PayException('商户系统撤销单号不能为空且长度不能超过30位');
$tradeType = $this->order_type = $this->trade_type ?? ($this->order_type ?? '');
if (empty($tradeType)) throw new PayException('订单类型有误(支持WECHAT、ALIPAY,条码支付)');
}
protected function buildData()
{
$signData = [
'version' => $this->version,
'ins_cd' => $this->institutionId, //机构号,接入机构在富友的唯一代码
'mchnt_cd' => $this->merchantId, //商户号, 富友分配给二级商户的商户号
'term_id' => $this->terminalId ?? '88888888', //终端号(没有真实终端号统一填88888888)
'random_str' => $this->randomStr, //随机字符串
'mchnt_order_no' => $this->order_no, //商户订单号, 商户系统内部的订单号(5到30个字符、只能包含字母数字,区分大小写)
'order_type' => $this->order_type, //订单类型:ALIPAY、WECHAT
'cancel_order_no' => $this->refund_no, //商户撤销单号
'operator_id' => $this->operator_id ?? '', //操作员
];
if (!empty($this->reserved_fy_term_id)) $signData['reserved_fy_term_id'] = $this->reserved_fy_term_id; //富友终端号(非富友终端请勿填写)
// foreach ($signData as $key => $value) if (false !== strpos($key, 'reserved_') && empty($value)) unset($signData[$key]);
$this->retData = $signData;
}
}
<?php
namespace Payment\Common\Fu\Data\Cancel;
use Payment\Common\Fu\Data\FuBaseData;
use Payment\Common\PayException;
/**
* Class CloseData
* @package Payment\Common\Fu\Data\Cancel
*/
class CloseData extends FuBaseData
{
protected function checkDataParam()
{
if (empty($this->order_no) || mb_strlen($this->order_no) > 30) throw new PayException('商户系统订单号不能为空且长度不能超过30位');
$tradeType = $this->order_type = $this->trade_type ?? ($this->order_type ?? '');
if (empty($tradeType)) throw new PayException('订单类型有误(支持WECHAT、WXAPP、WXH5、ALIPAY)');
}
protected function buildData()
{
$signData = [
'version' => $this->version,
'ins_cd' => $this->institutionId, //机构号,接入机构在富友的唯一代码
'mchnt_cd' => $this->merchantId, //商户号, 富友分配给二级商户的商户号
'term_id' => $this->terminalId ?? '88888888', //终端号(没有真实终端号统一填88888888)
'random_str' => $this->randomStr, //随机字符串
'mchnt_order_no' => $this->order_no, //商户订单号, 商户系统内部的订单号
'order_type' => $this->order_type, //订单类型:WECHAT(统一下单、公众号、小程序),WXAPP(微信 app),WXH5(微信 h5),ALIPAY(统一下单,服务窗)
'sub_appid' => $this->sub_appid ?? '', //子商户公众号id, 子商户配置多个公众号时必填
];
$this->retData = $signData;
}
}
<?php
namespace Payment\Common\Fu\Data\Charge;
use Payment\Common\PayException;
/**
* 条码支付
*
* Class BarChargeData
*
* @property string $order_no 商户订单号
* @property int $amount 订单总金额
* @property string $auth_code 扫码支付授权码,设备读取用户的条码或者二维码信息
* @property string $order_type 订单类型:WECHAT、ALIPAY、UNIONPAY、BESTPAY
*
* @package Payment\Common\Fu\Data\Charge
*/
class BarChargeData extends ChargeBaseData
{
/**
* checkDataParam
* @return mixed|void
* @throws PayException
*/
protected function checkDataParam()
{
parent::checkDataParam();
$tradeType = $this->order_type = $this->trade_type ?? ($this->order_type ?? '');
if (empty($tradeType)) throw new PayException('订单类型有误(支持WECHAT、ALIPAY、UNIONPAY、BESTPAY)');
$clientIp = $this->client_ip;
if (empty($clientIp)) $this->client_ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1';
}
/**
* 构建用于支付的签名相关数据
* @return array|void
*/
protected function buildData()
{
$signData = [
'version' => $this->version,
'ins_cd' => $this->institutionId, //机构号,接入机构在富友的唯一代码
'mchnt_cd' => $this->merchantId, //商户号, 富友分配给二级商户的商户号
'term_id' => $this->terminalId ?? '88888888', //终端号(没有真实终端号统一填88888888)
'random_str' => $this->randomStr, //随机字符串
'order_type' => $this->order_type, //订单类型:ALIPAY、WECHAT、UNIONPAY(银联二维码)
'goods_des' => $this->subject, //商品描述, 商品或支付单简要描述
'goods_detail' => $this->body ?? '', //单品优惠功能字段(填错影响交易)
'goods_tag' => $this->goods_tag ?? '', //商品标记
'addn_inf' => $this->attach ?? '', //附加数据
'mchnt_order_no' => $this->order_no, //商户订单号, 商户系统内部的订单号(5到30个字符、只能包含字母数字,区分大小写)
'curr_type' => $this->curr_type ?? 'CNY', //货币类型,默认人民币:CNY
'order_amt' => intval($this->amount), //总金额, 订单总金额,单位为分
'term_ip' => $this->client_ip ?? '127.0.0.1', //终端IP
'txn_begin_ts' => date('YmdHis', $this->startTime ?? time()), //交易起始时间, 订单生成时间,格式为yyyyMMddHHmmss
'auth_code' => $this->auth_code, //扫码支付授权码,设备读取用户的条码或者二维码信息
'sence' => $this->sence ?? 1, //支付场景,默认1(1:条码支付,2:声波支付)
'reserved_sub_appid' => '', //$this->subAppid ?? ($this->sub_appid ?? ''), //子商户公众号id,微信交易为商户的appid(小程序,公众号必填)
'reserved_expire_minute' => intval($this->reserved_expire_minute ?? 0), //交易关闭时间,如不设置默认为0,单位:分钟,最大值为1440
'reserved_limit_pay' => $this->limitPay ?? '', //限制支付,no_credit:不能使用信用卡
'reserved_fy_term_type' => $this->reserved_fy_term_type ?? 0, //富友终端类型
'reserved_fy_term_id' => $this->reserved_fy_term_id ?? '', //富友终端号
'reserved_fy_term_sn' => $this->reserved_fy_term_sn ?? '', //富友序列号
'reserved_txn_bonus' => intval($this->reserved_txn_bonus ?? 0), //积分抵扣金额,单位为分
'reserved_hb_fq_num' => intval($this->reserved_hb_fq_num ?? 0), //花呗分期期数:仅支持3、6、12
'reserved_hb_fq_seller_percent' => intval($this->reserved_hb_fq_seller_percent ?? 0), //花呗分期商家手续费比例,目前仅支持用户出资,如需使用,请填写0
'reserved_device_info' => $this->reserved_device_info ?? '' //设备信息,托传给微信。用于单品券核销
];
foreach ($signData as $key => $value) if (false !== strpos($key, 'reserved_') && empty($value)) unset($signData[$key]);
$this->retData = $signData;
}
}
<?php
namespace Payment\Common\Hsq\Data\Charge;
use Payment\Common\Hsq\Data\HsqBaseData;
use Payment\Common\PayException;
use Payment\Config;
/**
* Class ChargeBaseData
* @package Payment\Common\Fu\Data\Charge
*/
abstract class ChargeBaseData extends HsqBaseData
{
/**
* 检查传入的支付信息是否正确
*/
protected function checkDataParam()
{
// 检查订单号是否合法
if (empty($this->transNo) || mb_strlen($this->transNo) > 64) throw new PayException('商户系统订单号不能为空且长度不能超过64位');
// 检查金额不能低于0.01
if ($this->orderAmt < bcmul(Config::PAY_MIN_FEE, 100)) throw new PayException('支付金额不能低于 ' . Config::PAY_MIN_FEE . ' 元');
// 检查商品名称
if (empty($this->goodsInfo)) throw new PayException('必须提供商品说明');
}
}
<?php
namespace Payment\Common\Hsq\Data\Charge;
use Payment\Common\PayException;
/**
* Class PubChargeData
* @package Payment\Common\Hsq\Data\Charge
*/
class PubChargeData extends ChargeBaseData
{
/**
* checkDataParam
* @return mixed|void
* @throws PayException
*/
protected function checkDataParam()
{
parent::checkDataParam();
$tradeType = $this->payType;
if (empty($tradeType)) throw new PayException('订单类型有误(支持WECHAT_APPLET、ALI_APPLET)');
$openid = $this->openid;
if (empty($openid)) throw new PayException('未获取到用户openid');
$spbillCreateIp = $this->spbillCreateIp;
if (empty($spbillCreateIp)) {
$this->spbillCreateIp = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1';
}
}
/**
* 构建用于支付的签名相关数据
* @return array|void
*/
protected function buildData()
{
$memo = [
/* Memo参数域 begin */
'openid' => $this->openid, //用户在商户appid下的唯一标识。下单前需获取到用户的Openid。
'appid' => $this->subAppid, //微信公众号APPID
'spbillCreateIp' => $this->spbillCreateIp ?? '127.0.0.1', //终端用户IP
'longitude' => $this->longitude, //经度
'latitude' => $this->latitude, //纬度
/* Memo参数域 end */
];
$signContent = [
/* 业务请求参数 begin */
'transNo' => $this->transNo, //商户订单号
'payType' => $this->payType, //支付类型
'orderAmt' => intval($this->orderAmt), //交易金额, 交易金额,单位为:分
'goodsInfo' => $this->goodsInfo, //商品信息
'returnUrl' => $this->returnUrl , //后端通知地址, 用户支付完成后,慧收钱服务器主动通知商户服务器里指定地址
'requestDate' => $this->requestDate, //请求时间
'memo' => json_encode($memo,JSON_UNESCAPED_UNICODE),
/* 业务请求参数 end */
];
$signData = [
/* 公共请求参数 begin */
'method' => $this->method,//方法名
'version' => $this->version, //版本
'format' => $this->format, //请求格式
'merchantNo' => $this->merchantNo, //商户号
'signType' => $this->signType, //加密类型
'signContent' => json_encode($signContent,JSON_UNESCAPED_UNICODE),
'key' => $this->key,
/* 公共请求参数 end */
];
$this->retData = $signData;
}
}
<?php
namespace Payment\Common\Fu\Data\Charge;
use Payment\Common\PayException;
/**
* Class ScanChargeData
* @package Payment\Common\Fu\Data\Charge
*/
class ScanChargeData extends ChargeBaseData
{
/**
* checkDataParam
* @return mixed|void
* @throws PayException
*/
protected function checkDataParam()
{
parent::checkDataParam();
$tradeType = $this->order_type = $this->trade_type ?? ($this->order_type ?? '');
if (empty($tradeType)) throw new PayException('订单类型有误(支持WECHAT、ALIPAY、UNIONPAY)');
// $openid = $this->openid;
// if (empty($openid)) throw new PayException('用户标识有误');
$clientIp = $this->client_ip;
if (empty($clientIp)) $this->client_ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1';
}
/**
* 构建用于支付的签名相关数据
* @return array|void
*/
protected function buildData()
{
$signData = [
'version' => $this->version,
'ins_cd' => $this->institutionId, //机构号,接入机构在富友的唯一代码
'mchnt_cd' => $this->merchantId, //商户号, 富友分配给二级商户的商户号
'term_id' => $this->terminalId ?? '88888888', //终端号(没有真实终端号统一填88888888)
'random_str' => $this->randomStr, //随机字符串
'order_type' => $this->order_type, //订单类型:ALIPAY、WECHAT、UNIONPAY(银联二维码)
'goods_des' => $this->subject, //商品描述, 商品或支付单简要描述
'goods_detail' => $this->body ?? '', //单品优惠功能字段(填错影响交易)
'goods_tag' => $this->goods_tag ?? '', //商品标记
'addn_inf' => $this->attach ?? '', //附加数据
'mchnt_order_no' => $this->order_no, //商户订单号, 商户系统内部的订单号(5到30个字符、只能包含字母数字,区分大小写)
'curr_type' => $this->curr_type ?? 'CNY', //货币类型,默认人民币:CNY
'order_amt' => intval($this->amount), //总金额, 订单总金额,单位为分
'term_ip' => $this->client_ip ?? '127.0.0.1', //终端IP
'txn_begin_ts' => date('YmdHis', $this->startTime ?? time()), //交易起始时间, 订单生成时间,格式为yyyyMMddHHmmss
'notify_url' => $this->notifyUrl ?? $this->notify_url, //通知地址, 接收富友异步通知回调地址,通知url必须为直接可访问的url,不能携带参数
// 'limit_pay' => $this->limitPay ?? '', //限制支付,no_credit:不能使用信用卡
// 'openid' => '', //用户标识
// 'sub_openid' => $this->openid ?? $this->sub_openid, //子商户用户标识,支付宝服务窗为用户buyer_id(此场景必填)微信公众号为用户的openid(小程序,公众号,服务窗必填)
// 'sub_appid' => $this->subAppid ?? ($this->sub_appid ?? ''), //子商户公众号id,微信交易为商户的appid(小程序,公众号必填)
'reserved_sub_appid' => '', //$this->subAppid ?? ($this->sub_appid ?? ''), //子商户公众号id,微信交易为商户的appid(小程序,公众号必填)
'reserved_expire_minute' => intval($this->reserved_expire_minute ?? 0), //交易关闭时间,如不设置默认为0,单位:分钟,最大值为1440
'reserved_limit_pay' => $this->limitPay ?? '', //限制支付,no_credit:不能使用信用卡
'reserved_fy_term_type' => $this->reserved_fy_term_type ?? 0, //富友终端类型
'reserved_fy_term_id' => $this->reserved_fy_term_id ?? '', //富友终端号
'reserved_fy_term_sn' => $this->reserved_fy_term_sn ?? '', //富友序列号
'reserved_txn_bonus' => intval($this->reserved_txn_bonus ?? 0), //积分抵扣金额,单位为分
'reserved_hb_fq_num' => intval($this->reserved_hb_fq_num ?? 0), //花呗分期期数:仅支持3、6、12
'reserved_hb_fq_seller_percent' => intval($this->reserved_hb_fq_seller_percent ?? 0), //花呗分期商家手续费比例,目前仅支持用户出资,如需使用,请填写0
'reserved_device_info' => $this->reserved_device_info ?? '' //设备信息,托传给微信。用于单品券核销
];
foreach ($signData as $key => $value) if (false !== strpos($key, 'reserved_') && empty($value)) unset($signData[$key]);
$this->retData = $signData;
}
}
<?php
namespace Payment\Common\Hsq\Data;
use Payment\Common\BaseData;
use Payment\Common\PayException;
/**
* Class FuBaseData
* @package Payment\Common\Hsq\Data
*/
abstract class HsqBaseData extends BaseData
{
/**
* 签名算法实现
* @param string $signStr
* @return string
* @throws PayException
*/
protected function makeSign($signStr)
{
return $this->sign($signStr);
}
/**
* 签名
* @param $signStr
* @return string
* @throws PayException
*/
private function sign($signStr)
{
if (empty($this->privateKey)) throw new PayException('Private key does not exist');
if(is_file($this->privateKey))
{
$privateKey = file_get_contents($this->privateKey);
$private_key = array();
openssl_pkcs12_read($privateKey, $private_key, $this->private_key_pass);
$privateKey = $private_key['pkey'];
}
else
{
$privateKey = $this->privateKey;
}
if (empty($privateKey)) throw new PayException('Private key error');
openssl_sign($signStr, $sign, $privateKey, OPENSSL_ALGO_SHA256);
return bin2hex($sign);
}
}
<?php
namespace Payment\Common\Hsq\Data;
use Payment\Common\BaseData;
use Payment\Common\PayException;
use Payment\Utils\BaoFooRsaUtil;
/**
* Class FuBaseData
* @package Payment\Common\Hsq\Data
*/
abstract class HsqTransBaseData extends BaseData
{
/**
* 签名算法实现
* @param string $signStr
* @return string
* @throws PayException
*/
protected function makeSign($signStr)
{
return $this->sign($signStr);
}
/**
* 签名
* @param $signStr
* @return string
* @throws PayException
*/
private function sign($signStr)
{
// 私钥加密
$encrypted = BaoFooRsaUtil::encryptByPFXFile($signStr, $this->privateKey, $this->private_key_pass);
return $encrypted;
}
}
<?php
namespace Payment\Common\Hsq\Data\Query;
use Payment\Common\PayException;
use Payment\Common\Hsq\Data\HsqBaseData;
/**
* 交易查询(支持3日内所有交易查询)
*
* Class ChargeQueryData
*
* @property string $order_no 商户系统订单号
* @property string $order_type 订单类型:ALIPAY(统一下单、条码支付、服务窗支付),WECHAT(统一下单、条码支付、公众号支付),UNIONPAY,BESTPAY(翼支付)
*
* @package Payment\Common\Fu\Data\Query
*/
class ChargeQueryData extends HsqBaseData
{
protected function checkDataParam()
{
if (empty($this->transNo) || mb_strlen($this->transNo) > 30) throw new PayException('商户订单号不能为空且长度不能超过30位');
}
protected function buildData()
{
$signContent = [
/* 业务请求参数 begin */
'transNo' => $this->transNo, //商户订单号
'queryType' => $this->queryType, //查询类型
/* 业务请求参数 end */
];
$signData = [
/* 公共请求参数 begin */
'method' => $this->method,//方法名
'version' => $this->version, //版本
'format' => $this->format, //请求格式
'merchantNo' => $this->merchantNo, //商户号
'signType' => $this->signType, //加密类型
'signContent' => json_encode($signContent,JSON_UNESCAPED_UNICODE),
'key' => $this->key,
/* 公共请求参数 end */
];
$this->retData = $signData;
}
}
\ No newline at end of file
<?php
namespace Payment\Common\Hsq\Data\Query;
use Payment\Common\PayException;
use Payment\Common\Hsq\Data\HsqBaseData;
/**
* 退款查询(支持3日内所有退款交易查询)
*
* Class ChargeQueryData
*
* @property string $order_no 商户系统订单号
* @property string $refund_no 商户系统退款单号
* @property string $order_type 订单类型:ALIPAY(统一下单、条码支付、服务窗支付),WECHAT(统一下单、条码支付、公众号支付),UNIONPAY,BESTPAY(翼支付)
*
* @package Payment\Common\Fu\Data\Query
*/
class RefundQueryData extends HsqBaseData
{
protected function checkDataParam()
{
if (empty($this->transNo) || mb_strlen($this->transNo) > 30) throw new PayException('商户系统订单号不能为空且长度不能超过30位');
// if (empty($this->refund_no) || mb_strlen($this->refund_no) > 30) throw new PayException('商户系统退款单号不能为空且长度不能超过30位');
// $tradeType = $this->order_type = $this->trade_type ?? ($this->order_type ?? '');
// if (empty($tradeType)) throw new PayException('订单类型有误(支持WECHAT、ALIPAY、UNIONPAY、BESTPAY)');
}
protected function buildData()
{
$signData = [
'version' => $this->version,
'ins_cd' => $this->institutionId, //机构号,接入机构在富友的唯一代码
'mchnt_cd' => $this->merchantId, //商户号, 富友分配给二级商户的商户号
'term_id' => $this->terminalId ?? '88888888', //终端号(没有真实终端号统一填88888888)
'random_str' => $this->randomStr, //随机字符串
'refund_order_no' => $this->refund_no, //商户退款单号, 商户系统内部的退款单号(5到30个字符、只能包含字母数字,区分大小写)
// 'order_type' => $this->order_type, //订单类型:ALIPAY(统一下单、条码支付、服务窗支付),WECHAT(统一下单、条码支付、公众号支付),UNIONPAY,BESTPAY(翼支付)
];
$this->retData = $signData;
}
}
\ No newline at end of file
<?php
namespace Payment\Common\Hsq\Data;
use Payment\Common\PayException;
/**
* 退款
* Class RefundData
* @package Payment\Common\Hsq\Data
*/
class RefundData extends HsqBaseData
{
protected function checkDataParam()
{
if (empty($this->transNo) || mb_strlen($this->transNo) > 30) throw new PayException('商户系统退款单号不能为空且长度不能超过30位');
if (empty($this->origTransNo) || mb_strlen($this->origTransNo) > 30) throw new PayException('原商户系统订单号不能为空且长度不能超过30位');
$totalFee = intval($this->origOrderAmt ?? 0); //订单总金额
$refundFee = intval($this->orderAmt ?? 0); //退款总金额
if (empty($totalFee) || empty($refundFee)) throw new PayException('订单总金额或退款金额有误');
if (bccomp($refundFee, $totalFee) === 1) throw new PayException('退款金额不能大于订单总金额');
}
protected function buildData()
{
$signData = [
'version' => $this->version,
'ins_cd' => $this->institutionId, //机构号,接入机构在富友的唯一代码
'mchnt_cd' => $this->merchantId, //商户号, 富友分配给二级商户的商户号
'term_id' => $this->terminalId ?? '88888888', //终端号(没有真实终端号统一填88888888)
'random_str' => $this->randomStr, //随机字符串
'mchnt_order_no' => $this->order_no, //商户订单号, 商户系统内部的订单号(5到30个字符、只能包含字母数字,区分大小写)
'order_type' => $this->order_type, //订单类型:ALIPAY(统一下单、条码支付、服务窗支付),WECHAT(统一下单、条码支付、公众号支付),UNIONPAY,BESTPAY(翼支付)
'refund_order_no' => $this->refund_no, //商户撤销单号
'total_amt' => $this->total_fee, //订单总金额
'refund_amt' => $this->refund_fee, //退款总金额
'operator_id' => $this->operator_id ?? '', //操作员
];
if (!empty($this->reserved_fy_term_id)) $signData['reserved_fy_term_id'] = $this->reserved_fy_term_id; //富友终端号
if (!empty($this->reserved_origi_dt)) $signData['reserved_origi_dt'] = $this->trade_date; //原交易日期( yyyyMMdd )!该值必定等于reserved_fy_settle_dt(富友接收交易时间。理论和合作方下单时间一致。微量夸日交易会不一致)。不填该值支持30天内的交易进行退款。填写该值,支持90天
$this->retData = $signData;
}
}
\ No newline at end of file
<?php
/**
*
* @createTime: 2016-08-04 09:42
* @description:
*/
namespace Payment\Common\Hsq\Data;
use Payment\Common\PayException;
use Payment\Utils\ArrayUtil;
/**
* Class TransferData
* @package Payment\Common\Hsq\Data
*
*/
class TransferData extends HsqTransBaseData
{
/**
* 检查相关参数是否设置
*
*/
protected function checkDataParam()
{
$reqData = $this->data['reqData'];
if (empty($reqData)) {
throw new PayException('必须提供参数');
}
foreach($reqData as $key => $val){
if (empty($val['trans_no'])) {
throw new PayException('必须提供商户订单号');
}
// 微信使用的单位位分.此处进行转化
if (empty($val['trans_money']) || $val['trans_money'] < 0){
throw new PayException('必须提供转账金额');
}
if (empty($val['to_acc_name'])) {
throw new PayException('必须提供收款人姓名');
}
if (empty($val['to_acc_no'])) {
throw new PayException('必须提供收款人银行帐号');
}
if (empty($val['to_bank_name'])) {
throw new PayException('必须提供收款人银行名称');
}
// if (empty($val['to_pro_name'])) {
// throw new PayException('必须提供收款人开户行省名');
// }
// if (empty($val['to_city_name'])) {
// throw new PayException('必须提供收款人开户行市名');
// }
// if (empty($val['to_acc_dept'])) {
// throw new PayException('必须提供收款人开户行机构名');
// }
// if (empty($val['trans_card_id'])) {
// throw new PayException('必须提供银行卡身份证件号码');
// }
}
}
protected function buildData()
{
$reqData = $this->data['reqData'];
$data = ['trans_content' => ['trans_reqDatas' => [['trans_reqData' => $reqData]]]];
$data_content = str_replace("\\\"",'"',json_encode($data,JSON_UNESCAPED_UNICODE));
$this->retData = [
'member_id' => $this->member_id, //商户号
'terminal_id' => $this->terminal_id, //终端号
'data_type' => $this->data_type, //数据类型
'version' => $this->version, //版本号
//请求报文
'data_content' => $data_content,
];
$this->retData = ArrayUtil::paraFilter($this->retData);
}
}
<?php
/**
*
* @createTime: 2016-08-04 09:42
* @description:
*/
namespace Payment\Common\Hsq\Data;
use Payment\Common\PayException;
use Payment\Utils\ArrayUtil;
/**
* Class TransferData
* @package Payment\Common\Hsq\Data
*
*/
class TransferQueryData extends HsqTransBaseData
{
/**
* 检查相关参数是否设置
*
*/
protected function checkDataParam()
{
$reqData = $this->data['reqData'];
if (empty($reqData)) {
throw new PayException('必须提供参数');
}
foreach($reqData as $key => $val){
if (empty($val['trans_no'])) {
throw new PayException('必须提供商户订单号');
}
// if (empty($val['trans_batchid'])) {
// throw new PayException('必须提供宝付批次号');
// }
}
}
protected function buildData()
{
$reqData = $this->data['reqData'];
$data = ['trans_content' => ['trans_reqDatas' => [['trans_reqData' => $reqData]]]];
$data_content = str_replace("\\\"",'"',json_encode($data,JSON_UNESCAPED_UNICODE));
$this->retData = [
'member_id' => $this->member_id, //商户号
'terminal_id' => $this->terminal_id, //终端号
'data_type' => $this->data_type, //数据类型
'version' => $this->version, //版本号
//请求报文
'data_content' => $data_content,
];
$this->retData = ArrayUtil::paraFilter($this->retData);
}
}
<?php
namespace Payment\Common\Hsq;
use Payment\Common\BaseData;
use Payment\Common\BaseStrategy;
use Payment\Common\PayException;
use Payment\Common\HsqConfig;
use Payment\Utils\Curl;
use Payment\Utils\DataParser;
abstract class HsqBaseStrategy implements BaseStrategy
{
protected $config;
/**
* 支付数据
* @var BaseData $reqData
*/
protected $reqData;
/**
* FuBaseStrategy constructor.
* @param array $config
* @throws PayException
*/
public function __construct(array $config)
{
/* 设置内部字符编码为 UTF-8 */
// mb_internal_encoding("UTF-8");
try {
$this->config = new HsqConfig($config);
} catch (PayException $e) {
throw $e;
}
}
/**
* 发送请求
* @param array $body
* @return mixed
* @throws PayException
*/
protected function sendReq($body)
{
$url = $this->getReqUrl();
if (is_null($url)) {
throw new PayException('目前不支持该接口。请联系开发者添加');
}
$body = http_build_query($body);
if (empty($body)) throw new PayException('支付数据异常');
$response = $this->curlPost($body, $url);
if ($response['error']) throw new PayException('网络发生错误,请稍后再试curl返回码:' . $response['message']);
$retData = json_decode($response['body'],true);
$result = json_decode($retData['result'],true);
if($result['orderStatus'] == 'FAIL') throw new PayException('支付平台返回错误提示:' . $result['respMsg']);
return $retData;
}
/**
* 请求
* @param $body
* @param $url
* @return array
*/
protected function curlPost($body, $url)
{
$curl = new Curl();
$header = [
'content-type: application/x-www-form-urlencoded'
];
return $curl->set([
'CURLOPT_HEADER' => 0,
'CURLOPT_HTTPHEADER' => $header
])->post($body)->submit($url, false);
}
/**
* 获取请求地址
* @param null $url
* @return string
*/
protected function getReqUrl($url = null)
{
return $url ?? $this->config->base_url;
}
/**
* @param array $data
*
* @throws PayException
* @throws \Exception
* @return array|string
*/
public function handle(array $data)
{
$buildClass = $this->getBuildDataClass();
$this->reqData = new $buildClass($this->config, $data);
$this->reqData->setSign();
$body = $this->reqData->getData();
$ret = $this->sendReq($body);
$flag = $this->verifySign($ret);
if (!$flag) {
throw new PayException('返回数据被篡改。请检查网络是否安全!');
}
return $this->retData($ret);
}
/**
* 处理返回值并返回给客户端
* @param array $ret
* @return mixed
*
*/
protected function retData(array $ret)
{
return $ret;
}
/**
* 签名验证
* @param array $retData
* @return bool
* @throws PayException
*/
protected function verifySign(array $retData)
{
if (empty($this->reqData->key)) throw new PayException('key error');
if (empty($this->reqData->publicKey)) throw new PayException('Public key error');
$key = $this->reqData->key;
$publicKey = $this->reqData->publicKey;
if(is_file($publicKey))
{
$publicKey = openssl_get_publickey(file_get_contents($publicKey));
}
else
{
$publicKey = $this->reqData->publicKey;
}
if (empty($publicKey)) throw new PayException('Public key resource identifier false');
$retSign = $retData['sign'];
$resSignStr = "result=".$retData['result']."&success=true"."&key=".$key;
return openssl_verify($resSignStr,hex2bin($retSign), $publicKey, OPENSSL_ALGO_SHA256);
}
}
<?php
namespace Payment\Common\Hsq;
use Payment\Common\BaseData;
use Payment\Common\BaseStrategy;
use Payment\Common\PayException;
use Payment\Common\HsqTransConfig;
use Payment\Utils\BaoFooRsaUtil;
use Payment\Utils\Curl;
use Payment\Utils\DataParser;
abstract class HsqTransBaseStrategy implements BaseStrategy
{
protected $config;
/**
* 支付数据
* @var BaseData $reqData
*/
protected $reqData;
/**
* FuBaseStrategy constructor.
* @param array $config
* @throws PayException
*/
public function __construct(array $config)
{
/* 设置内部字符编码为 UTF-8 */
// mb_internal_encoding("UTF-8");
try {
$this->config = new HsqTransConfig($config);
} catch (PayException $e) {
throw $e;
}
}
/**
* 发送请求
* @param array $body
* @return mixed
* @throws PayException
*/
protected function sendReq($body)
{
$url = $this->getReqUrl();
if (is_null($url)) {
throw new PayException('目前不支持该接口。请联系开发者添加');
}
$body = http_build_query($body);
if (empty($body)) throw new PayException('支付数据异常');
$response = $this->curlPost($body, $url);
if ($response['error']) throw new PayException('网络发生错误,请稍后再试curl返回码:' . $response['message']);
$retData = $response['body'];
if(count(explode("trans_content",$retData))>1){
$retData = json_decode($retData);
$result = $retData->trans_content->trans_head;
if(!empty($result->return_code)) throw new PayException('支付平台返回错误提示:' . $result->return_msg);
}
return $retData;
}
/**
* 请求
* @param $body
* @param $url
* @return array
*/
protected function curlPost($body, $url)
{
$curl = new Curl();
$header = [
'content-type: application/x-www-form-urlencoded'
];
return $curl->set([
'CURLOPT_HEADER' => 0,
'CURLOPT_HTTPHEADER' => $header,
])->post($body)->submit($url, false);
}
/**
* 获取请求地址
* @param null $url
* @return string
*/
protected function getReqUrl($url = null)
{
return $this->config->base_url . ($url ?? HsqTransConfig::PAY_URL);
}
/**
* @param array $data
*
* @throws PayException
* @throws \Exception
* @return array|string
*/
public function handle(array $data)
{
$buildClass = $this->getBuildDataClass();
$this->reqData = new $buildClass($this->config, $data);
$this->reqData->setSign();
$body = $this->reqData->getData();
$ret = $this->sendReq($body);
$flag = $this->verifySign($ret);
if (!$flag) {
throw new PayException('返回数据被篡改。请检查网络是否安全!');
}
return $this->retData($flag);
}
/**
* 处理返回值并返回给客户端
* @param array $ret
* @return mixed
*
*/
protected function retData(array $ret)
{
return $ret;
}
/**
* 签名验证
* @param array $retData
* @return bool
* @throws PayException
*/
protected function verifySign(string $retData)
{
//解密
$decrypt = BaoFooRsaUtil::decryptByCERFile($retData, $this->reqData->publicKey);
$result = json_decode($decrypt,true);
return $result;
}
}
<?php
namespace Payment\Common;
use Payment\Utils\ArrayUtil;
use Payment\Utils\StrUtil;
final class HsqConfig extends ConfigInterface
{
public const UNIFIED_URL = 'POLYMERIZE_MAIN_SWEPTN'; //小程序下单
public const QUERY_URL = 'POLYMERIZE_QUERY'; //订单查询
public const REFUND_URL = 'POLYMERIZE_REFUND'; //退款申请
public const REFUND_QUERY_URL = 'POLYMERIZE_REFUND_QUERY'; //退款查询
public const QUERY_FILE_URL = 'QUERY_TRADE_FILE'; //对账文件下载API
public $base_url = 'https://api.huishouqian.com/api/acquiring';
public $method; //方法名
public $version = '1.0'; //版本
public $format = 'json'; //请求格式
public $merchantNo; //商户号
public $signType = 'RSA2';
public $payType = 'WECHAT_APPLET'; //交易类型
public $returnUrl; //异步回调地址
public $requestDate; // 交易时间 格式为 yyyyMMddHHmmss
public $privateKey; //私钥
public $private_key_pass; //私钥密码
public $publicKey; //公钥
public $subAppid; //子商户公众号id,微信交易为商户的appid(小程序,公众号必填)
public $key;
/**
* FuConfig constructor.
* @param array $config
* @throws PayException
*/
public function __construct(array $config)
{
try {
$this->initConfig($config);
} catch (PayException $e) {
throw $e;
}
}
/**
* 初始化配置文件参数
* @param array $config
* @throws PayException
*/
/**
* 初始化配置文件参数
* @param array $config
* @throws PayException
*/
private function initConfig(array $config)
{
$config = ArrayUtil::paraFilter($config);
if (key_exists('key', $config) && !empty($config['key'])) {
$this->key = $config['key'];
} else {
throw new PayException('必须提供key');
}
if (key_exists('merchantNo', $config) && !empty($config['merchantNo'])) {
$this->merchantNo = $config['merchantNo'];
} else {
throw new PayException('必须提供商户号');
}
if (key_exists('appid', $config) && !empty($config['appid'])) {
$this->subAppid = $config['appid'];
} else {
throw new PayException('微信公众号APPID');
}
if (key_exists('private_key', $config) && !empty($config['private_key'])) {
$this->privateKey = $config['private_key'];
} else {
throw new PayException('必须提供私钥');
}
if (key_exists('private_key_pass', $config) && !empty($config['private_key_pass'])) {
$this->private_key_pass = $config['private_key_pass'];
} else {
throw new PayException('必须提供私钥密码');
}
if (key_exists('public_key', $config) && !empty($config['public_key'])) {
$this->publicKey = $config['public_key'];
} else {
throw new PayException('必须提供公钥');
}
if (key_exists('returnUrl', $config) && !empty($config['returnUrl'])) {
$this->returnUrl = $config['returnUrl'];
}
if (key_exists('signType', $config) && !empty($config['signType'])) {
$this->signType = $config['signType'];
}
if (key_exists('payType', $config) && !empty($config['payType'])) {
$this->payType = $config['payType'];
}
if (key_exists('request_url', $config) && !empty($config['request_url'])) {
$this->base_url = $config['request_url'];
}
$this->requestDate = date('YmdHis');
}
}
<?php
namespace Payment\Common;
use Payment\Utils\ArrayUtil;
use Payment\Utils\StrUtil;
final class HsqTransConfig extends ConfigInterface
{
public const PAY_URL = '/BF0040001.do'; //代付交易接口
public const QUERY_URL = '/BF0040002.do'; //代付交易状态查证接口
public const REFUND_URL = '/BF0040003.do'; //退款申请
public $base_url = 'https://public.baofoo.com/baofoo-fopay/pay'; //接口地址
public $version = '4.0.0'; //版本
public $data_type = 'json'; //数据类型
public $member_id; //商户号
public $terminal_id; //终端号
public $privateKey; //私钥
public $publicKey; //公钥
public $private_key_pass; //私钥密码
/**
* FuConfig constructor.
* @param array $config
* @throws PayException
*/
public function __construct(array $config)
{
try {
$this->initConfig($config);
} catch (PayException $e) {
throw $e;
}
}
/**
* 初始化配置文件参数
* @param array $config
* @throws PayException
*/
/**
* 初始化配置文件参数
* @param array $config
* @throws PayException
*/
private function initConfig(array $config)
{
$config = ArrayUtil::paraFilter($config);
if (key_exists('member_id', $config) && !empty($config['member_id'])) {
$this->member_id = $config['member_id'];
} else {
throw new PayException('必须提供商户号');
}
if (key_exists('terminal_id', $config) && !empty($config['terminal_id'])) {
$this->terminal_id = $config['terminal_id'];
} else {
throw new PayException('必须提供终端号');
}
if (key_exists('private_key', $config) && !empty($config['private_key'])) {
$this->privateKey = $config['private_key'];
} else {
throw new PayException('必须提供私钥');
}
if (key_exists('private_key_pass', $config) && !empty($config['private_key_pass'])) {
$this->private_key_pass = $config['private_key_pass'];
} else {
throw new PayException('必须提供私钥密码');
}
if (key_exists('public_key', $config) && !empty($config['public_key'])) {
$this->publicKey = $config['public_key'];
} else {
throw new PayException('必须提供公钥');
}
if (key_exists('data_type', $config) && !empty($config['data_type'])) {
$this->data_type = $config['data_type'];
}
if (key_exists('version', $config) && !empty($config['version'])) {
$this->version = $config['version'];
}
if (key_exists('base_url', $config) && !empty($config['base_url'])) {
$this->base_url = $config['base_url'];
}
}
}
......@@ -148,7 +148,7 @@ final class WxConfig extends ConfigInterface
throw new PayException('异步通知的url必须提供.');
}
// 设置交易开始时间 格式为yyyyMMddHHmmss .再次之前一定要设置时区
// 设置交易开始时间 格式为yyyyMMddHHmmss . 再次之前一定要设置时区
$startTime = time();
$this->timeStart = date('YmdHis', $startTime);
......
......@@ -40,6 +40,10 @@ final class Config{
const WNF_PAY = 'wnfpay'; //微诺付
const HSQ_PAY = 'hsqpay'; //慧收钱支付
const BAOFOO_PAY = 'baofoopay'; //宝付代付
//========================= 金额问题设置 =======================//
const PAY_MIN_FEE = '0.01';// 支付的最小金额
......@@ -273,4 +277,29 @@ final class Config{
const WNF_QUERY = 'wnf_query'; //支付查询
const WNF_REFUND = 'wnf_refund'; //支付退款
//========================= 慧收钱相关接口 =======================//
// 支付常量
const HSQ_CHANNEL_LITE = 'hsq_lite'; //小程序支付
const HSQ_CHARGE = 'hsq_charge';// 慧收钱支付-统一下单
// 其他相关常量
const HSQ_QUERY = 'hsq_query'; //查询订单
const HSQ_REFUND = 'hsq_refund'; //退款
const HSQ_QUERY_REFUND = 'hsq_query_refund'; //查询退款
const HSQ_TRANSFER = 'hsq_transfer'; //宝付代付交易
const HSQ_QUERY_TRANSFER = 'hsq_query_transfer'; //宝付代付交易状态查证接口
}
<?php
namespace Payment\Notify;
use Payment\Common\PayException;
use Payment\Common\HsqConfig;
use Payment\Config;
use Payment\Utils\ArrayUtil;
use Payment\Utils\StrUtil;
/**
* Class MiNotify
* 微信回调处理
* @package Payment\Notify
* @anthor yeran
*/
class HsqNotify extends NotifyStrategy
{
/**
* MiNotify constructor.
* @param array $config
* @throws PayException
*/
public function __construct(array $config)
{
parent::__construct($config);
try {
$this->config = new HsqConfig($config);
} catch (PayException $e) {
throw $e;
}
}
/**
* 获取返回的异步通知数据
* @return array|bool
* @author yeran
*/
public function getNotifyData()
{
//支持直接读取input流
$data = $_POST['req'] ?? file_get_contents('php://input');
if(count($data)<1){//如果参数为空,则不进行处理
return false;
}
return $data;
}
/**
* 检查异步通知的数据是否正确
* @param array $data
*
* @author yeran
* @return boolean
*/
public function checkNotifyData(array $data)
{
// 检查返回数据签名是否正确
return $this->verifySign($data);
}
/**
* 检查微信返回的数据是否被篡改过
* @param array $retData
* @return boolean
* @author yeran
*/
protected function verifySign(array $retData)
{
if (empty($this->config->key)) return false;
if (empty($this->config->publicKey)) return false;
$key = $this->config->key;
$publicKey = $this->config->publicKey;
if(is_file($publicKey))
{
$publicKey = openssl_get_publickey(file_get_contents($publicKey));
}
else
{
$publicKey = $this->config->publicKey;
}
if (empty($publicKey)) return false;
$sign = $retData['sign'];
//固定格式拼接后
$signArr = [
'method' => $retData['method'],
'version' => $retData['version'],
'merchantNo' => $retData['merchantNo'],
'signType' => $retData['signType'],
'signContent' => $retData['signContent'],
'key' => $key,
];
$signStr = http_build_query($signArr);
//验签
$result = openssl_verify($signStr,hex2bin($sign), $publicKey, OPENSSL_ALGO_SHA256);
if($result)
{
//验签成功
return true;
}
else{
return false;
}
}
/**
*
* 封装回调函数需要的数据格式
*
* @param array $data
*
* @return array
* @author yeran
*/
protected function getRetData(array $data)
{
if ($this->config->returnRaw) {
$data['channel'] = Config::HSQ_CHARGE;
return $data;
}
return $data;
// $retData = [
// 'cash_fee' => $data['cash_fee'],
// 'fee_type' => $data['fee_type'],
// 'appid' => $data['sub_appid'],
// 'sub_merchant_id' => $data['sub_merchant_id'],
// 'buyer_id' => $data['sub_openid'],
// 'order_no' => $data['out_trade_sn'],//平台
// 'meepay_trade_no' => $data['meepay_trade_no'],//米付
// 'pay_time' => date('Y-m-d H:i:s', $data['pay_time']),// 支付完成时间
// 'amount' => $data['total_amount'],
// 'trade_type' => $data['trade_type'],
// 'transaction_id' => $data['transaction_id'],//微信
// 'trade_state' => strtolower($data['result_code']),
// 'channel' => Config::MI_CHARGE,
// ];
// return $retData;
}
/**
* 处理完后返回的数据格式
* @param bool $flag
* @param string $msg 通知信息,错误原因
* @author yeran
* @return string
*/
protected function replyNotify($flag, $msg = 'OK')
{
// 默认为成功
$return_code ='SUCCESS';
if (!$flag) {
$return_code ='FAIL';
}
return $return_code;
}
}
<?php
namespace Payment\Notify;
use Payment\Common\PayException;
use Payment\Common\HsqTransConfig;
use Payment\Config;
use Payment\Utils\BaoFooRsaUtil;
/**
* Class MiNotify
* 微信回调处理
* @package Payment\Notify
* @anthor yeran
*/
class HsqTransferNotify extends NotifyStrategy
{
/**
* MiNotify constructor.
* @param array $config
* @throws PayException
*/
public function __construct(array $config)
{
parent::__construct($config);
try {
$this->config = new HsqTransConfig($config);
} catch (PayException $e) {
throw $e;
}
}
/**
* 获取返回的异步通知数据
* @return array|bool
* @author yeran
*/
public function getNotifyData()
{
//支持直接读取input流
$data = $_POST['req'] ?? file_get_contents('php://input');
if(empty($data)){//如果参数为空,则不进行处理
return false;
}
return $data;
}
/**
* 检查异步通知的数据是否正确
* @param array $data
*
* @author yeran
* @return boolean
*/
public function checkNotifyData(array $data)
{
// 检查返回数据签名是否正确
return $this->verifySign($data);
}
/**
* 检查微信返回的数据是否被篡改过
* @param array $retData
* @return boolean
* @author yeran
*/
protected function verifySign(array $retData)
{
if (empty($this->config->publicKey)) return false;
$publicKey = $this->config->publicKey;
$retData = $retData['sign'];
//解密
$decrypt = BaoFooRsaUtil::decryptByCERFile($retData, $publicKey);
$result = json_decode($decrypt,true);
print_r($result);die;
if($result)
{
//验签成功
return true;
}
else{
return false;
}
}
/**
*
* 封装回调函数需要的数据格式
*
* @param array $data
*
* @return array
* @author yeran
*/
protected function getRetData(array $data)
{
if ($this->config->returnRaw) {
$data['channel'] = Config::HSQ_CHARGE;
return $data;
}
return $data;
// $retData = [
// 'cash_fee' => $data['cash_fee'],
// 'fee_type' => $data['fee_type'],
// 'appid' => $data['sub_appid'],
// 'sub_merchant_id' => $data['sub_merchant_id'],
// 'buyer_id' => $data['sub_openid'],
// 'order_no' => $data['out_trade_sn'],//平台
// 'meepay_trade_no' => $data['meepay_trade_no'],//米付
// 'pay_time' => date('Y-m-d H:i:s', $data['pay_time']),// 支付完成时间
// 'amount' => $data['total_amount'],
// 'trade_type' => $data['trade_type'],
// 'transaction_id' => $data['transaction_id'],//微信
// 'trade_state' => strtolower($data['result_code']),
// 'channel' => Config::MI_CHARGE,
// ];
// return $retData;
}
/**
* 处理完后返回的数据格式
* @param bool $flag
* @param string $msg 通知信息,错误原因
* @author yeran
* @return string
*/
protected function replyNotify($flag, $msg = 'OK')
{
// 默认为成功
$return_code ='SUCCESS';
if (!$flag) {
$return_code ='FAIL';
}
return $return_code;
}
}
......@@ -46,9 +46,9 @@ abstract class NotifyStrategy
// 检查异步通知返回的数据是否有误
$checkRet = $this->checkNotifyData($notifyData);
if ($checkRet === false) {// 失败,就返回错误
return $this->replyNotify(false, '返回数据验签失败,可能数据被篡改');
}
// if ($checkRet === false) {// 失败,就返回错误
// return $this->replyNotify(false, '返回数据验签失败,可能数据被篡改');
// }
// 回调商户的业务逻辑
$flag = $this->callback($notify, $notifyData);
......@@ -72,11 +72,9 @@ abstract class NotifyStrategy
protected function callback(PayNotifyInterface $notify, array $notifyData)
{
$data = $this->getRetData($notifyData);
if ($data === false) {
return false;
}
return $notify->notifyProcess($data);
}
......
......@@ -21,6 +21,8 @@ use Payment\Notify\WxNotify;
use Payment\Common\PayException;
use Payment\Notify\YSNotify;
use Payment\Notify\YSENotify;
use Payment\Notify\HsqNotify;
use Payment\Notify\HsqTransferNotify;
class NotifyContext
{
......@@ -77,8 +79,15 @@ class NotifyContext
case Config::YSE_CHARGE:
$this->notify = new YSENotify($config);
break;
case Config::HSQ_CHARGE:
$this->notify = new HsqNotify($config);
break;
case Config::HSQ_TRANSFER:
$this->notify = new HsqTransferNotify($config);
break;
default:
throw new PayException('当前仅支持:ALI_CHARGE WX_CHARGE CMB_CHARGE TL_CHARGE MI_CHARGE SW_CHARGE FU_CHARGE');
throw new PayException('当前仅支持:ALI_CHARGE WX_CHARGE CMB_CHARGE TL_CHARGE MI_CHARGE SW_CHARGE FU_CHARGE HSQ_CHARGE ');
}
} catch (PayException $e) {
throw $e;
......
<?php
namespace Payment\Query\Hsq;
use Payment\Common\Hsq\Data\Query\ChargeQueryData;
use Payment\Common\Hsq\HsqBaseStrategy;
use Payment\Common\HsqConfig;
use Payment\Config;
class HsqChargeQuery extends HsqBaseStrategy
{
/**
* 返回查询订单的数据
* @return \Payment\Common\BaseData|string
*/
public function getBuildDataClass()
{
$this->config->method = HsqConfig::QUERY_URL;
return ChargeQueryData::class;
}
/**
* 返回查询url
* @param null $url
* @return string
*/
protected function getReqUrl($url = null)
{
return parent::getReqUrl($url);
}
/**
* retData
* @param array $data
* @return array|mixed
*/
protected function retData(array $data)
{
$backData = json_decode($data['result'],true);
$backData['memo'] = json_decode($backData['memo'],true);
return $backData;
}
}
<?php
namespace Payment\Query\Hsq;
use Payment\Common\Hsq\Data\Query\RefundQueryData;
use Payment\Common\Hsq\HsqBaseStrategy;
use Payment\Common\HsqConfig;
class HsqRefundQuery extends HsqBaseStrategy
{
/**
* 返回查询订单的数据
* @return \Payment\Common\BaseData|string
*/
public function getBuildDataClass()
{
return RefundQueryData::class;
}
/**
* 返回查询url
* @param null $url
* @return string
*/
protected function getReqUrl($url = null)
{
return parent::getReqUrl($url ?? HsqConfig::REFUND_QUERY_URL);
}
/**
* retData
* @param array $data
* @return array|mixed
*/
protected function retData(array $data)
{
$backData = [
'order_type' => $data['order_type'] ?? '', //订单类型
'order_no' => $data['mchnt_order_no'] ?? '', //原交易商户订单号
'refund_no' => $data['cancel_order_no'] ?? '', //商户撤销单号
'out_trade_no' => $data['transaction_id'] ?? '', //渠道交易流水号
'out_refund_no' => $data['refund_id'] ?? '', //渠道撤销流水号
'refund_fee' => $data['reserved_refund_amt'] ?? 0, //退款金额
'other' => $data
];
return $backData;
}
}
<?php
/**
*
* @createTime: 2016-08-04 10:30
* @description:
*/
namespace Payment\Query\Hsq;
use Payment\Common\Hsq\Data\TransferQueryData;
use Payment\Common\Hsq\HsqTransBaseStrategy;
use Payment\Common\HsqTransConfig;
use Payment\Config;
/**
* Class HsqTransferQuery
* @package Payment\Query
*
*/
class HsqTransferQuery extends HsqTransBaseStrategy
{
public function getBuildDataClass()
{
return TransferQueryData::class;
}
/**
* 返回查询url
* @param null $url
* @return string
*/
protected function getReqUrl($url = null)
{
return parent::getReqUrl($url ?? HsqTransConfig::QUERY_URL);
}
/**
* 处理通知的返回数据
* @param array $ret
* @return mixed
*
*/
protected function retData(array $ret)
{
$head = $ret['trans_content']['trans_head'];
$data = $ret['trans_content']['trans_reqDatas'][0]['trans_reqData'];
if($head['return_code'] != '0000')
{
$retData = [
'is_success' => 'F',
'error' => $head['return_msg'],
'channel' => Config::HSQ_QUERY_TRANSFER,
];
}
else
{
$retData = [
'is_success' => 'T',
'response' => [
'datas' => $data,
'channel' => Config::HSQ_QUERY_TRANSFER,
],
];
}
return $retData;
}
}
......@@ -30,6 +30,9 @@ use Payment\Query\Wx\WxTransferQuery;
use Payment\Query\YS\YSChargeQuery;
use Payment\Query\YSE\YSEChargeQuery;
use Payment\Query\WNF\WNFChargeQuery;
use Payment\Query\Hsq\HsqChargeQuery;
use Payment\Query\Hsq\HsqRefundQuery;
use Payment\Query\Hsq\HsqTransferQuery;
class QueryContext
{
......@@ -117,8 +120,17 @@ class QueryContext
case Config::WNF_QUERY://微诺付
$this->query = new WNFChargeQuery($config);
break;
case Config::HSQ_QUERY://慧收钱
$this->query = new HsqChargeQuery($config);
break;
case Config::HSQ_QUERY_REFUND://慧收钱退款查询
$this->query = new HsqRefundQuery($config);
break;
case Config::HSQ_QUERY_TRANSFER: //宝付代付交易状态查证接口
$this->query = new HsqTransferQuery($config);
break;
default:
throw new PayException('当前仅支持:ALI_CHARGE ALI_REFUND WX_CHARGE WX_REFUND WX_TRANSFER WX_PAY_BANK CMB_CHARGE CMB_REFUND TLPAY MI_QUERY SW_QUERY FU_CHARGE FU_REFUND WNF_QUERY');
throw new PayException('当前仅支持:ALI_CHARGE ALI_REFUND WX_CHARGE WX_REFUND WX_TRANSFER WX_PAY_BANK CMB_CHARGE CMB_REFUND TLPAY MI_QUERY SW_QUERY FU_CHARGE FU_REFUND WNF_QUERY HSQ_QUERY HSQ_QUERY_REFUND HSQ_QUERY_TRANSFER ');
}
} catch (PayException $e) {
throw $e;
......
<?php
namespace Payment\Refund;
use Payment\Common\Hsq\Data\RefundData;
use Payment\Common\Hsq\HsqBaseStrategy;
use Payment\Common\HsqConfig;
/**
* 交易退款
*
* 总退款金额不能超过订单总金额
* 目前支持对90天以内的交易进行退款,支持全额或者是多次部分退款
* 如需要30天外交易退款,需传入 reserved_origi_dt 字段,如该字段不传入,则仅支持30内交易进行退款
*
* Class FuRefund
* @package Payment\Refund
*/
class HsqRefund extends HsqBaseStrategy
{
/**
* 返回查询订单的数据
*
*/
public function getBuildDataClass()
{
$this->config->method = HsqConfig::REFUND_URL;
return RefundData::class;
}
/**
* 返回微信查询的url
* @param null $url
* @return string
*/
protected function getReqUrl($url = null)
{
return parent::getReqUrl($url);
}
/**
* retData
* @param array $data
* @return array|mixed
*/
protected function retData(array $data)
{
$backData = [
'order_type' => $data['order_type'] ?? '', //订单类型
'order_no' => $data['mchnt_order_no'] ?? '', //原交易商户订单号
'refund_no' => $data['refund_order_no'] ?? '', //商户退款单号
'out_trade_no' => $data['transaction_id'] ?? '', //渠道交易流水号
'out_refund_no' => $data['refund_id'] ?? '', //渠道撤销流水号
'refund_fee' => $data['reserved_refund_amt'] ?? 0, //退款金额
'other' => $data
];
return $backData;
}
}
......@@ -22,6 +22,7 @@ use Payment\Refund\WNFRefund;
use Payment\Refund\WxRefund;
use Payment\Refund\YSRefund;
use Payment\Refund\YSERefund;
use Payment\Refund\HsqRefund;
class RefundContext
{
......@@ -81,8 +82,11 @@ class RefundContext
case Config::WNF_REFUND:
$this->refund = new WNFRefund($config);
break;
case Config::HSQ_REFUND:
$this->refund = new HsqRefund($config);
break;
default:
throw new PayException('当前仅支持:ALI WEIXIN CMB TL MI SW FU WNF');
throw new PayException('当前仅支持:ALI WEIXIN CMB TL MI SW FU WNF HSQ');
}
} catch (PayException $e) {
throw $e;
......
<?php
/**
*
* @createTime: 2016-07-27 15:43
* @description:
*/
namespace Payment\Trans;
use Payment\Common\Hsq\Data\TransferData;
use Payment\Common\Hsq\HsqTransBaseStrategy;
use Payment\Common\HsqTransConfig;
use Payment\Config;
use Payment\Utils\Curl;
/**
* 微信企业付款接口
* Class WxTransfer
* @package Payment\Trans
*
*/
class HsqTransfer extends HsqTransBaseStrategy
{
public function getBuildDataClass()
{
return TransferData::class;
}
/*
* 返回转款的url
*/
protected function getReqUrl($url = null)
{
return parent::getReqUrl($url ?: HsqTransConfig::PAY_URL);
}
/**
* 转款的返回数据
* @param array $ret
* @return mixed
*/
protected function retData(array $ret)
{
$head = $ret['trans_content']['trans_head'];
$data = $ret['trans_content']['trans_reqDatas'][0]['trans_reqData'];
if($head['return_code'] != '0000')
{
$retData = [
'is_success' => 'F',
'error' => $head['return_msg'],
'channel' => Config::HSQ_TRANSFER,
];
}
else
{
$retData = [
'is_success' => 'T',
'response' => [
'datas' => $data,
'channel' => Config::HSQ_TRANSFER,
],
];
}
return $retData;
}
}
......@@ -12,6 +12,7 @@ use Payment\Common\PayException;
use Payment\Trans\AliTransfer;
use Payment\Trans\WxPayBank;
use Payment\Trans\WxTransfer;
use Payment\Trans\HsqTransfer;
class TransferContext
{
......@@ -43,8 +44,11 @@ class TransferContext
case Config::WX_PAY_BANK:
$this->transfer = new WxPayBank($config);
break;
case Config::HSQ_TRANSFER:
$this->transfer = new HsqTransfer($config);
break;
default:
throw new PayException('当前仅支持:ALI_TRANSFER、WX_TRANSFER、WX_PAY_BANK');
throw new PayException('当前仅支持:ALI_TRANSFER、WX_TRANSFER、WX_PAY_BANK、HSQ_TRANSFER');
}
} catch (PayException $e) {
throw $e;
......
<?php
namespace Payment\Utils;
use Payment\Common\PayException;
class BaoFooRsaUtil{
/**
* 读取私钥
* @param type $PfxPath
* @param type $PrivateKPASS
* @return array
* @throws PayException
*/
private static function getPriveKey($PfxPath,$PrivateKPASS)
{
if(file_exists($PfxPath))
{
$PfxPath = str_replace('\\', "/", $PfxPath);
$PKCS12 = file_get_contents($PfxPath);
$PrivateKey = array();
if(openssl_pkcs12_read($PKCS12, $PrivateKey, $PrivateKPASS)){
return $PrivateKey["pkey"];
}else{
throw new PayException("私钥证书读取出错!原因[证书或密码不匹配],请检查本地证书相关信息。");
}
}
else
{
return $PfxPath;
}
}
/**
* 读取公钥
* @param type $PublicPath
* @return type
* @throws Exception
*/
private static function getPublicKey($PublicPath){
if(file_exists($PublicPath))
{
$PublicPath = str_replace('\\', "/", $PublicPath);
$KeyFile = file_get_contents($PublicPath);
$PublicKey = openssl_get_publickey($KeyFile);
if(empty($PublicKey)){
throw new PayException("公钥不可用!路径:".$PublicPath);
}
return $PublicKey;
}
else
{
return openssl_get_publickey($PublicPath);
}
}
/**
* 公钥加密
* @param type $Data 加密数据
* @param type $PfxPath 私钥路径
* @param type $PrivateKPASS 私钥密码
* @return type
* @throws Exception
*/
public static function encryptByCERFile($Data,$PublicPath){
try {
if (!function_exists( 'bin2hex')) {
throw new PayException("bin2hex PHP5.4及以上版本支持此函数,也可自行实现!");
}
$KeyObj = self::getPublicKey($PublicPath);
$BASE64EN_DATA = base64_encode($Data);
$EncryptStr = "";
$blockSize = self::get_Key_Size($KeyObj,false);
if($blockSize<=0){
throw new PayException("BlockSize is 0");
}else{
$blockSize = $blockSize/8-11;
}
$totalLen = strlen($BASE64EN_DATA);
$EncryptSubStarLen = 0;
$EncryptTempData="";
while ($EncryptSubStarLen < $totalLen){
openssl_public_encrypt(substr($BASE64EN_DATA, $EncryptSubStarLen, $blockSize), $EncryptTempData, $KeyObj);
$EncryptStr .= bin2hex($EncryptTempData);
$EncryptSubStarLen += $blockSize;
}
return $EncryptStr;
} catch (PayException $exc) {
echo $exc->getTraceAsString();
}
}
/**
* 私钥加密
* @param type $Data
* @param type $PfxPath
* @param type $PrivateKPASS
* @return type
* @throws Exception
*/
public static function encryptByPFXFile($Data,$PfxPath,$PrivateKPASS)
{
if (!function_exists( 'bin2hex')) {
throw new PayException("bin2hex PHP5.4及以上版本支持此函数,也可自行实现!");
}
$KeyObj = self::getPriveKey($PfxPath,$PrivateKPASS);
$BASE64EN_DATA = base64_encode($Data);
$EncryptStr = "";
$blockSize = self::get_Key_Size($KeyObj);
if($blockSize<=0){
throw new PayException("BlockSize is 0");
}else{
$blockSize = $blockSize/8-11;//分段
}
$totalLen = strlen($BASE64EN_DATA);
$EncryptSubStarLen = 0;
$EncryptTempData="";
while ($EncryptSubStarLen < $totalLen){
openssl_private_encrypt(substr($BASE64EN_DATA, $EncryptSubStarLen, $blockSize), $EncryptTempData, $KeyObj);
$EncryptStr .= bin2hex($EncryptTempData);
$EncryptSubStarLen += $blockSize;
}
return $EncryptStr;
}
/**
* 私钥解密
* @param type $Data 解密数据
* @param type $PublicPath 解密公钥路径
* @return type
* @throws Exception
*/
public static function decryptByPFXFile($Data,$PfxPath,$PrivateKPASS){
try {
if (!function_exists( 'hex2bin')) {
throw new PayException("hex2bin PHP5.4及以上版本支持此函数,也可自行实现!");
}
$KeyObj = self::getPriveKey($PfxPath,$PrivateKPASS);
$blockSize = self::get_Key_Size($KeyObj);
if($blockSize<=0){
throw new PayException("BlockSize is 0");
}else{
$blockSize = $blockSize/4;
}
$DecryptRsult="";
$totalLen = strlen($Data);
$EncryptSubStarLen = 0;
$DecryptTempData="";
while ($EncryptSubStarLen < $totalLen) {
openssl_private_decrypt(hex2bin(substr($Data, $EncryptSubStarLen, $blockSize)), $DecryptTempData, $KeyObj);
$DecryptRsult .= $DecryptTempData;
$EncryptSubStarLen += $blockSize;
}
return base64_decode($DecryptRsult);
} catch (PayException $exc) {
echo $exc->getTraceAsString();
}
}
/**
* 公钥解密
* @param type $Data
* @param type $PublicPath
* @return type
* @throws Exception
*/
public static function decryptByCERFile($Data,$PublicPath) {
if (!function_exists( 'hex2bin')) {
throw new PayException("hex2bin PHP5.4及以上版本支持此函数,也可自行实现!");
}
$KeyObj = self::getPublicKey($PublicPath);
$DecryptRsult="";
$blockSize = self::get_Key_Size($KeyObj,false);
if($blockSize<=0){
throw new PayException("BlockSize is 0");
}else{
$blockSize = $blockSize/4;
}
$totalLen = strlen($Data);
$EncryptSubStarLen = 0;
$DecryptTempData="";
while ($EncryptSubStarLen < $totalLen) {
openssl_public_decrypt(hex2bin(substr($Data, $EncryptSubStarLen, $blockSize)), $DecryptTempData, $KeyObj);
$DecryptRsult .= $DecryptTempData;
$EncryptSubStarLen += $blockSize;
}
return base64_decode($DecryptRsult);
}
/**
* 获取证书长度
* @param type $Key_String
* @param type $Key_Type
* @return int
* @throws Exception
*/
private static function get_Key_Size($Key_String,$Key_Type=true){
$Key_Temp=array();
try{
if($Key_Type){//私钥
$Key_Temp = openssl_pkey_get_details(openssl_pkey_get_private($Key_String));
}else if(openssl_pkey_get_public($Key_String)){//公钥
$Key_Temp = openssl_pkey_get_details(openssl_pkey_get_public($Key_String));
}else{
throw new PayException("Is not a key");
}
IF(array_key_exists("bits",$Key_Temp)){
return $Key_Temp["bits"];
}else{
return 0;
}
} catch (PayException $ex){
$ex->getTrace();
return 0;
}
}
}
\ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!