<?php
/**
* 微信小程序退款 处理类
参考
https://www.cnblogs.com/afei-qwerty/p/7922982.html
*
*/
class WeixinRefundModel extends Model { protected $SSLCERT_PATH = './apiclient_cert.pem';//证书路径
protected $SSLKEY_PATH = './apiclient_key.pem';//证书路径 // function __construct($openid,$outTradeNo,$totalFee,$outRefundNo,$refundFee){
// //初始化退款类需要的变量
// $this->openid = $openid;
// $this->outTradeNo = $outTradeNo;
// $this->totalFee = $totalFee;
// $this->outRefundNo = $outRefundNo;
// $this->refundFee = $refundFee;
// } /*
* array(9) {
["return_code"] => string(7) "SUCCESS"
["return_msg"] => string(2) "OK"
["appid"] => string(18) "****************"
["mch_id"] => string(10) "8888888"
["nonce_str"] => string(16) "V5BUsFl4ikNVwfWz"
["sign"] => string(32) "4DD91513B5CDA88C43B9D91DE6CE0C2B"
["result_code"] => string(4) "FAIL"
["err_code"] => string(13) "ORDERNOTEXIST"
["err_code_des"] => string(15) "订单不存在"
}
*
*
* array(18) {
["return_code"] => string(7) "SUCCESS"
["return_msg"] => string(2) "OK"
["appid"] => string(18) "***************"
["mch_id"] => string(10) "****************"
["nonce_str"] => string(16) "hYCjvz62vDdPfh3q"
["sign"] => string(32) "438E05D357B9090EBA0ED1A11A046B71"
["result_code"] => string(7) "SUCCESS"
["transaction_id"] => string(28) "4200000288201901186053870346"
["out_trade_no"] => string(15) "qs2878042616316"
["out_refund_no"] => string(15) "ceshi1547811669"
["refund_id"] => string(29) "**************************"
["refund_channel"] => array(0) {}
["refund_fee"] => string(1) "1"
["coupon_refund_fee"] => string(1) "0"
["total_fee"] => string(1) "1"
["cash_fee"] => string(1) "1"
["coupon_refund_count"] => string(1) "0"
["cash_refund_fee"] => string(1) "1"
}
*
* */ //通过微信api进行退款流程
public function wxrefundapi($out_trade_no,$total_fee,$refund_fee){
$parma = array(
'appid' => C('APPID'),
'mch_id' => C('MCHID'),
'nonce_str' => $this->createNoncestr(),
'out_refund_no' => $out_trade_no.rand('1111,9999'), //由后端生成的退款单号,需要保证唯一,因为多个同样的退款单号只会退款一次。
'out_trade_no' => $out_trade_no, //退款订单在支付时生成的订单号
'total_fee' => $total_fee,
'refund_fee' => $refund_fee,
'op_user_id' => C('MCHID'), //操作员 op_user_id .与商户号相同即可
); $parma['sign'] = $this->getSign($parma);
$xmldata = $this->arrayToXml($parma);
$xmlresult = $this->postXmlSSLCurl($xmldata,'https://api.mch.weixin.qq.com/secapi/pay/refund');
$result = $this->xmlToArray($xmlresult);
setlog($parma,$result,__METHOD__); if (!$result){
$result_arr = [
'num' => '',
'desc' => '接口错误',
];
return $result_arr;
} if ($result['result_code'] != 'SUCCESS'){
$result_arr = [
'num' => '-1',
'desc' => $result['err_code_des']
];
} else {
$result_arr = [
'num' => '',
'desc' => '退款成功',
'data' => $result['refund_id']
];
} return $result_arr;
} /*
* 生成随机字符串方法
*/
protected function createNoncestr($length = ){
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for ( $i = ; $i < $length; $i++ ) {
$str.= substr($chars, mt_rand(, strlen($chars)-), );
}
return $str;
} /*
* 对要发送到微信统一下单接口的数据进行签名
*/
protected function getSign($Obj){
foreach ($Obj as $k => $v){
$Parameters[$k] = $v;
}
//签名步骤一:按字典序排序参数
ksort($Parameters);
$String = $this->formatBizQueryParaMap($Parameters, false);
//签名步骤二:在string后加入KEY
$String = $String."&key=".C('WEIXIN_PAY_KEY');
//签名步骤三:MD5加密
$String = md5($String);
//签名步骤四:所有字符转为大写
$result_ = strtoupper($String);
return $result_;
} /*
*排序并格式化参数方法,签名时需要使用
*/
protected function formatBizQueryParaMap($paraMap, $urlencode)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v)
{
if($urlencode)
{
$v = urlencode($v);
}
//$buff .= strtolower($k) . "=" . $v . "&";
$buff .= $k . "=" . $v . "&";
} $reqPar = '';
if (strlen($buff) > )
{
$reqPar = substr($buff, , strlen($buff)-);
}
return $reqPar;
} //数组转字符串方法
protected function arrayToXml($arr){
$xml = "<xml>";
foreach ($arr as $key=>$val)
{
if (is_numeric($val)){
$xml.="<".$key.">".$val."</".$key.">";
}else{
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
}
$xml.="</xml>";
return $xml;
} protected function xmlToArray($xml){
$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $array_data;
} //需要使用证书的请求
function postXmlSSLCurl($xml,$url,$second=)
{
$ch = curl_init();
//超时时间
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
//这里设置代理,如果有的话
//curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
//设置header
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//设置证书
//使用证书:cert 与 key 分别属于两个.pem文件
//默认格式为PEM,可以注释
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
curl_setopt($ch, CURLOPT_SSLCERT, $this->SSLCERT_PATH);
//默认格式为PEM,可以注释
curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
curl_setopt($ch, CURLOPT_SSLKEY, $this->SSLKEY_PATH);
//post提交方式
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
$data = curl_exec($ch);
//返回结果
if ($data) {
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
echo "curl出错,错误码:$error" . "<br>";
curl_close($ch);
return false;
}
} }

