作者 lihan
1 个管道 的构建 通过 耗费 1 秒

退货&退款

... ... @@ -18,128 +18,132 @@ class ZjOrderController extends AdminBaseController
/**
* 订单列表
*/
public function index(){
$where['o.delete_time']=0;
$arr=[];
$where1=[];
if ($this->request->param()){
$arr=input('param.');
if (!empty($arr['uid'])){
$where['o.uid']=$arr['uid'];
public function index()
{
$where['o.delete_time'] = 0;
$arr = [];
$where1 = [];
if ($this->request->param()) {
$arr = input('param.');
if (!empty($arr['uid'])) {
$where['o.uid'] = $arr['uid'];
}
if (!empty($arr['yi'])){
$where['o.cid']=$arr['yi'];
if (!empty($arr['yi'])) {
$where['o.cid'] = $arr['yi'];
}
if (!empty($arr['er'])){
$where['o.cids']=['like','%-'.$arr['er'].'-%'];
if (!empty($arr['er'])) {
$where['o.cids'] = ['like', '%-' . $arr['er'] . '-%'];
}
if (!empty($arr['step'])){
$where['o.step']=$arr['step'];
if (!empty($arr['step'])) {
$where['o.step'] = $arr['step'];
}
if (!empty($arr['num'])){
$where['o.order_num']=$arr['num'];
if (!empty($arr['num'])) {
$where['o.order_num'] = $arr['num'];
}
if (!empty($arr['name'])){
$where['o.name']=$arr['name'];
if (!empty($arr['name'])) {
$where['o.name'] = $arr['name'];
}
if (!empty($arr['mobile'])){
$where['o.mobile']=$arr['mobile'];
if (!empty($arr['mobile'])) {
$where['o.mobile'] = $arr['mobile'];
}
if (!empty($arr['start_time'])){
$where['o.create_time']=['egt',strtotime($arr['start_time'])];
if (!empty($arr['start_time'])) {
$where['o.create_time'] = ['egt', strtotime($arr['start_time'])];
}
if (!empty($arr['end_time'])){
$where1['o.create_time']=['elt',strtotime($arr['end_time'])];
if (!empty($arr['end_time'])) {
$where1['o.create_time'] = ['elt', strtotime($arr['end_time'])];
}
}
$all=Db::name('zj_order')->alias('o')->join('user u','o.uid=u.id','left')
->where($where)->where($where1)->order('create_time','desc')->field('o.*,u.user_nickname')->paginate(15);
$all = Db::name('zj_order')->alias('o')->join('user u', 'o.uid=u.id', 'left')
->where($where)->where($where1)->order('create_time', 'desc')->field('o.*,u.user_nickname')->paginate(15);
$all->appends($arr);
//查询商品分类
$cate=Db::name('zj_category')->where(['delete_time'=>'0'])->field('name,id,cid,grade')->select()->toArray();
$cate1=[];
$cate2=[];
foreach ($cate as $k=>$v){
if ($cate[$k]['grade']==1){
$cate1[$k]=$cate[$k];
}else{
$cate2[$k]=$cate[$k];
$cate = Db::name('zj_category')->where(['delete_time' => '0'])->field('name,id,cid,grade')->select()->toArray();
$cate1 = [];
$cate2 = [];
foreach ($cate as $k => $v) {
if ($cate[$k]['grade'] == 1) {
$cate1[$k] = $cate[$k];
} else {
$cate2[$k] = $cate[$k];
}
}
$cate1=array_values($cate1);
$cate2=array_values($cate2);
$cate1 = array_values($cate1);
$cate2 = array_values($cate2);
$this->assign('start_time', !empty($arr['start_time']) ? $arr['start_time'] : '');
$this->assign('end_time', !empty($arr['end_time']) ? $arr['end_time'] : '');
$this->assign('uid',!empty($arr['uid'])?$arr['uid']:'');
$this->assign('step',!empty($arr['step'])?$arr['step']:'');
$this->assign('num',!empty($arr['num'])?$arr['num']:'');
$this->assign('name',!empty($arr['name'])?$arr['name']:'');
$this->assign('mobile',!empty($arr['mobile'])?$arr['mobile']:'');
$this->assign('yi',!empty($arr['yi'])?$arr['yi']:'');
$this->assign('er',!empty($arr['er'])?$arr['er']:'');
$this->assign('page',$all->render());
$this->assign('all',$all->items());
$this->assign('cate1',$cate1);
$this->assign('cate2',$cate2);
$this->assign('uid', !empty($arr['uid']) ? $arr['uid'] : '');
$this->assign('step', !empty($arr['step']) ? $arr['step'] : '');
$this->assign('num', !empty($arr['num']) ? $arr['num'] : '');
$this->assign('name', !empty($arr['name']) ? $arr['name'] : '');
$this->assign('mobile', !empty($arr['mobile']) ? $arr['mobile'] : '');
$this->assign('yi', !empty($arr['yi']) ? $arr['yi'] : '');
$this->assign('er', !empty($arr['er']) ? $arr['er'] : '');
$this->assign('page', $all->render());
$this->assign('all', $all->items());
$this->assign('cate1', $cate1);
$this->assign('cate2', $cate2);
return $this->fetch();
}
/**
* 订单详情
*/
public function detail(){
if ($this->request->param()){
$id=input('param.id');
$url=input('param.sta');
if ($url==1){
$url=url('index');
}elseif ($url==2){
$url=url('backlog');
public function detail()
{
if ($this->request->param()) {
$id = input('param.id');
$url = input('param.sta');
if ($url == 1) {
$url = url('index');
} elseif ($url == 2) {
$url = url('backlog');
}
$one=Db::name('zj_order')->alias('o')->join('user u','o.uid=u.id','left')->join('zj_kd k','o.kid=k.id','left')
->where('o.id',$id)->field('o.*,u.user_nickname,k.name as kname')->find();
$kd=Db::name('zj_kd')->select();
$all=Db::name('zj_order_goods')->alias('og')->join('zj_goods g','og.gid=g.id')->where('oid',$id)
$one = Db::name('zj_order')->alias('o')->join('user u', 'o.uid=u.id', 'left')->join('zj_kd k', 'o.kid=k.id', 'left')
->where('o.id', $id)->field('o.*,u.user_nickname,k.name as kname')->find();
$kd = Db::name('zj_kd')->select();
$all = Db::name('zj_order_goods')->alias('og')->join('zj_goods g', 'og.gid=g.id')->where('oid', $id)
->field('g.name,og.num')->select();
if ($one['step']>2&&$one['kid']!=0){
$kdgj=Db::name('zj_kd_order')->where(['kd_num'=>$one['kd_num']])->value('text');
$kdgj=json_decode($kdgj,true);
$this->assign('kdgj',$kdgj);
if ($one['step'] > 2 && $one['kid'] != 0) {
$kdgj = Db::name('zj_kd_order')->where(['kd_num' => $one['kd_num']])->value('text');
$kdgj = json_decode($kdgj, true);
$this->assign('kdgj', $kdgj);
}
$this->assign('kd',$kd);
$this->assign('url',$url);
$this->assign('one',$one);
$this->assign('all',$all);
$this->assign('kd', $kd);
$this->assign('url', $url);
$this->assign('one', $one);
$this->assign('all', $all);
return $this->fetch();
}
}
/**
* 订单详情修改提交
*/
public function detailPost(){
if ($this->request->param()){
$param=input('param.');
$edit=Db::name('zj_order')->update($param);
if ($param['step']=='3'){
if ($param['kid']=='0'){
$kds='自提订单';
}else{
public function detailPost()
{
if ($this->request->param()) {
$param = input('param.');
$edit = Db::name('zj_order')->update($param);
if ($param['step'] == '3') {
if ($param['kid'] == '0') {
$kds = '自提订单';
} else {
//引入快递订阅接口
$kd=new KdnApiController();
$kds=$kd->orderTracesSubByJson($param['id']);
$kds=json_decode($kds,true);
if ($kds['Success']==true){
$kds='快递状态订阅成功';
}else{
$kds='快递状态订阅失败';
$kd = new KdnApiController();
$kds = $kd->orderTracesSubByJson($param['id']);
$kds = json_decode($kds, true);
if ($kds['Success'] == true) {
$kds = '快递状态订阅成功';
} else {
$kds = '快递状态订阅失败';
}
}
}
if (empty($edit)){
$this->error('修改失败,'.$kds);
}else{
$this->success('修改成功,'.$kds);
if (empty($edit)) {
$this->error('修改失败,' . $kds);
} else {
$this->success('修改成功,' . $kds);
}
}
}
... ... @@ -148,121 +152,128 @@ class ZjOrderController extends AdminBaseController
/**
* 待处理订单列表
*/
public function backlog(){
$where['o.delete_time']=0;
$arr=[];
$where1['o.step']=['in',['2','6','8']];
if ($this->request->param()){
$arr=input('param.');
if (!empty($arr['uid'])){
$where['o.uid']=$arr['uid'];
public function backlog()
{
$where['o.delete_time'] = 0;
$arr = [];
$where1['o.step'] = ['in', ['2', '6', '8']];
if ($this->request->param()) {
$arr = input('param.');
if (!empty($arr['uid'])) {
$where['o.uid'] = $arr['uid'];
}
if (!empty($arr['step'])){
$where['o.step']=$arr['step'];
if (!empty($arr['step'])) {
$where['o.step'] = $arr['step'];
}
if (!empty($arr['num'])){
$where['o.order_num']=$arr['num'];
if (!empty($arr['num'])) {
$where['o.order_num'] = $arr['num'];
}
if (!empty($arr['name'])){
$where['o.name']=$arr['name'];
if (!empty($arr['name'])) {
$where['o.name'] = $arr['name'];
}
if (!empty($arr['mobile'])){
$where['o.mobile']=$arr['mobile'];
if (!empty($arr['mobile'])) {
$where['o.mobile'] = $arr['mobile'];
}
if (!empty($arr['start_time'])){
$where['o.create_time']=['egt',strtotime($arr['start_time'])];
if (!empty($arr['start_time'])) {
$where['o.create_time'] = ['egt', strtotime($arr['start_time'])];
}
if (!empty($arr['end_time'])){
$where1['o.create_time']=['elt',strtotime($arr['end_time'])];
if (!empty($arr['end_time'])) {
$where1['o.create_time'] = ['elt', strtotime($arr['end_time'])];
}
}
$all=Db::name('zj_order')->alias('o')->join('user u','o.uid=u.id','left')->where($where)->where($where1)
->order('create_time','desc')->field('o.*,u.user_nickname')->paginate(15);
$all = Db::name('zj_order')->alias('o')->join('user u', 'o.uid=u.id', 'left')->where($where)->where($where1)
->order('create_time', 'desc')->field('o.*,u.user_nickname')->paginate(15);
$all->appends($arr);
$this->assign('start_time', !empty($arr['start_time']) ? $arr['start_time'] : '');
$this->assign('end_time', !empty($arr['end_time']) ? $arr['end_time'] : '');
$this->assign('uid',!empty($arr['uid'])?$arr['uid']:'');
$this->assign('step',!empty($arr['step'])?$arr['step']:'');
$this->assign('num',!empty($arr['num'])?$arr['num']:'');
$this->assign('name',!empty($arr['name'])?$arr['name']:'');
$this->assign('mobile',!empty($arr['mobile'])?$arr['mobile']:'');
$this->assign('page',$all->render());
$this->assign('all',$all->items());
$this->assign('uid', !empty($arr['uid']) ? $arr['uid'] : '');
$this->assign('step', !empty($arr['step']) ? $arr['step'] : '');
$this->assign('num', !empty($arr['num']) ? $arr['num'] : '');
$this->assign('name', !empty($arr['name']) ? $arr['name'] : '');
$this->assign('mobile', !empty($arr['mobile']) ? $arr['mobile'] : '');
$this->assign('page', $all->render());
$this->assign('all', $all->items());
return $this->fetch();
}
/**
* 订单发货
*/
public function fahuo(){
if ($this->request->param()){
$param=input('param.id');
public function fahuo()
{
if ($this->request->param()) {
$param = input('param.id');
//获取订单数据
$one=Db::name('zj_order')->alias('o')->join('user u','o.uid=u.id','left')
->where('o.id',$param)->field('o.*,u.user_nickname')->find();
$one = Db::name('zj_order')->alias('o')->join('user u', 'o.uid=u.id', 'left')
->where('o.id', $param)->field('o.*,u.user_nickname')->find();
//获取快递公司数据
$kd=Db::name('zj_kd')->select();
$kd = Db::name('zj_kd')->select();
//获取订单商品
$all=Db::name('zj_order_goods')->alias('og')->join('zj_goods g','og.gid=g.id')->where('oid',$param)
$all = Db::name('zj_order_goods')->alias('og')->join('zj_goods g', 'og.gid=g.id')->where('oid', $param)
->field('g.name,og.num')->select();
if ($one['step']>2){
if ($one['step'] > 2) {
echo "<div style='width: 100%;text-align: center;padding-top: 50px'><p style='font-size: 25px'>订单已发货</p></div>";
}elseif ($one['step']==1){
} elseif ($one['step'] == 1) {
echo "<div style='width: 100%;text-align: center;padding-top: 50px'><p style='font-size: 25px'>订单未支付</p></div>";
}else{
$this->assign('kd',$kd);
$this->assign('one',$one);
$this->assign('all',$all);
} else {
$this->assign('kd', $kd);
$this->assign('one', $one);
$this->assign('all', $all);
return $this->fetch();
}
}
}
/**
* 订单发货提交
*/
public function fhPost(){
if ($this->request->param()){
$param=input('param.');
if (empty($param['kd_num'])){
public function fhPost()
{
if ($this->request->param()) {
$param = input('param.');
if (empty($param['kd_num'])) {
$this->error('快递单号不能为空');
}
$param['step']=3;
$edit=Db::name('zj_order')->update($param);
$param['step'] = 3;
$edit = Db::name('zj_order')->update($param);
//引入快递订阅接口
$kd=new KdnApiController();
$kds=$kd->orderTracesSubByJson($param['id']);
$kds=json_decode($kds,true);
if ($kds['Success']==true){
$kds='快递状态订阅成功';
}else{
$kds='快递状态订阅失败';
$kd = new KdnApiController();
$kds = $kd->orderTracesSubByJson($param['id']);
$kds = json_decode($kds, true);
if ($kds['Success'] == true) {
$kds = '快递状态订阅成功';
} else {
$kds = '快递状态订阅失败';
}
if (empty($edit)){
$this->error('订单状态更新失败,'.$kds);
}else{
$this->success('订单状态更新成功,'.$kds);
if (empty($edit)) {
$this->error('订单状态更新失败,' . $kds);
} else {
$this->success('订单状态更新成功,' . $kds);
}
}
}
/**
* 订单退款审核
*/
public function check(){
if ($this->request->param()){
$param=input('param.id');
public function check()
{
if ($this->request->param()) {
$param = input('param.id');
//获取订单数据
$one=Db::name('zj_order')->alias('o')->join('user u','o.uid=u.id','left')->where('o.id',$param)
$one = Db::name('zj_order')->alias('o')->join('user u', 'o.uid=u.id', 'left')->where('o.id', $param)
->field('o.*,u.user_nickname')->find();
//获取订单商品
$all=Db::name('zj_order_goods')->alias('og')->join('zj_goods g','og.gid=g.id')->where('oid',$param)
$all = Db::name('zj_order_goods')->alias('og')->join('zj_goods g', 'og.gid=g.id')->where('oid', $param)
->field('g.name,g.price,og.num')->select();
if ($one['step']<6){
if ($one['step'] < 6) {
echo "<div style='width: 100%;text-align: center;padding-top: 50px'><p style='font-size: 25px'>订单未退货</p></div>";
}elseif ($one['step']>6){
} elseif ($one['step'] > 6) {
echo "<div style='width: 100%;text-align: center;padding-top: 50px'><p style='font-size: 25px'>退款审核通过</p></div>";
}else{
$this->assign('one',$one);
$this->assign('all',$all);
} else {
$this->assign('one', $one);
$this->assign('all', $all);
return $this->fetch();
}
}
... ... @@ -271,66 +282,95 @@ class ZjOrderController extends AdminBaseController
/**
* 订单退款审核提交
*/
public function checkPost(){
if ($this->request->param()){
$param=input('param.');
public function checkPost()
{
if ($this->request->param()) {
$param = input('param.');
//判断审核是否通过
if (!empty($param['sta'])){
$param['step']=5;
if (!empty($param['sta'])) {
$param['step'] = 5;
unset($param['sta']);
$edit=Db::name('zj_order')->update($param);
}else{
$param['step']=7;
$edit=Db::name('zj_order')->update($param);
$edit = Db::name('zj_order')->update($param);
} else {
$param['step'] = 7;
$edit = Db::name('zj_order')->update($param);
}
if (empty($edit)){
if (empty($edit)) {
$this->error('订单状态更新失败');
}else{
} else {
$this->success('订单状态更新成功');
}
}
}
/**
* 订单退款
*/
public function refund(){
if ($this->request->param()){
$param=input('param.id');
public function refund()
{
if ($this->request->param()) {
$param = input('param.id');
//获取订单数据
$one=Db::name('zj_order')->alias('o')->join('user u','o.uid=u.id','left')->where('o.id',$param)
$one = Db::name('zj_order')->alias('o')->join('user u', 'o.uid=u.id', 'left')->where('o.id', $param)
->field('o.*,u.user_nickname')->find();
//获取订单商品
$all=Db::name('zj_order_goods')->alias('og')->join('zj_goods g','og.gid=g.id')->where('oid',$param)
$all = Db::name('zj_order_goods')->alias('og')->join('zj_goods g', 'og.gid=g.id')->where('oid', $param)
->field('g.name,g.price,og.num')->select();
if ($one['step']>8){
if ($one['step'] > 8) {
echo "<div style='width: 100%;text-align: center;padding-top: 50px'><p style='font-size: 25px'>订单已退款</p></div>";
}elseif ($one['step']<8){
} elseif ($one['step'] < 8) {
echo "<div style='width: 100%;text-align: center;padding-top: 50px'><p style='font-size: 25px'>订单状态错误</p></div>";
}else{
$this->assign('one',$one);
$this->assign('all',$all);
} else {
$this->assign('one', $one);
$this->assign('all', $all);
return $this->fetch();
}
}
}
/**
* 订单退款提交
*/
public function refundPost(){
if ($this->request->param()){
$param=input('param.');
if ($param['tui']<=0){
$this->error('退款金额需大于0');
public function refundPost()
{
if ($this->request->param()) {
$param = input('param.');
if (Db::name('zj_order')->where(['id' => $param['id']])->value('step') == 8) {
if ($param['tui'] <= 0) {
$this->error('退款金额需大于0');
}
$param['step'] = 9;
unset($param['tui']);//删除无用数据
$return = $this->wxRefund($param['id'], 1);
var_dump($return);
exit();
$edit = Db::name('zj_order')->update($param);
if (empty($edit)) {
$this->error('订单退款失败');
} else {
$this->success('订单退款成功');
}
} else {
$this->error('非法操作');
}
}
}
$param['step']=9;
unset($param['tui']);//删除无用数据
$edit=Db::name('zj_order')->update($param);
if (empty($edit)){
$this->error('订单退款失败');
}else{
$this->success('订单退款成功');
private function wxRefund($oid, $refundFee)
{
$info = Db::name('zj_order')->field('order_num,whole,whole_num,out_trade_no,step')->where(['id' => $oid])->find();
if ($info['step'] == 8) {
$totalFee = $info['whole'] - $info['whole_num'];
if($refundFee > $totalFee) {
$this->error('退款金额不能大于实际支付金额');
}else {
require_once EXTEND_PATH . '/Refund.php';
$refund = new \Refund($info['out_trade_no'], $totalFee, $info['order_num'], $refundFee);
$refund->refund();
}
} else {
$this->error('非法操作');
}
}
... ...
<?php
class Payment {
class Payment
{
protected $attach;
protected $openid;
protected $body;
protected $total_fee;
function __construct($attach=null, $openid=null, $body=null, $total_fee=null) {
function __construct($attach = null, $openid = null, $body = null, $total_fee = null)
{
$this->attach = $attach;
$this->openid = $openid;
$this->body = $body;
... ... @@ -18,19 +20,21 @@ class Payment {
* 对外暴露的支付接口
* @return array
*/
public function pay() {
public function pay()
{
return $this->weixinPay();
}
private function weixinPay() {
private function weixinPay()
{
//统一下单接口
$unifiedorder = $this->unifiedorder();
$parameters = array(
'appId' => config('AppID'),
'appId' => config('AppID'),
'timeStamp' => '' . time() . '', //时间戳
'nonceStr' => $this->createNoncestr(), //随机串
'package' => 'prepay_id=' . $unifiedorder['prepay_id'], //数据包
'signType' => 'MD5'//签名方式
'nonceStr' => $this->createNoncestr(), //随机串
'package' => 'prepay_id=' . $unifiedorder['prepay_id'], //数据包
'signType' => 'MD5'//签名方式
);
//签名
$parameters['paySign'] = $this->getSign($parameters);
... ... @@ -38,20 +42,21 @@ class Payment {
}
//统一下单接口
private function unifiedorder() {
private function unifiedorder()
{
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
$parameters = array(
'appid' => config('AppID'),
'mch_id' => config('MchId'),
'nonce_str' => $this->createNoncestr(),
'body' => $this->body,
'out_trade_no' => config('MchId').time(),
'total_fee' => $this->total_fee,
'spbill_create_ip' => '114.215.223.17', //终端IP
'notify_url' => 'http://integral.w.bronet.cn/pay/Pay/notify',
'openid' => $this->openid,
'trade_type' => 'JSAPI',//交易类型
'attach' => $this->attach
'appid' => config('AppID'),
'mch_id' => config('MchId'),
'nonce_str' => $this->createNoncestr(),
'body' => $this->body,
'out_trade_no' => config('MchId') . time(),
'total_fee' => $this->total_fee,
'spbill_create_ip' => '114.215.223.17', //终端IP
'notify_url' => 'http://integral.w.bronet.cn/pay/Pay/notify',
'openid' => $this->openid,
'trade_type' => 'JSAPI',//交易类型
'attach' => $this->attach
);
//统一下单签名
$parameters['sign'] = $this->getSign($parameters);
... ... @@ -61,7 +66,8 @@ class Payment {
}
//作用:生成签名
private function getSign($Obj) {
private function getSign($Obj)
{
foreach ($Obj as $k => $v) {
$Parameters[$k] = $v;
}
... ... @@ -77,7 +83,8 @@ class Payment {
return $result_;
}
private static function postXmlCurl($xml, $url, $second = 30) {
private static function postXmlCurl($xml, $url, $second = 30)
{
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
... ... @@ -108,7 +115,8 @@ class Payment {
}
//数组转换成xml
private function arrayToXml($arr) {
private function arrayToXml($arr)
{
$xml = "<root>";
foreach ($arr as $key => $val) {
if (is_array($val)) {
... ... @@ -123,7 +131,8 @@ class Payment {
//xml转换成数组
private function xmlToArray($xml) {
private function xmlToArray($xml)
{
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
... ... @@ -132,7 +141,8 @@ class Payment {
}
//作用:产生随机字符串,不长于32位
private function createNoncestr($length = 32) {
private function createNoncestr($length = 32)
{
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
... ... @@ -142,7 +152,8 @@ class Payment {
}
///作用:格式化参数,签名过程需要使用
private function formatBizQueryParaMap($paraMap, $urlencode) {
private function formatBizQueryParaMap($paraMap, $urlencode)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
... ... @@ -151,31 +162,32 @@ class Payment {
}
$buff .= $k . "=" . $v . "&";
}
$reqPar='';
$reqPar = '';
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
public function handleNotify() {
public function handleNotify()
{
//$postXml = $GLOBALS["HTTP_RAW_POST_DATA"]; //接收微信参数
$postXml=file_get_contents("php://input");
$postXml = file_get_contents("php://input");
cache('xml', $postXml);
if (empty($postXml)) {
return false;
}else {
} else {
$data = $this->xmlToArray($postXml);
if($data['return_code'] == 'SUCCESS' && $data['result_code'] == 'SUCCESS') {
if ($data['return_code'] == 'SUCCESS' && $data['result_code'] == 'SUCCESS') {
$data = (array)simplexml_load_string($postXml, 'SimpleXMLElement', LIBXML_NOCDATA);
$signA = "appid=".$data['appid']."&attach=".$data['attach']."&bank_type=".$data['bank_type']."&cash_fee=".$data['cash_fee']."&fee_type=".$data['fee_type']."&is_subscribe=".$data['is_subscribe']."&mch_id=".$data['mch_id']."&nonce_str=".$data['nonce_str']."&openid=". $data['openid']."&out_trade_no=".$data['out_trade_no']."&result_code=".$data['result_code']."&return_code=".$data['return_code']."&time_end=".$data['time_end']."&total_fee=".$data['total_fee']."&trade_type=".$data['trade_type']."&transaction_id=".$data['transaction_id']."&key=".config('Key');
$signA = "appid=" . $data['appid'] . "&attach=" . $data['attach'] . "&bank_type=" . $data['bank_type'] . "&cash_fee=" . $data['cash_fee'] . "&fee_type=" . $data['fee_type'] . "&is_subscribe=" . $data['is_subscribe'] . "&mch_id=" . $data['mch_id'] . "&nonce_str=" . $data['nonce_str'] . "&openid=" . $data['openid'] . "&out_trade_no=" . $data['out_trade_no'] . "&result_code=" . $data['result_code'] . "&return_code=" . $data['return_code'] . "&time_end=" . $data['time_end'] . "&total_fee=" . $data['total_fee'] . "&trade_type=" . $data['trade_type'] . "&transaction_id=" . $data['transaction_id'] . "&key=" . config('Key');
$sign = strtoupper(MD5($signA));
if($sign == $data['sign']) {
if ($sign == $data['sign']) {
return $data;
}else {
} else {
return false;
}
}else {
} else {
return false;
}
}
... ...
<?php
class Refund
{
protected $SSLCERT_PATH = 'cert/apiclient_cert.pem';//证书路径
protected $SSLKEY_PATH = 'cert/apiclient_key.pem';//证书路径
function __construct($outTradeNo, $totalFee, $outRefundNo, $refundFee)
{
//初始化退款类需要的变量
$this->outTradeNo = $outTradeNo;
$this->totalFee = $totalFee;
$this->outRefundNo = $outRefundNo;
$this->refundFee = $refundFee;
}
public function refund()
{
//对外暴露的退款接口
$result = $this->wxrefundapi();
return $result;
}
private function wxrefundapi()
{
//通过微信api进行退款流程
$parma = array(
'appid' => config('AppID'),
'mch_id' => config('MchId'),
'nonce_str' => $this->createNoncestr(),
'out_refund_no' => $this->outRefundNo,
'out_trade_no' => $this->outTradeNo,
'total_fee' => $this->totalFee,
'refund_fee' => $this->refundFee,
'op_user_id' => config('MchId')
);
$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);
//print_r($result);
return $result;
}
//需要使用证书的请求
function postXmlSSLCurl($xml, $url, $second = 30)
{
$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;
}
}
//作用:产生随机字符串,不长于32位
private function createNoncestr($length = 32)
{
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
//作用:生成签名
private function getSign($Obj)
{
foreach ($Obj as $k => $v) {
$Parameters[$k] = $v;
}
//签名步骤一:按字典序排序参数
ksort($Parameters);
$String = $this->formatBizQueryParaMap($Parameters, false);
//签名步骤二:在string后加入KEY
$String = $String . "&key=" . $this->key;
//签名步骤三:MD5加密
$String = md5($String);
//签名步骤四:所有字符转为大写
$result_ = strtoupper($String);
return $result_;
}
///作用:格式化参数,签名过程需要使用
private function formatBizQueryParaMap($paraMap, $urlencode)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
if ($urlencode) {
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
$reqPar;
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
//数组转换成xml
private function arrayToXml($arr)
{
$xml = "<root>";
foreach ($arr as $key => $val) {
if (is_array($val)) {
$xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";
} else {
$xml .= "<" . $key . ">" . $val . "</" . $key . ">";
}
}
$xml .= "</root>";
return $xml;
}
//xml转换成数组
private function xmlToArray($xml)
{
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
$val = json_decode(json_encode($xmlstring), true);
return $val;
}
}
\ No newline at end of file
... ...