问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

php如何实现微信小程序支付及退款

发布网友 发布时间:2022-04-27 03:44

我来回答

2个回答

懂视网 时间:2022-04-07 13:06

前面讲了怎么实现微信支付,详见相关文章:PHP实现微信支付(jsapi支付)流程 和ThinkPHP中实现微信支付(jsapi支付)流程。由于业务需求,还需要有微信退款,经过研究和摸索,也终于搞定了。

前期准备:

当然是搞定了微信支付,不然怎么退款,这次还是使用官方的demo。当然网上可能也有很多大神自己重写和封装了demo,或许更加好用简洁,但是我还是不提倡用,原因如下:

(1)可能功能不全,或许他只是实现了微信支付,但是还有申请退款、查询退款、订单查询、撤销订单等业务功能可能是你后续需要的,如果你依赖于大神的SDK的便捷,如果有新的业务需求,你就懵逼了;

(2)安全考虑,涉及到支付涉及到金钱,必须要非常安全。官方SDK虽然我也吐槽,但至少会相对比较安全,再次重写,虽然暂时没看出问题,但是万一有漏洞就不好了。

本篇还是使用到官方提供的SDK中的最重要的一个类文件WxPay.Api.php中提供的refund()方法来实现,此方法在WxPay.Api.php文件的第141行,代码如下:

/**
 * 
 * 申请退款,WxPayRefund中out_trade_no、transaction_id至少填一个且
 * out_refund_no、total_fee、refund_fee、op_user_id为必填参数
 * appid、mchid、spbill_create_ip、nonce_str不需要填入
 * @param WxPayRefund $inputObj
 * @param int $timeOut
 * @throws WxPayException
 * @return 成功时返回,其他抛异常
 */
public static function refund($inputObj, $timeOut = 6){
$url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
//检测必填参数
if(!$inputObj->IsOut_trade_noSet() && !$inputObj->IsTransaction_idSet()) {
throw new WxPayException("退款申请接口中,out_trade_no、transaction_id至少填一个!");
}else if(!$inputObj->IsOut_refund_noSet()){
throw new WxPayException("退款申请接口中,缺少必填参数out_refund_no!");
}else if(!$inputObj->IsTotal_feeSet()){
throw new WxPayException("退款申请接口中,缺少必填参数total_fee!");
}else if(!$inputObj->IsRefund_feeSet()){
throw new WxPayException("退款申请接口中,缺少必填参数refund_fee!");
}else if(!$inputObj->IsOp_user_idSet()){
throw new WxPayException("退款申请接口中,缺少必填参数op_user_id!");
}
$inputObj->SetAppid(WxPayConfig::APPID);//公众账号ID
$inputObj->SetMch_id(WxPayConfig::MCHID);//商户号
$inputObj->SetNonce_str(self::getNonceStr());//随机字符串
$inputObj->SetSign();//签名
$xml = $inputObj->ToXml();
$startTimeStamp = self::getMillisecond();//请求开始时间
$response = self::postXmlCurl($xml, $url, true, $timeOut);
$result = WxPayResults::Init($response);
self::reportCostTime($url, $startTimeStamp, $result);//上报请求花费时间
return $result;
}

官方的方法,写的很清楚需要哪些参数,还有一些必须参数SDK已经帮我们补齐了,我将这个方法重新封装一下,便于在项目中调用:

/**
 * 微信退款
 * @param string $order_id 订单ID
 * @return 成功时返回(array类型),其他抛异常
 */
function wxRefund($order_id){
//我的SDK放在项目根目录下的Api目录下
require_once APP_ROOT."/Api/wxpay/lib/WxPay.Api.php";
//查询订单,根据订单里边的数据进行退款
$order = M('order')->where(array('id'=>$order_id,'is_refund'=>2,'order_status'=>1))->find();
$merchid = WxPayConfig::MCHID;
if(!$order) return false;
$input = new WxPayRefund();
$input->SetOut_trade_no($order['order_sn']);//自己的订单号
$input->SetTransaction_id($order['transaction_id']); //微信官方生成的订单流水号,在支付成功中有返回
$input->SetOut_refund_no(getrand_num(true));//退款单号
$input->SetTotal_fee($order['total_price']);//订单标价金额,单位为分
$input->SetRefund_fee($order['total_price']);//退款总金额,订单总金额,单位为分,只能为整数
$input->SetOp_user_id($merchid);
$result = WxPayApi::refund($input);//退款操作
// 这句file_put_contents是用来查看服务器返回的退款结果 测试完可以删除了
//file_put_contents(APP_ROOT.'/Api/wxpay/logs/log3.txt',arrayToXml($result),FILE_APPEND);
return $result;
}

