laravel微信支付
支付流程
1、申请商户号
2、获取mer_id、apikey、对应的证书
3、配置支付授权目录:填写域名即可 https://orangbus/
4、关联小程序获取微信公众号appid
5、通过服务器生成对应的配置信息,由各自的平台发起支付
6、接受支付结果
openid获取
1、小程序传递uni.login获取的code参数到后端,通过接口换取openid
支付配置
登录商户后台:https://pay.weixin.qq.com
支付证书,需要下载微信的一个软件,根据引导生成,最后会在【本机】生成对应的文件

image-20250620150608427 获取支付秘钥: 32位的秘钥

image-20250620150129059 设置支付的授权目录:支付回调的目录

image-20250620145953649 最后需要得到的东西
【api秘钥】
【支付证书】2个文件

image-20250620153530457 支付目录配置

image-20250707171629626
支付
微信支付参数
$option = [
"appid" => "wxc31af35"
"mchid" => "1715"
"description" => "订单描述"
"out_trade_no" => "20250707160758208269"
"attach" => "node_order"
"amount" => array:2 [
"total" => 1
"currency" => "CNY"
]
"payer" => array:1 [
"openid" => "opHoT7WFGDMDd5s"
]
"time_expire" => "2025-07-07T17:44:18+08:00"
"notify_url" => "http://pay.xuekatu.com/pay/callback"
];
小程序支付参数
{
appId: "wxc31af735"
nonceStr: "DzbNp98mi3"
package: "prepay_id=wx071720172d5756c8bcdf0001"
paySign: "45h7rViTBFycSx0KwPlXtRul9aZV1Hdqfreb1AT4Lox6tvPD8LsGHgt2ahPOg=="
signType: "RSA"
timeStamp: "1751880017"
}
支付流程
payOrder({id:this.id}).then(res=>{
if (res.code === 200) {
/**
* appId: "wxc315ada735"
* nonceStr: "DzbNE2nX8mi3"
* package: "prepay_id=wxd29c4d5756c8bcdf0001"
* paySign: "45h7rViTBFycSx0KwPlXtRul9aZDdjT/3MbwmwEiLox6tvPD8LsGHgt2ahPOg=="
* signType: "RSA"
* timeStamp: "1751880017"
*/
let { appId,nonceStr,paySign,signType,timeStamp} = res.data;
uni.requestPayment({
provider:"wxpay",
order:this.order,
timeStamp:timeStamp,
nonceStr:nonceStr,
package:res.data.package,
signType:signType,
paySign:paySign,
success:(res)=>{
Message.success(res.message);
},
fail:(e)=>{
Message.error(e.message)
}
})
}else{
Message.error(res.msg)
}
});
回调参数
{
"message": {
"mchid": "1718891755",
"appid": "wxc31da735",
"out_trade_no": "202507071607582082693",
"transaction_id": "4200002724202507077591316549",
"trade_type": "JSAPI",
"trade_state": "SUCCESS",
"trade_state_desc": "支付成功",
"bank_type": "OTHERS",
"attach": "node_order",
"success_time": "2025-07-07T17:51:27+08:00",
"payer": {
"openid": "opHoT7WFG7Ld5s"
},
"amount": {
"total": 1,
"payer_total": 1,
"currency": "CNY",
"payer_currency": "CNY"
}
}
}
微信支付退款
退费流程:
1、必须是通过微信支付过的订单,因为退款过程需要得到支付成功后微信回调接口回返回的【微信端的订单编号】
2、通过接口调用微信支付,由 商户系统 根据退费金额 向微信商户端 提交退款申请(提交申请到用户收到退费金额可能有一定时间的延迟)
3、到微信商户后台 配置退款成功的回调,根据退款的结果更新退款订单的状态信息。
退款商户配置
配置jsap支付授权目录:https://wechat.com/pay/refund/1/2
回调地址配置: https://wechat.com/pay/refund/1/2
ip白名单:填写自己服务器的ip地址

退款回调参数
https://pay.weixin.qq.com/doc/v3/merchant/4013071196
{
"id":"EV-2018022511223320873",
"create_time":"2018-06-08T10:34:56+08:00",
"resource_type":"encrypt-resource",
"event_type":"REFUND.SUCCESS",
"summary":"退款成功",
"resource" : {
"algorithm":"AEAD_AES_256_GCM",
"original_type": "refund",
"ciphertext": "...",
"nonce": "...",
"associated_data": ""
}
}
遇到问题
openssl_sign(): Supplied key param cannot be coerced into a private key
秘钥的路径出错了,或者填写的秘钥不对,如果秘钥保存到oss存储之类的,先将远程的文件下载到本地保存,通过本地文件加载的方式进行加载
public static function getFilePath(string $url):string
{
$name = basename($url); // 提取文件名 https://xx.com/xx/wechat.pem -> wechat.pem
$path = Storage::disk("pay")->path($name);
if (!Storage::disk("pay")->has($name)){
$content = file_get_contents("https:".$url);
$res = Storage::disk("pay")->put($name,$content);
AssertUtils::isTrue($res == false,"证书文件获取失败");
};
return $path;
}
appid和mch_id不匹配,请检查后再试

先绑定appid,找对应平台(小程序|公众号) 管理员手机确认
