1.微信开放平台创建移动应用,获取appid和商户号,并申请微信支付,商户平台中设置key
2.生成订单信息,调用wxTradePay

$wxpay = new model\Wxpay();
$wxpay_info = $wxpay->wxTradePay($order);

生成微信预支付订单

public function wxTradePay($order)
{$order['order_amount'] = $order['order_amount'] * 100;//接口中参数支付金额单位为【分】,参数值不能带小数。对账单中的交易金额单位为【元】。$nonce_str = $this->rand_code();        //调用随机字符串生成方法获取随机字符串$data['appid'] ='appid';$data['attach'] = $order['log_id'].'-'.$order['order_amount']; //自定义数据$data['mch_id'] = '商户号' ; $data['body'] = $order['order_sn']; //商品描述$data['spbill_create_ip'] = $_SERVER['REMOTE_ADDR'];   //ip地址$data['total_fee'] = $order['order_amount'];                         //总金额,单位为【分】$data['out_trade_no'] = $out_trade_no;    //商户订单号,不能重复$data['nonce_str'] = $this->rand_code();                   //随机字符串$data['notify_url'] = '回调地址';   //回调地址,用户接收支付后的通知,必须为能直接访问的网址,不能跟参数$data['trade_type'] = 'APP';      //支付方式//将参与签名的数据保存到数组  注意:以上几个参数是追加到$data中的,$data中应该同时包含开发文档中要求必填的剔除sign以外的所有数据$data['sign'] = $this->getSign($data);        //获取签名$xml = $this->ToXml($data);            //数组转xml//curl 传递给微信方$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";$ch = curl_init();curl_setopt($ch,CURLOPT_URL, $url);if(stripos($url,"https://")!==FALSE){curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);}    else    {curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验}//设置headercurl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);curl_setopt($ch, CURLOPT_HEADER, FALSE);//要求结果为字符串且输出到屏幕上curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//设置超时curl_setopt($ch, CURLOPT_TIMEOUT, 30);curl_setopt($ch, CURLOPT_POST, TRUE);//传输文件curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//运行curl$data = curl_exec($ch);$ssr = array();//返回结果if($data){curl_close($ch);//返回成功,将xml数据转换为数组.$re = $this->FromXml($data);//print_r($re);die;if($re['return_code'] != 'SUCCESS'){$ssr['code'] = 201;$ssr['msg'] = '签名失败';return $ssr;}else{//接收微信返回的数据,传给APP!$arr =array('prepayid' =>$re['prepay_id'],'appid' => 'appud','partnerid' => '商户号','package' => 'Sign=WXPay','noncestr' => $nonce_str,'timestamp' =>time(),);//第二次生成签名$sign = $this->getSign($arr);$arr['sign'] = $sign;$arr['code'] = 200;$arr['msg'] = '签名成功';return $arr;}} else {$error = curl_errno($ch);curl_close($ch);$ssr['code'] = 201;$ssr['msg'] = 'curl出错,错误码:$error';return $ssr;}
}

随机字符串

public function rand_code()
{$str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//62个字符$str = str_shuffle($str);$str = substr($str,0,32);return  $str;
}

生成签名

