都已经做两遍公众号了,还是有时候总卡壳,今天把所有的问题都遇到的差不多了,咱就好好的总结总结

先说支付问题

申请下来公众号后,先将后台该填的都填写好

需要用到的公众号信息

下面就开始要进入代码状态了

先说支付:

需要放在function.php 里的方法

吊起微信支付最重要的方法(一)

/*** 直接生成微信jssdk_config* @echo string $jssdk Jssdk_config* @author 5heAtMin9 <sheatming@foxmail.com>*/function wx_jssdk_config($debug='true'){$getSignPackage = wx_getSignPackage();$jssdk = '<script src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>';$jssdk .= '<script>wx.config({debug: '.$debug.', appId: "'.$getSignPackage['appId'].'",timestamp: "'.$getSignPackage['timestamp'].'",nonceStr: "'.$getSignPackage['nonceStr'].'",signature: "'.$getSignPackage['signature'].'",jsApiList: ["checkJsApi","onMenuShareTimeline","onMenuShareAppMessage","onMenuShareQQ", "onMenuShareWeibo","onMenuShareQZone","hideMenuItems","showMenuItems","hideAllNonBaseMenuItem","showAllNonBaseMenuItem","translateVoice","startRecord","stopRecord","onVoiceRecordEnd","playVoice","onVoicePlayEnd","pauseVoice","stopVoice","uploadVoice","downloadVoice","chooseImage","previewImage","uploadImage","downloadImage","getNetworkType","openLocation","getLocation","hideOptionMenu","showOptionMenu","closeWindow","scanQRCode","chooseWXPay","openProductSpecificView","addCard","chooseCard","openCard"],});
</script>';echo $jssdk;
}

吊起微信支付最重要的方法(二)

/*** 微信支付* @param string $openid 支付者openid* @param string $url 回调地址* @param string $od_title 订单标题* @param string $od_money 价格* @param string $od_id 订单编号* @return string 状态* @author 5heAtMin9 <sheatming@foxmail.com>*/
function wx_h5_pay($openid, $url, $od_title,  $od_money, $od_id)
{if(is_null($url) || $url == ''){$url = 'http://'. $_SERVER['HTTP_HOST'].'/weixinpay/notify_url.php';}$pay = array('appid' => C('WX_APPID'),'mch_id' => C('WX_MCHID'),'nonce_str' => getRandom(32),'body' => $od_title,'out_trade_no' => $od_id,'total_fee' => $od_money * 100,'spbill_create_ip' => get_client_ip(),'notify_url' => $url,//通知地址'trade_type' => 'JSAPI','openid' => $openid,);ksort($pay);$string =  ToUrlParams($pay).'&key='.C('WX_PAYAPIKEY');$string = md5($string);$string = strtoupper($string);$pay['sign'] = $string;$postObj = simplexml_load_string(os_post('https://api.mch.weixin.qq.com/pay/unifiedorder', arrayToXml($pay)), 'SimpleXMLElement', LIBXML_NOCDATA);$time = time();$timeStamp = "$time";$nonceStr = getRandom(32);$data['package'] = 'prepay_id='.$postObj -> prepay_id;$data['timestamp'] = $timeStamp;$data['nonceStr'] = $nonceStr;$val = 'appId='.C('WX_APPID').'&';$val .='nonceStr='.$nonceStr.'&';$val .='package='.$data['package'].'&';$val .='signType=MD5&';$val .='timeStamp='.$timeStamp;$stringA = $val.'&key='.C('WX_PAYAPIKEY');$data['sign'] = strtoupper(MD5($stringA));$data['val'] = $val;return $data;
}

微信回调的方法:

<?php
/*** Created by PhpStorm.* User: Kuoer* Date: 2016/4/9* Time: 14:41*/function payok($orderid, $alipayid, $openid, $total_fee, $type)
{    $postUrl =  'http://'.$_SERVER['HTTP_HOST'].'/index.php?s=/Home/Pay/weixinpay';$curlPost = 'orderid=' . $orderid . '&alipayid=' . $alipayid . '&openid=' . $openid;$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $postUrl);                 //抓取指定网页curl_setopt($ch, CURLOPT_HEADER, 0);                    //设置headercurl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);            //要求结果为字符串且输出到屏幕上curl_setopt($ch, CURLOPT_POST, 1);                      //post提交方式curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);        // 终止从服务端进行验证curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);curl_exec($ch);                                 //运行curlcurl_close($ch);
}header('Access-Control-Allow-Origin: *');header('Access-Control-Allow-Headers: X-Requested-With');$xml = file_get_contents("php://input");$xml = simplexml_load_string($xml);//return (string)$xml->prepay_id;$success = (string)$xml->return_code;if ($success == 'SUCCESS') {$out_trade_no = (string)$xml->out_trade_no;$trade_no = (string)$xml->transaction_id;$openid = (string)$xml->openid;$pay = (string)$xml->total_fee;echo payok($out_trade_no, $trade_no, $openid, $pay, 'weixin');} else {$return_code = (string)$xml->return_code;$return_msg = (string)$xml->return_msg;echo '<xml><return_code><![CDATA[' . $return_code . ']]></return_code><return_msg><![CDATA[' . $return_msg . ']]></return_msg></xml>';}