微信小程序退款 处理类的更多相关文章

  1. 微信小程序初探【类微信UI聊天简单实现】

    微信小程序最近很火,火到什么程度,只要你一打开微信,就是它的身影,几乎你用的各个APP都可以在微信中找到它的复制版,另外官方自带的跳一跳更是将它推到了空前至高的位置.对比公众号,就我的感觉来说,有以下 ...

  2. .NET Core 微信小程序退款——(统一退款)

    继上一篇".NET Core 微信小程序支付——(统一下单)后",本文将实现统一退款功能,能支付就应该能退款嘛,一般涉及到钱的东西都会比较敏感,所以在设计退款流程时一定要严谨,不能 ...

  3. 微信小程序退款【证书的使用】

    1,官方文档的地址 2,在官方文档中给出了证书使用的链接,如下: [其实只有证书的获取,选择.具体的证书怎么在代码中使用,文档中并没有给出说明] 3,第一步准备请求的参数,里面只有五个是参数是有点特殊 ...

  4. 微信小程序 - Util工具类

    /utils/utils.js   已经扩展到App对象中,Page方法中直接使用  app.util.method(...) 调用. 1. 扩展String.replaceAll JS默认值提供re ...

  5. 微信小程序支付及退款流程详解

    微信小程序的支付和退款流程 近期在做微信小程序时,涉及到了小程序的支付和退款流程,所以也大概的将这方面的东西看了一个遍,就在这篇博客里总结一下. 首先说明一下,微信小程序支付的主要逻辑集中在后端,前端 ...

  6. 微信小程序社区上线

    微信小程序公测了! 从首次得到微信小程序发布的消息开始,小木和Michael就进入了紧急备战状态. 除了要快速学通微信小程序开发之外,我们还做了这些工作: 1.录制全球首套微信小程序实战项目类视频教程 ...

  7. 微信小程序开发小技巧——单击事件传参、动态修改样式、轮播样式修改等

    一. 脚本部分: 1. 表达式无效的处理: 如果你发现自己编写的表达式无效或者数据不展示,那么请先检查你的表达式是否有添加{{}},小程序中全部都要添加的,只要是在模板中调用js中的数据 2. 获取元 ...

  8. 微信小程序踩坑集合

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debu ...

  9. 微信小程序开发学习资料

    作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

随机推荐

  1. HDU 4336 Card Collector 期望dp+状压

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4336 Card Collector Time Limit: 2000/1000 MS (Java/O ...

  2. 用jar包运行带GUI的java游戏

    这是从某论坛下载的java游戏demo,由于年代久远,所以没有记下出处.重要的是,这是一个带GUI的java程序. 链接: https://pan.baidu.com/s/1LjQ2bQPXvW-ti ...

  3. Source Insight中的多行注释

    转自:http://www.cnblogs.com/dongzhiquan/archive/2013/03/04/2943448.html 我们经常要对一整段代码进行注释,很多代码编辑器都提供了这样的 ...

  4. 微信小程序倒计时实现

    思路:跟一般js倒计时一样,主要在于this的变相传递. 实现效果: wxml文件部分代码: common.js文件 : 引用页JS文件: PS: 1.在data里初始化时间格式,是避免时间加载的第1 ...

  5. 软工网络15团队作业8——Beta阶段敏捷冲刺(Day5)

    提供当天站立式会议照片一张 每个人的工作 1.讨论项目每个成员的昨天进展 赵铭: 进一步数据整理,写入数据库. 吴慧婷:主页面.查单词页面的改进.背单词界面改进. 陈敏: 单词学习功能及该界面按钮功能 ...

  6. PAT 甲级 1004 Counting Leaves

    https://pintia.cn/problem-sets/994805342720868352/problems/994805521431773184 A family hierarchy is ...

  7. maven编译,控制台中文乱码解决方案

    如下图,在使用maven运行后,在控制台看到中文展示乱码 出现这个的原因是源码使用UTF-8,但是maven编译的时候使用GBK标准,如下图   为了让maven编译的时候使用UTF-8标准,使用在p ...

  8. API的HTTP Status Code

    响应中的状态码 状态码 定义 说明 1xx 信息 接收到请求,继续处理 2xx 成功 操作成功地收到请求,理解和接受 3xx 重定向 为了完成请求,必须采取进一步擦措施 4xx 客户端错误 请求的语法 ...

  9. [转帖]HTTPS的简单说明

    HTTPS(全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版,即 HTT ...

  10. javascript获取当前日期和时间

    ){ ){ _time = year+"-"+month+"-"+date+" "+hour+":"+minu+&quo ...