记得原来弄过几次每次说要整理哈没有时间,今天一定要整理哈 方便下次使用。

这个是基于 tp 框架写的。

首先我们从订单提交来说。

表单提交之后我们会生成一个订单id

参考的是白哥的博客。

大概这个样子

其实不用那么多参数 传一个订单号就行了 后面在查一次。

代码:

    public  function wxpayjsp($order_sn,$remark,$money){//        echo $order_sn;die;$wxc=C('WEIXINPAY_CONFIG');$appid=$wxc['APPID'];$mch_id=$wxc['MCHID'];$key=$wxc['KEY'];$appscreat=$wxc['APPSECRET'];// 导入微信支付sdkVendor('Weixinpay.Weixinpay');$wxpay=new \Weixinpay();// 获取jssdk需要用到的数据$data=$wxpay->getParameters($order_sn,$remark,$money);}

下面咱们看下引入的文件都是什么

Weixinpay.php 文件代码

<?phperror_reporting(E_ALL);
ini_set('display_errors', '1');// 定义时区
ini_set('date.timezone','Asia/Shanghai');class Weixinpay {// 定义配置项private $config=array('APPID'              => '', // 微信支付APPID'MCHID'              => '', // 微信支付MCHID 商户收款账号'KEY'                => '', // 微信支付KEY'APPSECRET'          => '',  //公众帐号secert'NOTIFY_URL'         => '', // 接收支付状态的连接  改成自己的域名);// 构造函数public function __construct(){// 如果是在thinkphp中 那么需要补全/Application/Common/Conf/config.php中的配置// 如果不是在thinkphp框架中使用;那么注释掉下面一行代码;直接补全 private $config 即可$this->config=C('WEIXINPAY_CONFIG');}/*** 统一下单* @param  array $order 订单 必须包含支付所需要的参数 body(产品描述)、total_fee(订单金额)、out_trade_no(订单号)、product_id(产品id)、trade_type(类型:JSAPI,NATIVE,APP)*/public function unifiedOrder($order){// 获取配置项$weixinpay_config=$this->config;$config=array('appid'=>$weixinpay_config['APPID'],'mch_id'=>$weixinpay_config['MCHID'],'nonce_str'=>'test','spbill_create_ip'=>'192.168.0.1','notify_url'=>$weixinpay_config['NOTIFY_URL']);// 合并配置数据和订单数据$data=array_merge($order,$config);// 生成签名$sign=$this->makeSign($data);$data['sign']=$sign;$xml=$this->toXml($data);$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';//接收xml数据的文件$header[] = "Content-type: text/xml";//定义content-type为xml,注意是数组$ch = curl_init ($url);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 兼容本地没有指定curl.cainfo路径的错误curl_setopt($ch, CURLOPT_HTTPHEADER, $header);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);$response = curl_exec($ch);if(curl_errno($ch)){// 显示报错信息;终止继续执行die(curl_error($ch));}curl_close($ch);$result=$this->toArray($response);// 显示错误信息if ($result['return_code']=='FAIL') {die($result['return_msg']);}$result['sign']=$sign;$result['nonce_str']='test';return $result;}/*** 验证* @return array 返回数组格式的notify数据*/public function notify(){// 获取xml$xml=file_get_contents('php://input', 'r'); // 转成php数组$data=$this->toArray($xml);// 保存原sign$data_sign=$data['sign'];// sign不参与签名unset($data['sign']);$sign=$this->makeSign($data);// 判断签名是否正确  判断支付状态if ($sign===$data_sign && $data['return_code']=='SUCCESS' && $data['result_code']=='SUCCESS') {$result=$data;}else{$result=false;}// 返回状态给微信服务器if ($result) {$str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';}else{$str='<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>';}echo $str;return $result;}/*** 输出xml字符* @throws WxPayException**/public function toXml($data){if(!is_array($data) || count($data) <= 0){throw new WxPayException("数组数据异常!");}$xml = "<xml>";foreach ($data as $key=>$val){if (is_numeric($val)){$xml.="<".$key.">".$val."</".$key.">";}else{$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";}}$xml.="</xml>";return $xml; }/*** 生成签名* @return 签名,本函数不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值*/public function makeSign($data){// 去空$data=array_filter($data);//签名步骤一:按字典序排序参数ksort($data);$string_a=http_build_query($data);$string_a=urldecode($string_a);//签名步骤二:在string后加入KEY$config=$this->config;$string_sign_temp=$string_a."&key=".$config['KEY'];//签名步骤三:MD5加密$sign = md5($string_sign_temp);// 签名步骤四:所有字符转为大写$result=strtoupper($sign);return $result;}/*** 将xml转为array* @param  string $xml xml字符串* @return array       转换得到的数组*/public function toArray($xml){   //禁止引用外部xml实体libxml_disable_entity_loader(true);$result= json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);        return $result;}/*** 获取jssdk需要用到的数据* @return array jssdk需要用到的数据*/public function getParameters($order_sn,$remark,$money){// 获取配置项$config=$this->config;// 如果没有get参数没有code;则重定向去获取openid;
//        echo 2;die;if (!isset($_GET['code'])) {// 获取订单号$out_trade_no=$order_sn;// 返回的url$redirect_uri=U('Mobile/Alipay/pay_callback','','',true);$redirect_uri=urlencode($redirect_uri);$url='https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$config['APPID'].'&redirect_uri='.$redirect_uri.'&response_type=code&scope=snsapi_base&state='.$out_trade_no.'#wechat_redirect';
//            echo $url;die;redirect($url);}else{// 如果有code参数;则表示获取到openid$code=I('get.code');$out_trade_no=$_REQUEST['state'];$orders = M('vip_order')->where(array('trade_no'=>$out_trade_no))->find();
//            print_r($orders);die;//            echo $code;die;// 取出订单号// 组合获取prepay_id的url$url='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$config['APPID'].'&secret='.$config['APPSECRET'].'&code='.$code.'&grant_type=authorization_code';// curl获取prepay_id$result=$this->curl_get_contents($url);$result=json_decode($result,true);$openid=$result['openid'];// 订单数据  请根据订单号out_trade_no 从数据库中查出实际的body、total_fee、out_trade_no、product_id$order=array('body'=>$orders['remark'],// 商品描述(需要根据自己的业务修改)'total_fee'=>$orders['total_fee']*100,// 订单金额  以(分)为单位(需要根据自己的业务修改)'out_trade_no'=>$orders['trade_no'],// 订单号(需要根据自己的业务修改)'product_id'=>$orders['trade_no'],// 商品id(需要根据自己的业务修改)'trade_type'=>'JSAPI',// JSAPI公众号支付'openid'=>$openid// 获取到的openid);// 统一下单 获取prepay_id$unified_order=$this->unifiedOrder($order);// 获取当前时间戳$time=time();// 组合jssdk需要用到的数据$data=array('appId'=>$config['APPID'], //appid'timeStamp'=>strval($time), //时间戳'nonceStr'=>$unified_order['nonce_str'],// 随机字符串'package'=>'prepay_id='.$unified_order['prepay_id'],// 预支付交易会话标识'signType'=>'MD5'//加密方式);// 生成签名$data['paySign']=$this->makeSign($data);//                        print_r($data);die;return $data;}}/*** 生成支付二维码* @param  array $order 订单 必须包含支付所需要的参数 body(产品描述)、total_fee(订单金额)、out_trade_no(订单号)、product_id(产品id)、trade_type(类型:JSAPI,NATIVE,APP)*/public function pay($order){$result=$this->unifiedOrder($order);$decodeurl=urldecode($result['code_url']);qrcode($decodeurl);}/*** curl 请求http*/public function curl_get_contents($url){$ch=curl_init();curl_setopt($ch, CURLOPT_URL, $url);                //设置访问的url地址// curl_setopt($ch,CURLOPT_HEADER,1);               //是否显示头部信息curl_setopt($ch, CURLOPT_TIMEOUT, 5);               //设置超时curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);   //用户访问代理 User-Agentcurl_setopt($ch, CURLOPT_REFERER,$_SERVER['HTTP_HOST']);        //设置 referercurl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);          //跟踪301curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        //返回结果$r=curl_exec($ch);curl_close($ch);return $r;}}

里面 有个 要注意 就是 获取 openid 的时候 判断 没有 code 的时候去获取 然后 他要 调用之后会跳转到  一个 地址

截图

这个 回调地址 不可以加参数哦 ,现在调用没什么到最后支付的时候 一直会 报错 说你的 url 未注册。其实目录授权已经配置好了。

回调的地址 代码

   /*** 公众号支付 必须以get形式传递 out_trade_no 参数* 示例请看 /Application/Home/Controller/IndexController.class.php* 中的weixinpay_js方法*/public  function pay_callback(){//        echo 2;die;//        $order_sn=$_REQUEST['order_sn']=time();
//        $remark=$_REQUEST['remark']='test';
//        $money=$_REQUEST['money']=1;// 导入微信支付sdkVendor('Weixinpay.Weixinpay');$wxpay=new \Weixinpay();// 获取jssdk需要用到的数据$data=$wxpay->getParameters();$data=json_encode($data);$this->assign('data',$data);$this->display();}

看下 上面 调用之后的代码 $data数据

走到这里和我打印的一样基本就OK 了

生成的json数据如下

  1. {
  2.     "appId": "wx45355353543",
  3.     "timeStamp": "1414411784",
  4.     "nonceStr": "gbwr71b5no6q6ne18c8up1u7l7he2y75",
  5.     "package": "prepay_id=wx20189172009395522657a690389285100",
  6.     "signType": "MD5",
  7.     "paySign": "9C634535353535355353"
  8. }

对应分配的页面

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>支付</title>
</head>
<body style="text-align: center;">
<!--<button onclick="getOrder()">支付</button>--><jquery />
<script>function onBridgeReady(){var data={$data};WeixinJSBridge.invoke('getBrandWCPayRequest', data,function(res){if(res.err_msg == "get_brand_wcpay_request:ok" ) {window.location.href='http://v3.mpwdl.com/index.php/Mobile/User/index';// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。}else{
//                        alert(res.err_code+res.err_desc+res.err_msg); // 显示错误信息window.history.go(-1);}});}if (typeof WeixinJSBridge == "undefined"){if( document.addEventListener ){document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);}else if (document.attachEvent){document.attachEvent('WeixinJSBridgeReady', onBridgeReady);document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);}}else{onBridgeReady();}
</script>
</body>
</html>

到这里 支付就完成了 很简单的。 回调 然后修改状态

配置我截图哈 方便对比 、

php 微信公众号调用支付相关推荐

  1. vue 微信公众号支付接口_vue页面在微信公众号调用支付接口

    // 点击了点击购买按钮 async handlePurchase() { const vm = this // 获取选中的套餐信息,用的是axios的post方法,因此要包装一下params con ...

  2. java微信公众号JSAPI支付以及所遇到的坑

    java微信公众号JSAPI支付以及所遇到的坑 上周做了个支付宝微信扫码支付,今天总结一下.微信相比支付宝要麻烦许多 由于涉及到代理商,没办法,让我写个详细的申请流程,懵逼啊. 笔记地址 http:/ ...

  3. 微信公众号网页支付详解

    首先先看微信公众开放文档:https://blog.csdn.net/qq_41971087/article/details/82466647 其实他的下单和我们微信小程序下单是一样的请观看:http ...

  4. 微信企业号或微信公众号调用扫一扫功能

    微信企业号或微信公众号调用扫一扫功能 JS-SDK安全域名配置 配置设置好之后下面就上代码 java代码 签名校验 JS-SDK安全域名配置 企业微信号 -- 安全域名配置需要通过验证(如下图) 微信 ...

  5. 微信公众号调用视频列表(自定义菜单)

    微信公众号调用视频列表(自定义菜单),微信公众号如何实现视频列表播放视频的功能 使用场景要求: 在微信公众号中,添加多个视频,且可实现视频列表的连播功能. 要求观看视频时无广告.稳定流畅. 创建视频列 ...

  6. 微信公众号调用接口显示的错误码含义

    微信公众号调用接口显示的错误码含义 返回码    说明 -1    系统繁忙,此时请开发者稍候再试 0    请求成功 40001    获取 access_token 时 AppSecret 错误, ...

  7. java 调用手机相册_微信公众号调用手机摄像头拍照和本地相册

    [实例简介] 微信公众号调用手机摄像头拍照和本地相册,上传服务器 [实例截图] [核心代码] 微信公众号调用手机摄像头拍照和本地相册(2) └── 微信公众号调用手机摄像头拍照和本地相册 └── 微信 ...

  8. 关于微信公众号jsapi支付传值的问题

    刚开始接触微信公众号没有多久,只是做了一些简单的操作,如页面显示,近期,需要做一个微信公众号的支付功能,对于小白的我是很痛苦的,忍着痛,勇敢的往上爬. 首先上网查资料,找demo,之前几天一直没有信心 ...

  9. 微信公众号页面支付接口java,[Java教程]微信公众号支付(三):页面调用微信支付JS并完成支付...

    [Java教程]微信公众号支付(三):页面调用微信支付JS并完成支付 0 2015-09-15 15:00:30 一.调用微信的JS文件 1.首先要绑定[JS接口安全域名],"公众号设置&q ...

最新文章

  1. 通俗易懂讲解梯度下降法!
  2. mysql 忽略语法错误_MYSQL语句中易忽略的语法错误 | 学步园
  3. 递归算法转换为非递归算法的技巧
  4. amuse ui(web插件,js插件,css样式)?
  5. 【深度学习】基础知识 | 超详细逐步图解 Transformer
  6. python图像加坐标_Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例...
  7. 【bug解决】You should consider upgrading via the 'pip install --upgrade pip' command.
  8. MyBatis3官方文档
  9. 在LaTeX中使用Python highlighting in LaTeX让python代码高亮
  10. 自己封装的一个checkbook工具
  11. 多伦多大学计算机ib成绩要求,IB学生要考多少分才能进入世界一流名校就读?这里有份IB要求一览表请收好!...
  12. Java基础算法,获得相反数
  13. 第二章-数据描述(初级统计)
  14. 数据标注软件 【labelimg】
  15. iOS开发 swift 3dTouch实现 附代码
  16. ubuntu配置网易云音乐
  17. ABAQUS中inp文件的使用和书写
  18. linux dd copy all partitions,dd 命令详解
  19. UiPath Robotic Enterprise Framework 学习笔记
  20. box-shadow和颜色渐变

热门文章

  1. PCL 库的安装与应用
  2. compressor压缩_使用Compressor.io压缩和优化图像高达90%
  3. Java怎么打开文件夹
  4. S3C6410开发板LED驱动代码分析及测试代码分析
  5. 重装windows10系统
  6. 2022-2027年中国报警器IC行业市场全景评估及投资潜力预测报告
  7. 服务器系统2003资源监视器在哪里,系统资源监视器在哪里
  8. java的String类源码详解
  9. 基于参考图像的人脸组成编辑
  10. ajax异步超时,AjaxPro实现异步调用,解决浏览器假死及超时问题(示例代码)