lokielse / omnipay-wechatpay

(微信支付)WeChatPay driver for the Omnipay PHP payment processing library
MIT License
316 stars 103 forks source link

希望增加服务商付款功能 #61

Closed sleep-go closed 6 years ago

successgo commented 6 years ago

这个开发上没有问题,不过没有账号可以用来测试。

kanghuli commented 6 years ago

@ktsleep 已经增加,作者已合并,可以试用,有问题及时沟通

$gateway    = Omnipay::create('WechatPay');
$gateway->setAppId($config['app_id']);
$gateway->setMchId($config['mch_id']);
$gateway->setApiKey($config['api_key']);

//服务商模式下
$gateway->setSubmchId('子商户id'); 

//在小程序中使用服务商模式收款,查询订单等,此处为小程序app_id, 且必填, 非小程序场景不用设置。
//$gateway->setSubAppId('子商户app id'); 
Clago commented 6 years ago

最近因为要使用服务商模式,我说下小程序采用服务商模式支付碰到的问题吧:

1.首先就是openid问题

$gateway    = Omnipay::create('WechatPay');
$gateway->setAppId($config['app_id']); //服务商微信公众号appid
$gateway->setMchId($config['mch_id']);//服务商商户号
$gateway->setApiKey($config['api_key']);//服务商支付key
//服务商模式下
$gateway->setSubmchId('子商户id');  //服务商下面特约商户id
//在小程序中使用服务商模式收款,查询订单等,此处为小程序appid, 且必填, 非小程序场景不用设置。
//$gateway->setSubAppId('子商户app id');  //这里是小程序的appid

这种情况下,按现有的代码传openid微信会和服务商微信公众号去匹配,这明显会出现openid和appid不匹配问题,因为openid是当前小程序wx.login()获取的,所以文档里有sub_openid这个字段,这里代码应该处理判断下 微信境内服务商下单

//Message/CreateOrderRequest.php
if($this->getSubMchId()){ //服务商模式应该变成sub_openid
        $data['sub_openid']=$this->getOpenId();
}else{
        $data['openid']=$this->getOpenId();
}

2.下单完成后js签名问题

//Message/CreateOrderResponse.php
 public function getJsOrderData()
    {
        if ($this->isSuccessful()) {
            $data = [
                'appId'     => $this->request->getAppId(),
                'package'   => 'prepay_id=' . $this->getPrepayId(),
                'nonceStr'  => md5(uniqid()),
                'timeStamp' => time() . '',
            ];

            $data['signType'] = 'MD5';
            $data['paySign']  = Helper::sign($data, $this->request->getApiKey());
        } else {
            $data = null;
        }

        return $data;
    }

服务商模式下设置的appid是服务商的公众号appid,这里获取的就是服务商公众号的appid,所以加签就会出现问题,jssdk支付会出现验签失败,这里应该用当前小程序的appid.

//判断是否是服务商模式
'appId' => $this->request->getSubMchId()?$this->request->getSubAppId():$this->request->getAppId()
herojhc commented 5 years ago

希望加个 sub_openid 参数 对应 sub_appid,使用服务商时,用户并不一定非得授权 服务商的公众号。