Skip to content

Commit

Permalink
Merge pull request #82 from krissss/master
Browse files Browse the repository at this point in the history
对微信服务商的支持
  • Loading branch information
yansongda authored Mar 6, 2018
2 parents d0eed21 + 413d551 commit ac303d9
Show file tree
Hide file tree
Showing 8 changed files with 58 additions and 4 deletions.
22 changes: 21 additions & 1 deletion src/Gateways/Wechat.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,25 @@
*/
class Wechat implements GatewayApplicationInterface
{
const MODE_NORMAL = 'normal'; // 普通模式
const MODE_DEV = 'dev'; // 沙箱模式
const MODE_HK = 'hk'; // 香港钱包
const MODE_SERVICE = 'service'; // 服务商

/**
* Config.
*
* @var Config
*/
protected $config;

/**
* Mode.
*
* @var string
*/
protected $mode;

/**
* Wechat payload.
*
Expand All @@ -58,7 +70,8 @@ class Wechat implements GatewayApplicationInterface
public function __construct(Config $config)
{
$this->config = $config;
$this->gateway = Support::baseUri($this->config->get('mode', 'normal'));
$this->mode = $this->config->get('mode', self::MODE_NORMAL);
$this->gateway = Support::baseUri($this->mode);
$this->payload = [
'appid' => $this->config->get('app_id', ''),
'mch_id' => $this->config->get('mch_id', ''),
Expand All @@ -68,6 +81,13 @@ public function __construct(Config $config)
'trade_type' => '',
'spbill_create_ip' => Request::createFromGlobals()->getClientIp(),
];

if ($this->mode === static::MODE_SERVICE) {
$this->payload = array_merge($this->payload, [
'sub_mch_id' => $this->config->get('sub_mch_id'),
'sub_appid' => $this->config->get('sub_app_id', ''),
]);
}
}

/**
Expand Down
6 changes: 5 additions & 1 deletion src/Gateways/Wechat/AppGateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Yansongda\Pay\Gateways\Wechat;
use Yansongda\Pay\Log;
use Yansongda\Supports\Str;

Expand All @@ -23,10 +24,13 @@ public function pay($endpoint, array $payload): Response
{
$payload['appid'] = $this->config->get('appid');
$payload['trade_type'] = $this->getTradeType();
if ($this->mode === Wechat::MODE_SERVICE) {
$payload['sub_appid'] = $this->config->get('sub_appid');
}

$payRequest = [
'appid' => $payload['appid'],
'partnerid' => $payload['mch_id'],
'partnerid' => $this->mode === Wechat::MODE_SERVICE ? $payload['sub_mch_id'] : $payload['mch_id'],
'prepayid' => $this->preOrder('pay/unifiedorder', $payload)->prepay_id,
'timestamp' => strval(time()),
'noncestr' => Str::random(),
Expand Down
9 changes: 9 additions & 0 deletions src/Gateways/Wechat/Gateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Yansongda\Pay\Gateways\Wechat;

use Yansongda\Pay\Contracts\GatewayInterface;
use Yansongda\Pay\Gateways\Wechat;
use Yansongda\Pay\Log;
use Yansongda\Supports\Collection;
use Yansongda\Supports\Config;
Expand All @@ -16,6 +17,13 @@ abstract class Gateway implements GatewayInterface
*/
protected $config;

/**
* Mode.
*
* @var string
*/
protected $mode;

/**
* Bootstrap.
*
Expand All @@ -26,6 +34,7 @@ abstract class Gateway implements GatewayInterface
public function __construct(Config $config)
{
$this->config = $config;
$this->mode = $this->config->get('mode', Wechat::MODE_NORMAL);
}

/**
Expand Down
4 changes: 4 additions & 0 deletions src/Gateways/Wechat/GroupRedpackGateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Yansongda\Pay\Gateways\Wechat;

use Yansongda\Pay\Gateways\Wechat;
use Yansongda\Pay\Log;
use Yansongda\Supports\Collection;

Expand All @@ -20,6 +21,9 @@ class GroupRedpackGateway extends Gateway
public function pay($endpoint, array $payload): Collection
{
$payload['wxappid'] = $payload['appid'];
if ($this->mode === Wechat::MODE_SERVICE) {
$payload['msgappid'] = $payload['appid'];
}
$payload['amt_type'] = 'ALL_RAND';

unset($payload['appid'], $payload['trade_type'], $payload['notify_url'], $payload['spbill_create_ip']);
Expand Down
4 changes: 4 additions & 0 deletions src/Gateways/Wechat/MiniappGateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Yansongda\Pay\Gateways\Wechat;

use Yansongda\Pay\Gateways\Wechat;
use Yansongda\Supports\Collection;

class MiniappGateway extends MpGateway
Expand All @@ -19,6 +20,9 @@ class MiniappGateway extends MpGateway
public function pay($endpoint, array $payload): Collection
{
$payload['appid'] = $this->config->get('miniapp_id');
if ($this->mode === Wechat::MODE_SERVICE) {
$payload['sub_appid'] = $this->config->get('sub_miniapp_id');
}

return parent::pay($endpoint, $payload);
}
Expand Down
4 changes: 4 additions & 0 deletions src/Gateways/Wechat/RedpackGateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Yansongda\Pay\Gateways\Wechat;

use Symfony\Component\HttpFoundation\Request;
use Yansongda\Pay\Gateways\Wechat;
use Yansongda\Pay\Log;
use Yansongda\Supports\Collection;

Expand All @@ -21,6 +22,9 @@ class RedpackGateway extends Gateway
public function pay($endpoint, array $payload): Collection
{
$payload['wxappid'] = $payload['appid'];
if ($this->mode === Wechat::MODE_SERVICE) {
$payload['msgappid'] = $payload['appid'];
}
$payload['client_ip'] = Request::createFromGlobals()->server->get('SERVER_ADDR');

unset($payload['appid'], $payload['trade_type'], $payload['notify_url'], $payload['spbill_create_ip']);
Expand Down
9 changes: 7 additions & 2 deletions src/Gateways/Wechat/Support.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Yansongda\Pay\Exceptions\GatewayException;
use Yansongda\Pay\Exceptions\InvalidArgumentException;
use Yansongda\Pay\Exceptions\InvalidSignException;
use Yansongda\Pay\Gateways\Wechat;
use Yansongda\Pay\Log;
use Yansongda\Supports\Collection;
use Yansongda\Supports\Traits\HasHttpRequest;
Expand Down Expand Up @@ -102,6 +103,10 @@ public static function filterPayload($payload, $order, $config)
$type = isset($order['type']) ? $order['type'].($order['type'] == 'app' ? '' : '_').'id' : 'app_id';

$payload['appid'] = $config->get($type, '');
$mode = $config->get('mode', Wechat::MODE_NORMAL);
if ($mode === Wechat::MODE_SERVICE) {
$payload['sub_appid'] = $config->get('sub_'.$type, '');
}

unset($payload['notify_url'], $payload['trade_type'], $payload['type']);

Expand Down Expand Up @@ -209,11 +214,11 @@ public static function fromXml($xml): array
public static function baseUri($mode = null): string
{
switch ($mode) {
case 'dev':
case Wechat::MODE_DEV:
self::getInstance()->baseUri = 'https://api.mch.weixin.qq.com/sandboxnew/';
break;

case 'hk':
case Wechat::MODE_HK:
self::getInstance()->baseUri = 'https://apihk.mch.weixin.qq.com/';
break;

Expand Down
4 changes: 4 additions & 0 deletions src/Gateways/Wechat/TransferGateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Yansongda\Pay\Gateways\Wechat;

use Symfony\Component\HttpFoundation\Request;
use Yansongda\Pay\Gateways\Wechat;
use Yansongda\Pay\Log;
use Yansongda\Supports\Collection;

Expand All @@ -20,6 +21,9 @@ class TransferGateway extends Gateway
*/
public function pay($endpoint, array $payload): Collection
{
if ($this->mode === Wechat::MODE_SERVICE) {
unset($payload['sub_mch_id'], $payload['sub_appid']);
}
$type = isset($payload['type']) ? ($payload['type'].($payload['type'] == 'app' ?: '_').'id') : 'app_id';

$payload['mch_appid'] = $this->config->get($type, '');
Expand Down

0 comments on commit ac303d9

Please # to comment.