微信JSAPI支付填坑
- 服务商发过来的的证书,只能用于支付,退款需要自己重新生成证书,
1)、安装扩展:composer require wechatpay/wechatpay-guzzle-middleware
2)、替换以下对应的参数:
php {所在目录}/vendor/wechatpay/wechatpay/bin/CertificateDownloader.php -k {apikey v3} -m {子商户号} -f {所在目录}/{服务商发过来的私钥证书所在目录} -s {证书序列号} -o {保存目录}
3)、运行上述代码,生成退款专用证书
4)、把生成的证书复制到证书目录,即放在跟服务商发过来的的证书同目录。
2、下单签名用服务商提供的主私钥,即上面字段的rsaprivatekey,不需要证书,提交地址(微信):https://api.mch.weixin.qq.com/pay/unifiedorder
需要的参数有
字段 | 说明 | 备注 |
appid | 服务商appid | 由服务商提供 |
mch_id | 服务商mch_id | 由服务商提供 |
sub_appid | 子商户appid | 由服务商提供 |
sub_mch_id | 子商户mch_id | 由服务商提供 |
sub_openid | 子商户openid | 通过getCode获取,每个用户的openid是不一样的 |
$this->parameters["appid"] = $pay_info['appid'];//服务商appid
$this->parameters["mch_id"] = $pay_info['mchid'];//服务商商户号
$this->parameters['notify_url'] = $pay_info['gatewayurl'].'/Notify/'; // 回调地址
$this->parameters["sub_appid"] = $pay_info['sub_appid']; // 子商户appid
$this->parameters['sub_mch_id'] = $pay_info['sub_mchid']; // 子商户号
$this->parameters['sub_openid'] = $open_id;//open_id
$this->parameters["spbill_create_ip"] = $_SERVER['REMOTE_ADDR'];//终端ip
$this->parameters["nonce_str"] = random(32, 'all');//随机字符串
$this->parameters["sign"] = $this->getSign($this->parameters, $pay_info['rsaprivatekey']);//签名
3、退款签名用服务商提供的apikey v3私钥,即上面字段的sub_key2,需要证书,证书用服务商提供的私钥证书和自己生成的证书,提交地址为(服务商):https://payapi.mch.weixin.semoor.cn/4.0/secapi/pay/refund
需要的参数有
字段 | 说明 | 备注 |
appid | 子商户appid | 由服务商提供 |
mch_id | 子商户mch_id | 由服务商提供 |
$this->parameters["appid"] = $pay_info['sub_appid'];//子商户APPID
$this->parameters["mch_id"] = $pay_info['sub_mchid'];//子商户号
//$this->parameters["sinkey"] = $pay_info['sub_key2'];//退款专用key
$this->parameters["nonce_str"] = random(32, 'all');//随机字符串
$this->parameters["sign"] = $this->getSign($this->parameters, $pay_info['sub_key2']);//签名
$this->SSLCERT_PATH = app()->getRootPath() . 'app/cert/wechat/' . $pay_info['sub_mchid'] . '/certapiclient_cert.pem'; // 自己生成的证书
$this->SSLKEY_PATH = app()->getRootPath() . 'app/cert/wechat/' . $pay_info['sub_mchid'] . '/certapiclient_key.pem'; // 服务商提供的证书
4、退款:微信通过投诉回调地址返回的数据,需要解密,解密通过sodium扩展进行解密,sodium在PHP7.2以上默认已安装,只需开启即可,如果没有该函数,则需要安装sodium扩展。linux安装: