Closed sleep-go closed 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');
最近因为要使用服务商模式,我说下小程序采用服务商模式支付碰到的问题吧:
$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();
}
//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()
希望加个 sub_openid 参数 对应 sub_appid,使用服务商时,用户并不一定非得授权 服务商的公众号。
这个开发上没有问题,不过没有账号可以用来测试。