<?php/*** 微信支付服务器端下单* 使用示例*  构造方法参数*      'appid'     =>  //填写微信分配的公众账号ID*      'mch_id'    =>  //填写微信支付分配的商户号*      'notify_url'=>  //填写微信支付结果回调地址*      'key'       =>  //填写微信商户支付密钥*  );*  统一下单方法*  $WechatAppPay = new wechatAppPay($options);*  $params['body'] = '商品描述';                   //商品描述*  $params['out_trade_no'] = '1217752501201407';   //自定义的订单号,不能重复*  $params['total_fee'] = '100';                   //订单金额 只能为整数 单位为分*  $params['trade_type'] = 'APP';                  //交易类型 JSAPI | NATIVE |APP | WAP*  $wechatAppPay->unifiedOrder( $params );*/
class WxH5Pay
{// 接口API URL前缀const API_URL_PREFIX = 'https://api.mch.weixin.qq.com';// 下单地址URLconst UNIFIEDORDER_URL = "/pay/unifiedorder";// 查询订单URLconst ORDERQUERY_URL = "/pay/orderquery";// 关闭订单URLconst CLOSEORDER_URL = "/pay/closeorder";// 公众账号IDprivate $appid;// 商户号private $mch_id;// 随机字符串private $nonce_str;// 签名private $sign;// 商品描述private $body;// 商户订单号private $out_trade_no;// 支付总金额private $total_fee;// 终端IPprivate $spbill_create_ip;// 支付结果回调通知地址private $notify_url;// 交易类型private $trade_type;// 支付密钥private $key;// 证书路径private $SSLCERT_PATH;private $SSLKEY_PATH;// 所有参数private $params = array();public function __construct($appid, $mch_id, $notify_url, $key){$this->appid = $appid;$this->mch_id = $mch_id;$this->notify_url = $notify_url;$this->key = $key;}/*** 下单方法* @param   $params 下单参数*/public function unifiedOrder($params){$this->body = $params['body'];$this->out_trade_no = $params['out_trade_no'];$this->total_fee = $params['total_fee'];$this->trade_type = $params['trade_type'];$this->scene_info = $params['scene_info'];$this->nonce_str = $this->genRandomString();$this->spbill_create_ip = $_SERVER['REMOTE_ADDR'];$this->params['appid'] = $this->appid;$this->params['mch_id'] = $this->mch_id;$this->params['nonce_str'] = $this->nonce_str;$this->params['body'] = $this->body;$this->params['out_trade_no'] = $this->out_trade_no;$this->params['total_fee'] = $this->total_fee;$this->params['spbill_create_ip'] = $this->spbill_create_ip;$this->params['notify_url'] = $this->notify_url;$this->params['trade_type'] = $this->trade_type;$this->params['scene_info'] = $this->scene_info;// 获取签名数据$this->sign = $this->MakeSign($this->params);$this->params['sign'] = $this->sign;$xml = $this->data_to_xml($this->params);$response = $this->postXmlCurl($xml, self::API_URL_PREFIX . self::UNIFIEDORDER_URL);if (!$response) {return false;}$result = $this->xml_to_data($response);if (!empty($result['result_code']) && !empty($result['err_code'])) {$result['err_msg'] = $this->error_code($result['err_code']);}return $result;}/*** 查询订单信息* @param $out_trade_no     订单号* @return array*/public function orderQuery($out_trade_no){$this->params['appid'] = $this->appid;$this->params['mch_id'] = $this->mch_id;$this->params['nonce_str'] = $this->genRandomString();$this->params['out_trade_no'] = $out_trade_no;//获取签名数据$this->sign = $this->MakeSign($this->params);$this->params['sign'] = $this->sign;$xml = $this->data_to_xml($this->params);$response = $this->postXmlCurl($xml, self::API_URL_PREFIX . self::ORDERQUERY_URL);if (!$response) {return false;}$result = $this->xml_to_data($response);if (!empty($result['result_code']) && !empty($result['err_code'])) {$result['err_msg'] = $this->error_code($result['err_code']);}return $result;}/*** 关闭订单* @param $out_trade_no     订单号* @return array*/public function closeOrder($out_trade_no){$this->params['appid'] = $this->appid;$this->params['mch_id'] = $this->mch_id;$this->params['nonce_str'] = $this->genRandomString();$this->params['out_trade_no'] = $out_trade_no;//获取签名数据$this->sign = $this->MakeSign($this->params);$this->params['sign'] = $this->sign;$xml = $this->data_to_xml($this->params);$response = $this->postXmlCurl($xml, self::API_URL_PREFIX . self::CLOSEORDER_URL);if (!$response) {return false;}$result = $this->xml_to_data($response);return $result;}/**** 获取支付结果通知数据* return array*/public function getNotifyData(){//获取通知的数据$xml = $GLOBALS['HTTP_RAW_POST_DATA'];//echo 123;die;$data = array();if (empty($xml)) {return false;}$data = $this->xml_to_data($xml);if (!empty($data['return_code'])) {if ($data['return_code'] == 'FAIL') {return false;}}return $data;}/*** 接收通知成功后应答输出XML数据* @param string $xml*/public function replyNotify(){$data['return_code'] = 'SUCCESS';$data['return_msg'] = 'OK';$xml = $this->data_to_xml($data);echo $xml;die();}/*** 生成APP端支付参数* @param  $prepayid   预支付id*/public function getAppPayParams($prepayid){$data['appid'] = $this->appid;$data['partnerid'] = $this->mch_id;$data['prepayid'] = $prepayid;$data['package'] = 'Sign=WXPay';$data['noncestr'] = $this->genRandomString();$data['timestamp'] = time();$data['sign'] = $this->MakeSign($data);return $data;}/*** 生成签名* @return 签名*/public function MakeSign($params){//签名步骤一:按字典序排序数组参数ksort($params);$string = $this->ToUrlParams($params);//签名步骤二:在string后加入KEY$string = $string . "&key=" . $this->key;//签名步骤三:MD5加密$string = md5($string);//签名步骤四:所有字符转为大写$result = strtoupper($string);return $result;}/*** 将参数拼接为url: key=value&key=value* @param   $params* @return  string*/public function ToUrlParams($params){$string = '';if (!empty($params)) {$array = array();foreach ($params as $key => $value) {$array[] = $key . '=' . $value;}$string = implode("&", $array);}return $string;}/*** 输出xml字符* @param   $params     参数名称* return   string      返回组装的xml**/public function data_to_xml($params){if (!is_array($params) || count($params) <= 0) {return false;}$xml = "<xml>";foreach ($params as $key => $val) {if (is_numeric($val)) {$xml .= "<" . $key . ">" . $val . "</" . $key . ">";} else {$xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";}}$xml .= "</xml>";return $xml;}/*** 将xml转为array* @param string $xml* return array*/public function xml_to_data($xml){if (!$xml) {return false;}//将XML转为array//禁止引用外部xml实体libxml_disable_entity_loader(true);$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);return $data;}/*** 获取毫秒级别的时间戳*/private static function getMillisecond(){//获取毫秒的时间戳$time = explode(" ", microtime());$time = $time[1] . ($time[0] * 1000);$time2 = explode(".", $time);$time = $time2[0];return $time;}/*** 产生一个指定长度的随机字符串,并返回给用户* @param type $len 产生字符串的长度* @return string 随机字符串*/private function genRandomString($len = 32){$chars = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k","l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v","w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G","H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R","S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2","3", "4", "5", "6", "7", "8", "9");$charsLen = count($chars) - 1;// 将数组打乱shuffle($chars);$output = "";for ($i = 0; $i < $len; $i++) {$output .= $chars[mt_rand(0, $charsLen)];}return $output;}/*** 以post方式提交xml到对应的接口url** @param string $xml 需要post的xml数据* @param string $url url* @param bool $useCert 是否需要证书,默认不需要* @param int $second url执行超时时间,默认30s* @throws WxPayException*/private function postXmlCurl($xml, $url, $useCert = false, $second = 30){$ch = curl_init();//设置超时curl_setopt($ch, CURLOPT_TIMEOUT, $second);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);//设置headercurl_setopt($ch, CURLOPT_HEADER, FALSE);//要求结果为字符串且输出到屏幕上curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);if ($useCert == true) {//设置证书//使用证书:cert 与 key 分别属于两个.pem文件curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');//curl_setopt($ch,CURLOPT_SSLCERT, WxPayConfig::SSLCERT_PATH);curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');//curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::SSLKEY_PATH);}//post提交方式curl_setopt($ch, CURLOPT_POST, TRUE);curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//运行curl$data = curl_exec($ch);//返回结果if ($data) {curl_close($ch);return $data;} else {$error = curl_errno($ch);curl_close($ch);return false;}}/*** 错误代码* @param  $code       服务器输出的错误代码* return string*/public function error_code($code){$errList = array('NOAUTH' => '商户未开通此接口权限','NOTENOUGH' => '用户帐号余额不足','ORDERNOTEXIST' => '订单号不存在','ORDERPAID' => '商户订单已支付,无需重复操作','ORDERCLOSED' => '当前订单已关闭,无法支付','SYSTEMERROR' => '系统错误!系统超时','APPID_NOT_EXIST' => '参数中缺少APPID','MCHID_NOT_EXIST' => '参数中缺少MCHID','APPID_MCHID_NOT_MATCH' => 'appid和mch_id不匹配','LACK_PARAMS' => '缺少必要的请求参数','OUT_TRADE_NO_USED' => '同一笔交易不能多次提交','SIGNERROR' => '参数签名结果不正确','XML_FORMAT_ERROR' => 'XML格式错误','REQUIRE_POST_METHOD' => '未使用post传递参数 ','POST_DATA_EMPTY' => 'post数据不能为空','NOT_UTF8' => '未使用指定编码格式',);if (array_key_exists($code, $errList)) {return $errList[$code];}}
}
<?phprequire_once 'WxH5Pay.php';$_POST['title'] = ' 1 积分';
$_POST['money'] = '1';$appid = '微信支付的appid';
$mch_id = '微信支付的mch_id';
$key = '微信商户API密钥';
$notify_url = 'http://xxxx.cn/api/mypay/callback.php';$wechatAppPay = new WxH5Pay($appid, $mch_id, $notify_url, $key);$params['body'] = '购买' . $_POST['title']; // $params['body'] = '微信H5支付测试';
$params['out_trade_no'] = date('Ymd') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); // 订单号
$params['total_fee'] = $_POST['money']; // 订单金额 只能为整数 单位为分
$params['trade_type'] = 'MWEB'; // 交易类型 MWEB
$host = "http://xxxx.cn/"; // 来源地址
$name = '微信支付测试订单'; // $name = '微信支付测试订单';
$params['scene_info'] = '{"h5_info": {"type":"Wap","wap_url": ' . $host . ',"wap_name":"' . $name . '"}}';
$result = $wechatAppPay->unifiedOrder($params);if (isset($result['err_msg'])) {return false; // 错误返回信息,看需求定义返回!
}
$url = $result['mweb_url'] . '&redirect_url=' . urlencode($notify_url); // 可以在MWEB_URL后拼接上 redirect_url 参数,来指定回调页面// 跳转此链接拉起微信支付
header("location:" . $url);  // 拉起微信支付链接(并且附上$return_url)
exit;