微信回调方法处理方法  需放在function.php里

这两个方法是处理微信给返回的一个支付成功的数据,这些数据都生成了一个txt文件

function quzhi( $s, $xml ) {$str = explode( '<' . $s . '>', $xml );$str = explode( '</' . $s . '>', $str[ 1 ] );return guolv( trim( $str[ 0 ] ) );
}function guolv( $str ) {$s = array( '!', '-', '[', 'CDATA', ']', '<', '>' );return str_replace( $s, '', $str );
}

微信回调,我自己设置指定的那个单独创建的控制器里的方法:

<?php
namespace Home\Controller;
use Think\Controller;
use User\Api\UserApi;class PayController extends HomeController {protected function _initialize(){/* 读取站点配置 */$config = api('Config/lists');C($config); //添加配置
     }public function weixinpay(){$orderid = I('orderid');$suijishu = rand(100000000,99999999999);$val = 'appid='.C('WX_APPID').'&';$val .='mch_id='.C('WX_MCHID').'&';$val .='nonce_str='.$suijishu.'&';$val .='out_trade_no='.$orderid;$stringA = $val.'&key='.C('WX_PAYAPIKEY');$url = 'https://api.mch.weixin.qq.com/pay/orderquery';$post_data = '<xml><appid>'.C('WX_APPID').'</appid><mch_id>'.C('WX_MCHID').'</mch_id><nonce_str>'.$suijishu.'</nonce_str><out_trade_no>'.$orderid.'</out_trade_no><sign>'.strtoupper(MD5($stringA)).'</sign></xml>';$ch = curl_init();curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_HEADER, false);curl_setopt($ch, CURLOPT_URL,$url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //要求结果为字符串且输出到屏幕上curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //不验证证书curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //不验证证书$res = curl_exec($ch);curl_close($ch);//上面都是固定死的,下面才开始写你要修改的数据if(quzhi('trade_state',$res) == 'SUCCESS'){$orderid = I('orderid');$data['gwc_danhao'] = I('orderid');$data['money'] = quzhi('total_fee',$res);$data['liushui_hao'] = quzhi('transaction_id',$res);$on = M('yy_pay')->where($data)->find();//没有找到这条数据就去执行下面的添加if(!$on){$gwc_id['danhao'] = I('orderid');$gwc_uid = M('yy_goumai')->where($gwc_id)->getField('uid');$data['uid'] = $gwc_uid;$data['time'] = time();M('yy_pay')->add($data);$price = M('yy_goumai')->where($gwc_id)->sum('zongjia');if($price*100 != $data['money']){$this->error('支付异常');}else{$gouwuche = M('yy_goumai')->where($gwc_id)->select();foreach($gouwuche as $k=>$v){$gwc_zt['utime']=time();$gwc_zt['state']=1;M('yy_goumai')->where(array('id'=>$v['id']))->setField($gwc_zt);}}}}}
}

好像支付就这些啦,如果有没说的地方可以联系我QQ:507285474

检测用户是否登录

/*** 检测用户是否登录* @return integer 0-未登录,大于0-当前登录用户ID* @author 麦当苗儿 <zuojiazi@vip.qq.com>*/
function is_login(){$user = session('user_auth');if (empty($user)) {return 0;} else {return session('user_auth');}
}

 

 检测用户是否注册

/*** 检测用户是否微信登录* @return integer 0-未登录,大于0-当前登录用户ID* @author 5heAtMin9 <sheatming@foxmail.com>*/function is_wx_login(){$backurl = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'];$puid = I('sharecode',0);if(!is_login()){if(I('get.code')){$code = I('get.code');$appid = C('WX_APPID');$secret = C('WX_APPSECRET');$api = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid . '&secret=' . $secret . '&code=' . $code . '&grant_type=authorization_code';$json = os_get($api);$array = json_decode($json, true);//
            $openid = $array['openid'];$token = $array['access_token'];//
            $where['openid'] = $openid;$user = M('ucenter_member')->where($where)->find();if(!$user){//没注册$api = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $token . '&openid=' . $openid . '&lang=zh_CN';$json = os_get($api);$array = json_decode($json, true);$tmp = rand(11111111111,99999999999);$access_info = array('type' => '2', //1.普通账号  2.微信账号  3.手机号  4.邮箱'username' => $tmp, //微信注册 随机分配账号'openid' => $openid,'email' => $tmp.'@rand.com','status' => 1,'reg_time' => time(),);$uid = M('ucenter_member') -> add($access_info);$user_info = array('uid' => $uid,'openid' => $array['openid'],'nickname' => $array['nickname'],'sex' => $array['sex'],'country' => $array['country'],'city' => $array['city'],'province' => $array['province'],'headimgurl' => $array['headimgurl'],'puid' => $puid,'status' => 1);$re = M('member') -> add($user_info);session('user_auth',$uid);$url = str_replace('Home/', '', U('wechat.php?User/login', array('openid' => $openid,'backurl'=>urlencode($backurl),'y' => md5(time().'5heAtMin9'))));redirect($url);
//
            } else {session('user_auth',$user['id']);//注册了 跳转到登陆界面$url = str_replace('Home/', '', U('wechat.php?User/login', array('openid' => $openid,'backurl'=>urlencode($backurl),'y' => md5(time().'5heAtMin9'))));redirect($url);return $url;}//return $array;} else {$appid = C('WX_APPID');redirect('https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.'&redirect_uri='.urlencode($backurl).'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect');}} else {return is_login();}
}

我们接着说退款:

点击退款传过来值,处理一下

最主要的是这个 function.php里的wx_tuikaun()方法

 public function tuikuan(){$wher['id'] =I('id');$data['gwc_danhao'] = M('yy_goumai')->where($wher)->getField('danhao');$re = M('yy_pay')->where($data)->find();if($re){$gwc_arr['danbao'] = $re['gwc_danhao'];$gm = M('yy_goumai')->where($gwc_arr)->find();//退款需要用的商品总价
//            $gwc_tui_id = M('yy_goumai')->where(array('id'=>I('id')))->find();//退款需要用的商品单价(不是加上邮费的后的总金额)
//            dump($gwc_tui_id);die();$suijishu = time().rand(111111111,999999999).$gm['danhao'];//退款需要用的随机数//1.退款商品的单价(不是加上邮费的后的总金额),2.支付成功后生成的流水单号,3.微信支付平台上要显示的流水号,(用时间戳 + 随机数 + 用户id);4.总价格。$tuikuan = wx_tuikuan($gm['danjia'],$re['liushui_hao'],$suijishu,$gm['zongjia']);if($tuikuan -> result_code == 'SUCCESS'){M('yy_pay')->where($data)->setField('tuikuan','1');$gwc_zt['state'] = '-2';$gwc_zt['utime'] = time();$yes = M('yy_goumai')->where($wher)->setField($gwc_zt);if($yes){$this->success('退款成功');}else{$this->error('退款失败');}}}else{$this->error('出错啦!订单号参数值不对!');}}

function.php  里的  wx_tuikaun()方法

/*** 微信退款* @param $od_money 退款金额* @param $od_id 订单编号* @return SimpleXMLElement*/
function wx_tuikuan( $od_money, $od_id, $back_id, $zhifu ) {$pay = array('appid' => C( 'WX_APPID' ),'mch_id' => C( 'WX_MCHID' ),'nonce_str' => getRandom( 32 ),'op_user_id' => C( 'WX_MCHID' ),'out_refund_no' => $back_id,'transaction_id' => $od_id,'refund_fee' => $od_money * 100,'total_fee' => $zhifu * 100,);ksort( $pay );$string = ToUrlParams( $pay ) . '&key=' . C( 'WX_PAYAPIKEY' );$string = md5( $string );$string = strtoupper( $string );$pay[ 'sign' ] = $string;$tmp = zhifu( 'https://api.mch.weixin.qq.com/secapi/pay/refund', arrayToXml( $pay ) );
//    dump($tmp);die();$postObj = simplexml_load_string( $tmp, 'SimpleXMLElement', LIBXML_NOCDATA );return $postObj;}

/*** 微信退款* @param $od_money 退款金额* @param $od_id 订单编号* @return SimpleXMLElement*/
function wx_refund($od_money, $od_id, $back_id)
{$pay = array('appid' => C('WX_APPID'),'mch_id' => C('WX_MCHID'),'nonce_str' => getRandom(32),'op_user_id' => C('WX_MCHID'),'out_refund_no' => $back_id,'out_trade_no' => $od_id,'refund_fee' => $od_money * 100,'total_fee' => $od_money * 100,);ksort($pay);$string =  ToUrlParams($pay).'&key='.C('WX_PAYAPIKEY');$string = md5($string);$string = strtoupper($string);$pay['sign'] = $string;$tmp = zhifu('https://api.mch.weixin.qq.com/secapi/pay/refund', arrayToXml($pay));$postObj = simplexml_load_string($tmp, 'SimpleXMLElement', LIBXML_NOCDATA);return $postObj;
}

然后好像没有了!!!!

再见!!!

转载于:https://www.cnblogs.com/zc290987034/p/7544747.html

微信公众号整套逻辑的支付和退款相关推荐

  1. vue 在微信公众号里使用支付宝支付(h5支付宝支付)

    vue 在微信公众号里使用支付宝支付(h5支付宝支付) 需求:在微信公众号里面支持支付宝支付. 思路:微信是不能直接调用支付宝的,所以我们需要使用一个中间页提示用户在浏览器中打开,然后进行支付宝网页或 ...

  2. 微信公众号中的支付宝支付与微信支付 支付宝支付问题(微信bug)

    一般,在微信公众号中的商城都是需要支持微信支付和支付宝支付的,当然,较大的公司对于鹅厂和阿里的站队就不说了,所以这里简单记录一下支付宝支付和微信支付的主要流程.说是简单介绍,这是因为确实不难,因为前端 ...

  3. 微信公众号之刷卡支付

    此篇文章具体来聊聊微信刷卡支付 刷卡支付-官方文档 场景介绍 步骤1:用户选择刷卡支付付款并打开微信,进入"我"->"钱包"->"刷卡&q ...

  4. 支付宝支付功能实现原理,微信公众号中实现支付宝支付功能开发流程

    这篇文章使用一些简单的代码例子来解释微信接入支付宝支付功能的操作步骤,即使新手也可以轻松参透的. 第三方支付是指具备一定实力和信誉保障的独立机构,采用与各大银行签约的方式,通过与银行支付结算系统接口对 ...

  5. 微信公众号,关联网页支付功能(公众号支付)的实现

    公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付.应用场景有: 1. 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付 ...

  6. 微信公众号h5使用jsapi支付

    准备工作 准备好公众号及支付商户号相关的:appid,商户号id,appsecret,apikey(支付密钥v2),下载好api支付证书路径,公众号中配置好业务域名(前端与域名). 域名穿透内网 我使 ...

  7. 微信公众号 H5 通联支付

    参考:https://blog.csdn.net/caimingxian401/article/details/96993205 注意:必须使用 " setTimeout " 箭头 ...

  8. vue 调用共众url_vue单页面,在微信公众号支付中遇到的URL未注册BUG解决方法-Go语言中文社区...

    今天在做微信公众号支付的时候,遇到一个bug,在当前支付页面点击支付,就会报错,提示当前页面的URL未注册.如下图: 但是,这个URL我们是在后台微信公众号配置了的,所以说不会出错. 但是我们刷新一次 ...

  9. 微信公众号支付WeixinJSBridge

    微信公众号中直接发起支付 此前开发更具官方文档一直在使用,wx.chooseWXPay方法完成支付,WeixinJSBridge最开始开发微信的时候也有使用,但是经常出问题,支付不能发起,当时查找好的 ...

  10. 微信公众号支付缺少参数问题

    最近在做微信公众号支付的内容.调用微信公众号给出的支付方法 发现总是报这样一个错误:调用微信支付JSAPI 缺少参数 appId.检查了很久,还是没发现问题在哪里.于是只好采用微信支付的另一种方法: ...

最新文章

  1. 生产环境主从数据同步不了?
  2. Java与Unicode
  3. 对字符串数组排序,使所有变位词都相邻(C++)
  4. 【测试点分析】1010 Radix (25 分)_37行代码AC
  5. APIO2010巡逻(树上带权直径)
  6. easyui 使用笔记
  7. 关于跨域的处理的几种方法的整理
  8. 物联网四大产业群的典型应用场景
  9. 【教程New】IDM安装使用教程--便捷下载网页视频的好方法
  10. 2022最新分布式面试题合集,轻松应对Java面试
  11. 如何选择适合的伺服电机?
  12. 重现Struts1的操纵classLoader漏洞
  13. 技术总监需要做些什么?
  14. 纯html+css实现点击切换tab页
  15. 设计分享|基于51单片机的万年历(汇编)
  16. ISCC 2022 wp
  17. 苹果手机无法加载抖音短视频的网络监测分析
  18. 基于 javaagent + javassist 一步步实现调用链系统 (2)
  19. NHibernate3剖析:Configuration篇之SessionFactory lambda配置
  20. Python中如何保留n位有效数字

热门文章

  1. Elastic 7.12 版重磅发布:读时模式、冻结层技术预览版和自动扩展功能正式发布
  2. Eclipse Mars2在线安装svn详细步骤
  3. Python--pyaudio声卡录音
  4. C语言字符串分割 trimmed simplified split
  5. 对标大厂标准,C站(CSDN)软件工程师能力认证正式上线
  6. LabVIEW控制Arduino采集多路模拟量、数字量(进阶篇—1)
  7. 课程学习与自步学习Curriculum learning and self-paced learning:极简入门
  8. 新计算机的word无法输入文字,【WORD为什么无法输入文字?】word如何转换excel
  9. Oracle 大表数据删除/清理方法小结
  10. 数据库服务的启动和停止