这里需要吐槽一下,竟然不说返回值的类型,在支付的时候返回的是XML数据,这里竟然返回的是数组,让我措手不及,哈哈不过还是返回数组比较好,可以直接判断处理。

方法调用就更加简单了:

//微信退款
$result = wxRefund($order_id);
// 这句file_put_contents是用来查看服务器返回的退款结果 测试完可以删除了
//file_put_contents(APP_ROOT.'/Api/wxpay/logs/log4.txt',arrayToXml($result),FILE_APPEND);
if(($result['return_code']=='SUCCESS') && ($result['result_code']=='SUCCESS')){
//退款成功
}else if(($result['return_code']=='FAIL') || ($result['result_code']=='FAIL')){
//退款失败
//原因
$reason = (empty($result['err_code_des'])?$result['return_msg']:$result['err_code_des']);
}else{
//失败
}

退款成功返回如下:

f6615df7f16ff936a26a513aed72b23.png

亲测无误:这是集成了官方的SDK实现的,如果不使用SDK,可以使用更简单的方法,见:PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)

ff23e522c96093a2c3e58b4188ddd1b.png

更多PHP相关知识,请访问PHP教程!

热心网友 时间:2022-04-07 10:14

其实,压根没必要自己动手开发,很难实现;
可以借助小程序第三方平台进行搭建;
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女人脚出汗有酸味是怎么回事 脚的酸味是什么原因 请问南充有奥迪4S店或者奥迪专修店吗?电话号码是多少? ...不爱我了,对我已经死心了!我该怎么做,真的很爱她,好想挽回,我也不... 烂板凳的意思是什么 爸爸过世几个月了,为什么还梦见爸爸还没埋葬呢,看见爸爸的尸体_百度知 ... 眼睛结膜炎痒怎么办 结膜炎眼睛痒怎么缓解 结膜炎眼角痒怎么办 苹果电脑下载什么编辑器适合mac的视频剪辑软件有哪些 自然界的三大守恒定律 iphone四是2g还是三g的 影视摄影与制作专业的视听语言课作业? 视听语言在电影中的作用 影视视听语言4(构图) 视听语言应该从哪里学起 什么是视听语言? 影视视听语言第二版 最全视听语言课件 (上) 电影的视听语言包括哪些方面? 电影的影评中视听语言要怎么写? 求《影视视听语言第二版张菁》全文免费下载百度网盘资源,谢谢~ 商标申请书“商标图样”有什么要求?一 申请彩色商标跟没加颜色的商标有何区别 彩色图形商标注册了11类,可不可以再用黑白图形注册11类? 商标黑白图样?一定要纯黑白吗?有灰色可以吗?还是只要没有彩色就可以? 商标注册时提交的商标图样是带颜色的,但注册申请书上勾选的商标种类是一般。 注册商标的时候,提供的商标的图案是黑白色吗?还是彩色也行? 商标指定颜色和黑白颜色申请有哪些区别? 商标申请是带颜色好还是黑白的好 牛顿定律和动量关系是什么? 微信小程序,PHP支付的问题 关于牛顿运动定律和动量守恒定律 动量守恒定律? 淘宝上面买的微信小程序靠谱吗PHP 微信小程序开发需要准备哪些资料? 如何让用户刚进入小程序就进行phpstudy操作 广州百度小程序开发多少钱? 制作一个小程序需要多少费用? 如何从动量守恒定律得出牛顿第二,第三定律?注意是动量守恒,不是动量定理 如何由动量守恒得出牛顿第二第三定律 试用牛顿运动定律推导动量守恒定律 牛顿第二定律 动能定理 机械能守恒定律 动量定理 动量守恒定律的区别 牛顿动量守恒的原理。 牛顿推导动量守恒 摄像师 摄影师 影视后期制作?? 选择哪个职业? 摄影、摄像、照相这三个词在定义有什么区别呢? 摄影师是拍电影的吗?摄像师是拍照片的吗? 婚礼需要摄影师还是摄像师 摄影师和摄像师哪个工资高