$notify_url = 'http://xxxx.cn/api/mypay/callback.php'; 的代码:

<?php
require '../../../common.inc.php';
global $db;
$xml = file_get_contents('php://input'); // 监听是否有数据传入
if (!empty($xml)) {// 微信返回信息$data = xml_to_data($xml);if ($data['return_code'] == 'SUCCESS' && $data['result_code'] == 'SUCCESS') {//处理业务逻辑,数据库的操作//在调用查询订单号接口进行订单状态的判断(根据微信订单号查询)//只有trade_state为success才算是真正的支付成功// 更新订单表$res = $db->query("UPDATE `destoon_payment_orders` SET `time_end`='" . date("YmdHis") . "' WHERE `out_trade_no`='" . $data['out_trade_no'] . "'");if ($res) {$credit = $db->get_one("SELECT credit FROM `destoon_credit_list` WHERE `money`='" . $data['total_fee'] / 100 . "'")['credit'];if(!$credit){$credit = ceil($data['total_fee'] / 100 * (100 + ($data['total_fee'] / 100) / 10));if(($data['total_fee'] / 100) > 200){$credit = ceil(($data['total_fee'] / 100) * 120);} else {$credit = ceil($data['total_fee'] / 100) * (100 + ($data['total_fee'] / 100) / 10);}}$userid = $db->get_one("SELECT userid FROM `destoon_payment_orders` WHERE `out_trade_no`='" . $data['out_trade_no'] . "'")['userid'];$user_data = $db->get_one("SELECT userid, username, credit FROM `destoon_member` WHERE `userid`='" . $userid . "'");$balance = "充值" . $data['total_fee'] / 100 . "元, 购买" . $credit . '积分。';$rrr = $db->query("INSERT INTO `destoon_finance_credit` (userid, username, amount, balance, addtime, reason, note, editor)  VALUES ('" . $user_data['userid'] . "', '" . $user_data['username'] . "', '" . $credit . "', '" . ($user_data['credit'] + $credit) . "', '" . time() . "', '" . $balance . "', 'ID:" . $user_data['userid'] . "', 'system')");if ($rrr) {$db->query("UPDATE `destoon_member` SET credit=credit+'" . $credit . "' WHERE `userid`='" . $user_data['userid'] . "'");}}//所有的业务处理完成后,输出success(XML格式)echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';} else {file_put_contents('../error.txt', 'rade_state fail');}
}function xml_to_data($xml)
{if (!$xml) {throw new WxPayException("xml数据异常!");}//将XML转为array//禁止引用外部xml实体libxml_disable_entity_loader(true);$values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);return $values;
}
<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>微信H5支付</title>
</head>
<body>
<input id="zhifu" type="submit" value="支付">
</body>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script><script>$('#zhifu').click(function () {window.location.href = "index.php";})
</script></html>