public function getSign($params)
{ksort($params);        //将参数数组按照参数名ASCII码从小到大排序foreach ($params as $key => $item) {if (!empty($item)) {         //剔除参数值为空的参数$newArr[] = $key.'='.$item;     // 整合新的参数数组}}$stringA = implode("&", $newArr);         //使用 & 符号连接参数$stringSignTemp = $stringA."&key="."key";        // key是在商户平台API安全里自己设置的$stringSignTemp = MD5($stringSignTemp);       //将字符串进行MD5加密$sign = strtoupper($stringSignTemp);      //将所有字符转换为大写return $sign;}

xml处理

public function ToXml($data=array())
{if(!is_array($data) || count($data) <= 0){return '数组异常';}$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;
}
public function FromXml($xml)
{if(!$xml){echo "xml数据异常!";}//将XML转为array//禁止引用外部xml实体libxml_disable_entity_loader(true);$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);return $data;
}

这样就生成了微信预支付信息,正确的信息应该是这样,data里的pay_info就是客户端调起微信app支付需要的信息

{"code": 200,"msg": "待支付","data": {"order_id": 1432,"pay_info": {"prepayid": "x'x'x'x'x","appid": "x'x'x'x'x","partnerid": "x'x'x'x","package": "Sign=WXPay","noncestr": "jdNypx'x'x'x1Q3tSWXGEq7PnDKo","timestamp": 1539689298,"sign": "937FEB782F2F43126","code": 200,"msg": "签名成功"}}
}

3.回调

public function wxNotify()
{$wx = new model\Wxpay();//接收微信返回的数据数据,返回的xml格式$xmlData = file_get_contents('php://input');//将xml格式转换为数组$data = $wx->FromXml($xmlData);$arr = array();//为了防止假数据,验证签名是否和返回的一样。//记录一下,返回回来的签名,生成签名的时候,必须剔除sign字段。$sign = $data['sign'];unset($data['sign']);if($sign == $wx->getSign($data)){//签名验证成功后,判断返回微信返回的if ($data['result_code'] == 'SUCCESS' &&  && $data['return_code']=="SUCCESS"){//根据返回的订单号做业务逻辑$flow = new model\Flow();$flow->order_paid($data['out_trade_no'],$data['transaction_id']);//处理完成之后,告诉微信成功结果!echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';exit();    }else{$file = fopen('./log.txt', 'a+');fwrite($file,"错误信息:".$data['return_msg'].date("Y-m-d H:i:s"),time()."\r\n");    }}else{$file = fopen('./log.txt', 'a+');fwrite($file,"错误信息:签名验证失败".date("Y-m-d H:i:s"),time()."\r\n");    }
}

到这里,微信APP支付结束,大致流程就是这样,可根据自己业务流程编写。

参考文档
微信支付统一下单 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1

基于tp5的微信app支付及回调相关推荐

  1. 基于tp5的支付宝app支付及回调

    1.支付宝开放平台添加应用,获得appid,并签约. 2.配置支付宝的应用公钥. 3.在开放平台下载官方sdk demo. 4.生成订单信息,调用AlipayTradeAppPayRequest (1 ...

  2. 微信APP支付(基于Java实现微信APP支付)

    步骤: 导入maven依赖 <!--微信支付--><dependency><groupId>com.github.wxpay</groupId>< ...

  3. php tp 微信支付,PHP实现的微信APP支付功能示例【基于TP5框架】

    本文实例讲述了PHP实现的微信APP支付功能.分享给大家供大家参考,具体如下: 1.进行支付请求 他给的DEMO 用的时候有时候会报错 1)我遇到的情况 把  WxPay.Api.php这个文件的 p ...

  4. 基于spring-boot+uni-app实现app支付功能(微信/支付宝)服务端

    基于spring-boot+uni-app实现app支付功能(微信/支付宝)服务端 支付宝支付 1 准备工作 申请支付能力 接口加签方式 2代码 依赖 支付宝支付配置类 支付宝控制层 异步通知 微信支 ...

  5. 微信app支付统一下单设置回调地址php,微信支付配置回调地址

    需要超级管理员帐号登录才可操作 1) 所有使用公众号支付方式发起支付请求的链接地址,都必须在支付授权目录之下: 2) 支付授权目录最多可以设置5个目录 3) 头部要包含http或https,须细化到二 ...

  6. Java对接微信支付实现微信APP支付

    Java对接微信实现微信APP支付 之前对接过第三方的支付方式,也有接入微信jsapi的支付方式,这次项目需求要求对接微信APP支付,找了很多,几乎都没有最新版的微信支付v3的对接相关的详细博客,真的 ...

  7. JAVA微信APP支付接口整合

    2019独角兽企业重金招聘Python工程师标准>>> 上次我们看到了支付宝的APP支付工具,那么这次就来封装封装微信的APP支付;如果已经清楚了支付宝的支付流程,那么微信支付也和它 ...

  8. 第三方支付——微信app支付

    微信App支付 前言 本篇文章将结合自己实际开发经验,从一下几个方面介绍微信app支付,什么是微信app支付?支付流程是什么样的? 前期需要准备些什么?结合官方文档和实际代码带大家走流程. 正文 微信 ...

  9. 微信H5支付(基于Java实现微信H5支付)

    微信的H5支付区别与APP支付,主要在于预下单(返回的参数不一样),其它大体相同(基本没什么区别,区别在于有些人加密喜欢用MD5有些人喜欢用官方提供的加密方式加密,我用的是官方的),贴一下H5支付预下 ...

最新文章

  1. c++链表形参丢失_LeetCode 例题精讲 | 01 反转链表:如何轻松重构链表
  2. 网银系统服务器架构设计,网上银行建设架构精选.pdf
  3. 为myeclipse分配更大的内存
  4. 基于matlab的能级_波函数及几率密度图形的绘制,基于MATLAB的能级波函数及几率密度图形的绘制.pdf...
  5. python在无人驾驶上的应用_无人驾驶(ADAS)方向的python软件工程师应具备哪些python模块的知识?...
  6. 等比例缩放图片-opencv
  7. SET化消息中间件架构实现
  8. eclipse配置tomcat,访问http://localhost:8080出现404错误
  9. Scp远程批量执行命令
  10. 如何将视频转换成文字
  11. 单片机仿真软件 linux,免费的单片机和电路仿真软件SimulIDE,从此再也不用花钱买开发板了...
  12. 【社招】 中/高级C++ Developer - 美国顶尖交易公司Akuna Capital–上海
  13. 技巧分享-电脑版微信如何登录多个账号
  14. Exception at 0x7fefd73a49d, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continue
  15. 室内定位——视觉方法的发展
  16. 计算机网络-自顶向下(学习笔记)
  17. vue3-video-play 实现视频播放
  18. linux字体操作,安装字体
  19. java如何连接Sublime_第一节:使用Sublime 搭建Java学习环境
  20. WebRTC 与 FFmpeg 相继发布最新版本

热门文章

  1. 自助访客登记与访客身份核验立式一体机
  2. 一段很有意思小代码:视频中提取心率
  3. 互联网的历史(1969-2009)
  4. 影响三级分销系统开发的因素有哪些?
  5. 初学Vue——编写简单的日程计划
  6. dpcm编码 matlab程序,DPCM预测编码的MATLAB原代码: | 学步园
  7. HF溶液中二氧化硅刻蚀机理
  8. gophish安装笔记
  9. 迁移学习后续——中草药分类(inception-v3)
  10. 长距离供水管道泄漏监测系统安装说明