Commit fc3c9255 by yeran

update

1 parent f64f05ae
Showing with 365 additions and 209 deletions
-----BEGIN CERTIFICATE-----
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
-----END CERTIFICATE-----
\ No newline at end of file
-----BEGIN CERTIFICATE-----
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
-----END CERTIFICATE-----
\ No newline at end of file
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
......@@ -39,6 +39,7 @@ class SwPubCharge extends SwBaseStrategy
* ];
* ```
*
* @throws \Payment\Common\PayException
*/
protected function retData(array $ret)
{
......
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
<?php
/**
* Created by IntelliJ IDEA.
* User: yeran
* Date: 2018/4/23
* Time: 下午6:07
*/
namespace Payment\Client;
use Payment\CancelContext;
use Payment\Common\PayException;
use Payment\Config;
class OrderCancel {
private static $supportChannel = [
Config::TL_CHANNEL_LITE,
];
/**
* @var CancelContext
*/
protected static $instance;
protected static function getInstance($channel, $config)
{
if (is_null(self::$instance)) {
static::$instance = new CancelContext();
try {
static::$instance->initCancelHandler($channel, $config);
} catch (PayException $e) {
throw $e;
}
}
return static::$instance;
}
/**
* @param string $channel
* @param array $config
* @param array $metadata
*
* @return mixed
* @throws PayException
*/
public static function run($channel, $config, $metadata)
{
if (! in_array($channel, self::$supportChannel)) {
throw new PayException('sdk当前不支持该支付渠道,当前仅支持:' . implode(',', self::$supportChannel));
}
try {
$instance = self::getInstance($channel, $config);
$ret = $instance->cancel($metadata);
} catch (PayException $e) {
throw $e;
}
return $ret;
}
}
\ No newline at end of file
......@@ -28,7 +28,8 @@ class Query
Config::WX_CHARGE,
Config::WX_REFUND,
Config::WX_RED,
Config::WX_TRANSFER,
Config::WX_TRANSFER, //微信企业付款到零钱
Config::WX_PAY_BANK, //微信企业付款到银行卡
Config::CMB_CHARGE,
Config::CMB_REFUND,
......@@ -87,4 +88,5 @@ class Query
return $ret;
}
}
\ No newline at end of file
}
File mode changed
<?php
/**
* Created by PhpStorm.
*
*
* Date: 2017/3/7
* Time: 下午3:16
*/
......@@ -19,7 +19,8 @@ class Transfer
private static $supportChannel = [
Config::ALI_TRANSFER,// 支付宝
Config::WX_TRANSFER,// 微信
Config::WX_TRANSFER, //微信企业付款到零钱
Config::WX_PAY_BANK, //微信企业付款到银行卡
'cmb_wallet',// 招行一网通
......@@ -36,7 +37,6 @@ class Transfer
{
if (is_null(self::$instance)) {
static::$instance = new TransferContext();
try {
static::$instance->initTransfer($channel, $config);
} catch (PayException $e) {
......@@ -57,13 +57,12 @@ class Transfer
*/
public static function run($channel, $config, $metadata)
{
if (! in_array($channel, self::$supportChannel)) {
throw new PayException('sdk当前不支持该退款渠道,当前仅支持:' . implode(',', self::$supportChannel));
if (!in_array($channel, self::$supportChannel)) {
throw new PayException('sdk当前不支持该转账渠道,当前仅支持:' . implode(',', self::$supportChannel));
}
try {
$instance = self::getInstance($channel, $config);
$ret = $instance->transfer($metadata);
} catch (PayException $e) {
throw $e;
......@@ -71,4 +70,5 @@ class Transfer
return $ret;
}
}
\ No newline at end of file
}
File mode changed
File mode changed
......@@ -104,9 +104,10 @@ abstract class BaseData
/**
* 设置签名
*
* @param bool $urlDecode
* @throws \Exception
*/
public function setSign()
public function setSign(bool $urlDecode = true)
{
$this->buildData();
if ($this->channel === Config::CMB_PAY) {
......@@ -144,7 +145,7 @@ abstract class BaseData
default:
$values = ArrayUtil::removeKeys($data, ['sign']);
$values = ArrayUtil::arraySort($values);
$signStr = ArrayUtil::createLinkstring($values);
$signStr = ArrayUtil::createLinkstring($values, $urlDecode);
$this->retData['sign'] = $this->makeSign($signStr);
}
}
......
File mode changed
File mode changed
File mode changed
......@@ -12,31 +12,33 @@ class BackPubChargeData extends FuBaseData
public function getData()
{
$data = [];
switch ($this->trade_type) {
case 'JSAPI': //微信公众号
case 'LETPAY': //小程序
$data = [
'appId' => $this->subAppid ?? $this->sdk_appid,
'timeStamp' => $this->sdk_timestamp ?? time(),
'nonceStr' => $this->sdk_noncestr,
'package' => $this->sdk_package,
'signType' => $this->sdk_signtype,
'paySign' => $this->sdk_paysign
];
break;
case 'FWC':
$data = [
'transaction_id' => $this->reserved_transaction_id
];
break;
default:
//TODO: 貌似不需要根据订单类型判断,返回参数中存在 reserved_pay_info 字段,该字段为JSON字符串,与发起支付时所需要参数相同,可以直接根据该字段值返回package
if (!empty($this->reserved_pay_info)) {
switch ($this->trade_type) {
case 'JSAPI': //微信公众号
case 'LETPAY': //小程序
$data = [
'appId' => $this->subAppid ?? $this->sdk_appid,
'timeStamp' => $this->sdk_timestamp ?? time(),
'nonceStr' => $this->sdk_noncestr,
'package' => $this->sdk_package,
'signType' => $this->sdk_signtype,
'paySign' => $this->sdk_paysign
];
break;
case 'FWC':
$data = [
'transaction_id' => $this->reserved_transaction_id
];
break;
default:
}
}
$this->retData['package'] = $data;
$this->retData['package'] = !empty($this->reserved_pay_info) ? json_decode($this->reserved_pay_info, true) : $data;
$this->retData['other'] = [
'out_trade_no' => $this->reserved_fy_order_no ?: '',
'attach' => $this->reserved_addn_inf ?: ''
];
return parent::getData();
}
......
......@@ -53,7 +53,7 @@ abstract class MiBaseStrategy implements BaseStrategy{
* @param array $body
* @return mixed
* @throws PayException
*
*
*/
protected function sendReq($body)
{
......@@ -66,6 +66,7 @@ abstract class MiBaseStrategy implements BaseStrategy{
if ($responseTxt['error'] != 0) { //通信标识
debug('---mipay--error--'.json_encode($responseTxt));
throw new PayException('支付平台返回错误提示3:' . $responseTxt['message']);
}
......@@ -90,7 +91,7 @@ abstract class MiBaseStrategy implements BaseStrategy{
* @param array $body
* @param string $url
* @return mixed
*
*
*/
protected function curlPost($body, $url)
{
......@@ -106,7 +107,7 @@ abstract class MiBaseStrategy implements BaseStrategy{
/**
* 获取需要的url 默认返回下单的url
*
*
* @return string|null
*/
protected function getReqUrl()
......@@ -116,7 +117,7 @@ abstract class MiBaseStrategy implements BaseStrategy{
/**
* @param array $data
*
*
* @throws PayException
* @return array|string
*/
......@@ -150,7 +151,7 @@ abstract class MiBaseStrategy implements BaseStrategy{
* 处理支付平台的返回值并返回给客户端
* @param array $ret
* @return mixed
*
*
*/
protected function retData(array $ret)
{
......@@ -158,4 +159,4 @@ abstract class MiBaseStrategy implements BaseStrategy{
}
}
\ No newline at end of file
}
File mode changed
......@@ -18,33 +18,37 @@ class BackPubChargeData extends SwBaseData
public function getData()
{
$data = [];
switch ($this->pay_type){
case '010':{ //微信
$data = [
'appId' => $this->appId,
'timeStamp' => time() . '',
'nonceStr' => $this->nonceStr,
'package' => $this->package_str,
'signType' => $this->signType,// 签名算法,暂支持MD5
];
switch ($this->pay_type) {
case '010':
{ //微信
$data = [
'appId' => $this->appId,
'timeStamp' => $this->timeStamp,
'nonceStr' => $this->nonceStr,
'package' => $this->package_str,
'signType' => $this->signType, // 签名算法,暂支持MD5
'paySign' => $this->paySign
];
break;
}
break;
}
case '020':{ //支付宝
$data = [
'ali_trade_no' => $this->ali_trade_no,
];
case '020':
{ //支付宝
$data = [
'ali_trade_no' => $this->ali_trade_no,
];
break;
}
case '060':{
$data = [
'token_id' => $this->token_id,
];
break;
}
case '060':
{
$data = [
'token_id' => $this->token_id,
];
break;
}
break;
}
}
$this->retData['jspackage'] = $data;
$this->retData['other'] = [
......
<?php
/**
* Created by PhpStorm.
*
*
* Date: 16/7/31
* Time: 上午9:20
*/
......@@ -28,8 +28,7 @@ class PubChargeData extends ChargeBaseData
// 公众号支付,必须设置openid
$payType = $this->pay_type;//010微信,020支付宝,060qq钱包,090口碑,100翼支付
if (($payType == '010' || $payType == '020')) {
if(empty($this->openid))
throw new PayException('用户在商户appid下的唯一标识,用户标识(微信openid,支付宝userid),pay_type为010及020时需要传入.');
if (empty($this->open_id)) throw new PayException('用户在商户appid下的唯一标识,用户标识(微信openid,支付宝userid),pay_type为010及020时需要传入.');
}
$this->service_id = '012';
......@@ -39,37 +38,37 @@ class PubChargeData extends ChargeBaseData
{
$this->certainSignData = [
// 基本数据
'pay_ver' => trim($this->pay_ver),
'pay_type' => trim($this->pay_type),
'service_id' => $this->service_id,
'merchant_no' => $this->merchant_no,
'terminal_id' => $this->terminal_id,
'terminal_trace' => $this->terminal_trace,
'pay_ver' => trim($this->pay_ver),
'pay_type' => trim($this->pay_type),
'service_id' => $this->service_id,
'merchant_no' => $this->merchant_no,
'terminal_id' => $this->terminal_id,
'terminal_trace' => $this->terminal_trace,
'terminal_time' => $this->terminal_time,
'total_fee' => $this->total_fee, // 金额,单位分
'total_fee' => $this->total_fee, // 金额,单位分
// 'time_expire' => $this->timeout_express,
];
$signData = array_merge($this->certainSignData,[]);
$signData = array_merge($this->certainSignData, []);
if(isset($this->sub_appid)){
if (isset($this->sub_appid)) {
$signData['sub_appid'] = $this->sub_appid;
}
if(isset($this->open_id)){
$signData['open_id'] = $this->open_id;
if (isset($this->open_id)) {
$signData['open_id'] = $this->open_id;
}
if(isset($this->order_body)){
if (isset($this->order_body)) {
$signData['order_body'] = $this->order_body;
}
if(isset($this->notify_url)){
$signData['notify_url'] = $this->notify_url;
if (isset($this->notify_url)) {
$signData['notify_url'] = $this->notify_url;
}
if(isset($this->attach)){
$signData['attach'] = $this->attach;
if (isset($this->attach)) {
$signData['attach'] = $this->attach;
}
if(isset($this->goods_detail)){
$signData['goods_detail'] = $this->goods_detail;
if (isset($this->goods_detail)) {
$signData['goods_detail'] = $this->goods_detail;
//goods_Id String N 商品编号
//goods_name String N 商品名称
......
<?php
/**
*
* @createTime: 2016-08-04 09:42
* @description:
*/
namespace Payment\Common\Weixin\Data;
use Payment\Common\PayException;
use Payment\Utils\ArrayUtil;
/**
* Class TransferData
*
* 微信当前也仅支持单笔付款,不支持批量
*
* @property string $trans_no 商户转账唯一订单号
* @property string $openid 商户appid下,某用户的openid
* @property string $check_name
* - NO_CHECK:不校验真实姓名
* - FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)
* - OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
*
* @property string $payer_real_name 收款用户真实姓名。
* @property string $amount 转账金额,单位:元。 只支持2位小数,小数点前最大支持13位,金额必须大于0。
* @property string $desc 企业付款操作说明信息。必填。
* @property string $client_ip 调用接口的机器Ip地址
*
* @package Payment\Common\Weixin\Data
*
*/
class TransferData extends WxBaseData
{
protected function buildData()
{
$this->retData = [
'mch_appid' => $this->appId,
'mchid' => $this->mchId,
'device_info' => $this->terminal_id,
'nonce_str' => $this->nonceStr,
'partner_trade_no' => $this->trans_no,
'openid' => $this->openid,
'check_name' => $this->check_name,
're_user_name' => $this->payer_real_name,
'amount' => $this->amount,// 此处需要处理单位为分
'desc' => $this->desc,
// $_SERVER["REMOTE_ADDR"] 获取客户端接口。此处获取php所在机器的ip 如果无法获取,则使用该ip
'spbill_create_ip' => $this->client_ip,
];
$this->retData = ArrayUtil::paraFilter($this->retData);
}
/**
* 检查相关参数是否设置
*
*/
protected function checkDataParam()
{
$openId = $this->openid;
$transNo = $this->trans_no;
$checkName = $this->check_name;
$realName = $this->payer_real_name;
$amount = $this->amount;
$clientIp = $this->client_ip;
if (empty($openId)) {
throw new PayException('商户appid下,某用户的openid 必须传入');
}
if (empty($transNo)) {
throw new PayException('商户订单号,需保持唯一性');
}
if ($checkName !== 'NO_CHECK' && empty($realName)) {
throw new PayException('请传入收款人真实姓名');
}
// 微信使用的单位位分.此处进行转化
$this->amount = bcmul($amount, 100, 0);
if (empty($amount) || $amount < 0) {
throw new PayException('转账金额错误');
}
if (empty($clientIp)) {
$this->client_ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1';
}
}
}
File mode changed
<?php
namespace Payment\Common\Weixin\Data;
use Payment\Common\PayException;
use Payment\Utils\ArrayUtil;
/**
* 企业付款到银行卡
* Class PayBankData
*
* @package Payment\Common\Weixin\Data
*
* @property string $trans_no 商户唯一订单号
* @property string $payer_bank_no 收款方银行卡号(采用标准RSA算法,公钥由微信侧提供)
* @property string $payer_real_name 收款方用户名(采用标准RSA算法,公钥由微信侧提供)
* @property string $payer_bank_code 银行卡所在开户行编号
* - 银行编号列表:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_4
*
* @property string $amount 付款金额,单位:元。只支持2位小数,小数点前最大支持13位,金额必须大于0
* @property string $desc 企业付款到银行卡付款说明,即订单备注
*/
class PayBankData extends WxBaseData
{
/**
* 构建用于支付的签名相关数据
* @return array|void
* @createTime 2019/10/10 12:37
*/
protected function buildData()
{
$this->retData = [
'mch_id' => $this->mchId,
'partner_trade_no' => $this->trans_no,
'nonce_str' => $this->nonceStr,
'enc_bank_no' => $this->payer_bank_no,
'enc_true_name' => $this->payer_real_name,
'bank_code' => $this->payer_bank_code,
'amount' => $this->amount, //此处需要处理单位为分
'desc' => $this->desc,
];
$this->retData = ArrayUtil::paraFilter($this->retData);
}
/**
* 检查相关参数是否设置
* @return mixed|void
* @throws PayException
* @createTime 2019/10/10 14:03
*/
protected function checkDataParam()
{
$transNo = $this->trans_no;
$bankNo = $this->payer_bank_no;
$bankCode = $this->payer_bank_code;
$realName = $this->payer_real_name;
$amount = $this->amount;
if (empty($transNo)) throw new PayException('企业付款单号不能为空,且需保持唯一性');
if (strlen($transNo) < 8 || strlen($transNo) > 32) throw new PayException('企业付款单号最短8位最长32位');
if (empty($bankNo)) throw new PayException('请传入收款方银行卡号');
$this->payer_bank_no = $this->encryptByRSA($bankNo);
if (empty($bankCode)) throw new PayException('请传入收款方银行卡所在开户行编号');
if (empty($realName)) throw new PayException('请传入收款方用户名');
$this->payer_real_name = $this->encryptByRSA($realName);
if (empty($amount) || $amount < 0) throw new PayException('企业付款到银行卡金额错误');
$this->amount = bcmul($amount, 100, 0); //微信使用的单位为分,此处进行转化
}
}
<?php
namespace Payment\Common\Weixin\Data\Query;
use Payment\Common\PayException;
use Payment\Common\Weixin\Data\WxBaseData;
use Payment\Utils\ArrayUtil;
/**
* 微信企业付款到银行卡查询,当前微信仅支持根据商户订单号来进行查询
*
* @property string $trans_no 企业付款单号
*
* Class PayBankQueryData
* @package Payment\Common\Weixin\Data\Query
*/
class PayBankQueryData extends WxBaseData
{
protected function buildData()
{
$this->retData = [
'mch_id' => $this->mchId,
'partner_trade_no' => $this->trans_no,
'nonce_str' => $this->nonceStr,
];
$this->retData = ArrayUtil::paraFilter($this->retData);
}
protected function checkDataParam()
{
$transNo = $this->trans_no;
if (empty($transNo)) throw new PayException('请提供商户调用企企业付款到银行卡API时所使用的付款单号');
}
}
......@@ -8,6 +8,7 @@
namespace Payment\Common\Weixin\Data;
use Payment\Common\BaseData;
use Payment\Common\PayException;
/**
* Class BaseData
......@@ -21,10 +22,11 @@ use Payment\Common\BaseData;
* @property string $md5Key 用于加密的md5Key
* @property string $appCertPem 从apiclient_cert.p12中导出证书部分的文件,为pem格式,
* @property string $appKeyPem 从apiclient_key.pem中导出密钥部分的文件,为pem格式
* @property string $publicKeyPem 从获取RSA加密公钥API中得到的RSA公钥并进行将PKCS#1转为PKCS#8的pem格式文件
* @property string $tradeType 支付类型
* @property string $terminal_id 终端设备号(门店号或收银设备ID),默认请传"WEB"
*
* @package Payment\Common\Weixin\Dataa
* @package Payment\Common\Weixin\Data
*/
abstract class WxBaseData extends BaseData
{
......@@ -43,7 +45,6 @@ abstract class WxBaseData extends BaseData
break;
case 'HMAC-SHA256':
$sign = base64_encode(hash_hmac('sha256', $signStr, $this->md5Key));
break;
default:
$sign = '';
......@@ -51,4 +52,21 @@ abstract class WxBaseData extends BaseData
return strtoupper($sign);
}
/**
* RSA加密
* @param string $string 需加密字符串
* @return string 返回加密后字符串
* @throws PayException
* @createTime 2019/10/10 14:00
*/
protected function encryptByRSA(string $string)
{
$publicKeyPem = $this->publicKeyPem;
if (empty($publicKeyPem) || true !== file_exists($publicKeyPem)) throw new PayException('RSA加密公钥有误');
$encryptedBlock = '';
if (true !== openssl_public_encrypt($string, $encryptedBlock, file_get_contents($this->publicKeyPem), OPENSSL_PKCS1_OAEP_PADDING)) throw new PayException('RSA加密失败');
return base64_encode($encryptedBlock);
}
}
<?php
/**
* Created by PhpStorm.
*
*
* Date: 2017/4/26
* Time: 下午5:39
*/
......@@ -28,7 +28,7 @@ class WechatHelper extends WxBaseData
$curl = new Curl();
$responseTxt = $curl->set([
'CURLOPT_HEADER' => 0
'CURLOPT_HEADER' => 0
])->post($xml)->submit($url);
if ($responseTxt['error']) {
......@@ -37,7 +37,7 @@ class WechatHelper extends WxBaseData
// 格式化为数组
$retData = DataParser::toArray($responseTxt['body']);
if ($retData['return_code'] != 'SUCCESS') {
throw new PayException('微信返回错误提示:' . $retData['return_msg']);
throw new PayException('微信返回错误提示:' . ($retData['return_msg'] ?? ($retData['retmsg'] ?? 'unknown')));
}
return $retData['sandbox_signkey'];
......@@ -46,7 +46,7 @@ class WechatHelper extends WxBaseData
protected function buildData()
{
$this->retData = [
'mch_id' => $this->mchId,
'mch_id' => $this->mchId,
'nonce_str' => $this->nonceStr,
];
}
......@@ -55,4 +55,4 @@ class WechatHelper extends WxBaseData
{
// TODO: Implement checkDataParam() method.
}
}
\ No newline at end of file
}
<?php
/**
*
* @createTime: 2016-07-15 14:56
......@@ -15,6 +16,7 @@ use Payment\Utils\StrUtil;
final class WxConfig extends ConfigInterface
{
// 微信分配的公众账号ID
public $appId;
......@@ -42,6 +44,12 @@ final class WxConfig extends ConfigInterface
// key文件路径或者内容
public $appKeyPem;
/**
* 从获取RSA加密公钥API中得到的RSA公钥并进行将PKCS#1转为PKCS#8的pem格式文件
* 用于将字段进行rsa加密并转base64密文,将密文传给微信侧相应字段,如付款接口(enc_bank_no/enc_true_name)
*/
public $publicKeyPem;
// 支付类型
public $tradeType;
......@@ -61,16 +69,22 @@ final class WxConfig extends ConfigInterface
// 查询退款url
const REFUDN_QUERY_URL = 'https://api.mch.weixin.qq.com/{debug}/pay/refundquery';
// 企业付款的查询
// 企业付款到零钱的查询
const TRANS_QUERY_URL = 'https://api.mch.weixin.qq.com/{debug}/mmpaymkttransfers/gettransferinfo';
// 企业付款到银行卡的查询
const PAY_BANK_QUERY_URL = 'https://api.mch.weixin.qq.com/{debug}/mmpaysptrans/query_bank';
// 申请退款url
const REFUND_URL = 'https://api.mch.weixin.qq.com/{debug}/secapi/pay/refund';
// 企业付款
// 企业付款到零钱
const TRANSFERS_URL = 'https://api.mch.weixin.qq.com/{debug}/mmpaymkttransfers/promotion/transfers';
//企业付款到银行卡
const PAY_BANK_URL = 'https://api.mch.weixin.qq.com/{debug}/mmpaysptrans/pay_bank';
// 关闭订单url 尚未接入
const CLOSE_URL = 'https://api.mch.weixin.qq.com/{debug}/pay/closeorder';
......@@ -164,12 +178,15 @@ final class WxConfig extends ConfigInterface
}
// 以下两个文件,如果是调用资金流向接口,必须提供
if (! empty($config['app_cert_pem'])) {
if (!empty($config['app_cert_pem'])) {
$this->appCertPem = $config['app_cert_pem'];
}
if (! empty($config['app_key_pem'])) {
if (!empty($config['app_key_pem'])) {
$this->appKeyPem = $config['app_key_pem'];
}
if (!empty($config['public_key_pem'])) {
$this->publicKeyPem = $config['public_key_pem'];
}
if (key_exists('sign_type', $config) && in_array($config['sign_type'], ['MD5', 'HMAC-SHA256'])) {
$this->signType = $config['sign_type'];
......@@ -189,4 +206,6 @@ final class WxConfig extends ConfigInterface
$this->useSandbox = false;// 不是沙箱模式
}
}
}
......@@ -15,7 +15,7 @@ namespace Payment;
final class Config
{
const VERSION = '3.2.0';
const VERSION = '3.2.1';
//======================= 账户类型 ======================//
const WECHAT_PAY = 'wechat';
......@@ -83,7 +83,9 @@ final class Config
const WX_RED = 'wx_red';// 红包
const WX_TRANSFER = 'wx_transfer';// 转账
const WX_TRANSFER = 'wx_transfer'; //微信企业付款到零钱
const WX_PAY_BANK = 'wx_pay_bank'; //微信企业付款到银行卡
const APPLE_PAY = 'applepay_upacp';//apple支付
......
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
File mode changed
This diff is collapsed. Click to expand it.
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!