PHP微信H5支付Demo相关推荐

  1. php微信h5支付demo,微信h5支付 demo-HTML5微信支付DEMO下载 最新版--pc6下载站

    在微信支付已经霸占了大部分人生活习惯的年代,一个不支持微信支付的商家都不好意思开店了,程序猿们可以下载查看HTML5微信支付DEMO来帮助您熟悉微信支付的代码,马上下载查看微信h5支付demo的内容吧 ...

  2. 微信H5支付demo

    近来对支付来点兴趣,搞了一个微信H5的支付demo供大家参考一下. @RequestMapping(value ="/H5",method = {RequestMethod.POS ...

  3. 微信支付—微信H5支付「非微信内部浏览器-QQ/UC浏览器等」

    前言 微信支付-微信H5外部浏览器支付「本文」 微信H5内部浏览器支付「待写」 PC端扫码支付「待写」 一直计划着写一写微信支付相关的文章,希望能加深一下自己的印象,拖了一天又一天- 最近终于空出时间 ...

  4. java微信网页支付_java实现微信H5支付

    原标题:java实现微信H5支付 前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹 ...

  5. h5支付不能打开支付宝 ios_iOS 解决微信h5支付,支付宝h5支付无法直接返回APP的问题...

    由于公司的业务需要,为了节省申请开通微信支付的时间和人力,公司决定使用微信h5支付.这样即节省了时间,同时以后所有的APP都能使用h5支付,既方便又快捷. 但是真正做的时候问题来了,当你支付成功之后或 ...

  6. 微信h5支付python版

    微信h5支付python版 最近闲暇,整理下微信支付,根据官方文档进行的. 官方配置文件这里就不多说了, tornado感觉方便快捷,所以就用这个整理处理一份.经由django改编. 文档结构 进入. ...

  7. 解决iOS微信H5支付跳转微信后不返回App问题(Swift-WKWebview)(转)

    解决iOS微信H5支付跳转微信后不返回App问题(Swift-WKWebview)(转) 参考文章: (1)解决iOS微信H5支付跳转微信后不返回App问题(Swift-WKWebview)(转) ( ...

  8. app 访问h5 如何截取_微信H5支付申请相关问题

    之前的文章「微信支付申请相关问题」里说过微信公众号和 APP 申请微信支付,今天来说下微信 H5 支付的申请. 背景介绍 H5 支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认 ...

  9. Android 应用内微信 H5 支付

    一般情况下,要实现应用内支付接入 App 支付 SDK 即可满足业务需求,不过考虑到对于一些类似游戏中心的场景,更多是需要支持 H5 支付.相对微信来说,支付宝的对接简单完善很多,所以本篇文章主要说说 ...

  10. php根据浏览器调用支付_Android通过外部浏览器调用微信H5支付,Android+PHP详解

    看了好多关于讲解微信H5支付开发的文章,大多数都是通过微信内部浏览器来调用支付接口(其实就是公众号支付),可能是因为H5支付接口刚开放不久吧. 微信官方体验链接:http://wxpay.wxutil ...

最新文章

  1. P1214 等差数列
  2. select每门可说大于90分_小女子风雨黑暗无惧 90分全自动反向折叠照明伞
  3. git linux 登陆_Git安装及基础命令
  4. 2017年10月07日普及组 单元格
  5. 计算机网络是如何通信的【二】
  6. C#——《C#语言程序设计》实验报告——数据库编程——基于ADO.NET技术和WPF技术的简单数据库可视化工具DEMO
  7. fpga map测试_一种基于SELECTMAP的可配置且高速的FPGA配置电路及实现方法与流程
  8. ARM汇编编程基础之一 —— 寄存器
  9. 我知道关于马云的故事,他不成功都难
  10. 2017 开发者大调查活动获奖名单新鲜出炉
  11. Windows NT Backup - 恢复工具 - Windows Vista的迁移工具
  12. 二进制,八进制十进制十六进制之间数据转换
  13. shardedJedisPool工具类
  14. 通过bat文件一键配置电脑IP
  15. 英文科技论文写作与学术报告Lecture 2习题答案
  16. 彭斌_无人机的发展与未来
  17. 服务器d盘位置不可用,系统之家Windows7本地磁盘位置不可用拒绝访问的解决方法...
  18. 微信授权登陆接入第三方App(步骤总结)Android。
  19. xshell 6+xftp 6卸载时出现1628错误解决办法
  20. 大牛deep learning入门教程

热门文章

  1. 公司内部项目章程模板
  2. 单片机支持EM4100和T5577两种ID门禁卡
  3. Win10使用Dism命令提取(备份)和还原驱动程序
  4. 2018注册测绘师各地报名时间和注意事项!莫错过哦!
  5. 绘制14段米字数码管显示,显示数字和英文字母。
  6. 计算机程序设计在线课程,最新章节测试答案2020学堂在线计算机程序设计基础(先修课)...
  7. python3.5安装包_Python 3.5.4详细图文安装教程(附安装包) | 我爱分享网
  8. STM32程序下载1:通过keil-ST-Link方式下载
  9. WinForm DevExpress使用之ChartControl控件绘制图表一——基础
  10. Elasticsearch学习--elasticsearch介绍与安装