PHP实现唤起微信支付功能


Posted in PHP onFebruary 18, 2019

本文实例为大家分享了PHP唤起微信支付的具体代码,供大家参考,具体内容如下

<?php
/**
**/
class H5wxAction extends CommonAction {
 public function __construct() {
 parent::__construct();
 
 
 }
 /*
 字段名 变量名 必填 类型 示例值 描述
公众账号ID appid 是 String(32) wxd678efh567hg6787 微信分配的公众账号ID(企业号corpid即为此appId)
商户号 mch_id 是 String(32) 1230000109 微信支付分配的商户号
设备号 device_info 否 String(32) 013467007045764 终端设备号(门店号或收银设备ID),注意:PC网页或公众号内支付请传"WEB"
随机字符串 nonce_str 是 String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串,不长于32位。推荐随机数生成算法
签名 sign 是 String(32) C380BEC2BFD727A4B6845133519F3AD6 签名,详见签名生成算法
签名类型 sign_type 否 String(32) HMAC-SHA256 签名类型,目前支持HMAC-SHA256和MD5,默认为MD5
商品描述 body 是 String(128) 腾讯充值中心-QQ会员充值 
商品简单描述,该字段须严格按照规范传递,具体请见参数规定
商品详情 detail 否 String(6000) 单品优惠字段(暂未上线)
附加数据 attach 否 String(127) 深圳分店 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
商户订单号 out_trade_no 是 String(32) 20150806125346 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
货币类型 fee_type 否 String(16) CNY 符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
总金额 total_fee 是 Int 888 订单总金额,单位为分,详见支付金额
终端IP spbill_create_ip 是 String(16) 123.12.12.123 必须传正确的用户端IP,详见获取用户ip指引
交易起始时间 time_start 否 String(14) 20091225091010 订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
交易结束时间 time_expire 否 String(14) 20091227091010 
订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则
注意:最短失效时间间隔必须大于5分钟
商品标记 goods_tag 否 String(32) WXG 商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠
通知地址 notify_url 是 String(256) http://www.weixin.qq.com/wxpay/pay.php 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。
交易类型 trade_type 是 String(16) MWEB H5支付的交易类型为MWEB
商品ID product_id 否 String(32) 12235413214070356458058 trade_type=NATIVE,此参数必传。此id为二维码中包含的商品ID,商户自行定义。
指定支付方式 limit_pay 否 String(32) no_credit no_credit--指定不能使用信用卡支付
用户标识 openid 否 String(128) oUpF8uMuAJO_M2pxb1Q9zNjWeS6o trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。openid如何获取,可参考【获取openid】。企业号请使用【企业号OAuth2.0接口】获取企业号内成员userid,再调用【企业号userid转openid接口】进行转换
场景信息 scene_info 是 String(256) //IOS移动应用
{"h5_info": {"type":"IOS","app_name": "王者荣耀","bundle_id": "com.tencent.wzryIOS"}}
//安卓移动应用
{"h5_info": {"type":"Android","app_name": "王者荣耀","package_name": "com.tencent.tmgp.sgame"}}
//WAP网站应用
{"h5_info": {"type":"Wap","wap_url": "https://pay.qq.com","wap_name": "腾讯充值"}} 该字段用于上报支付的场景信息,针对H5支付有以下三种场景,请根据对应场景上报,H5支付不建议在APP端使用,针对场景1,2请接入APP支付,不然可能会出现兼容性问题
1,IOS移动应用
{"h5_info": //h5支付固定传"h5_info" 
 {"type": "", //场景类型
  "app_name": "", //应用名
  "bundle_id": "" //bundle_id
  }
}
2,安卓移动应用
{"h5_info": //h5支付固定传"h5_info" 
 {"type": "", //场景类型
  "app_name": "", //应用名
  "package_name": "" //包名
  }
}
3,WAP网站应用
{"h5_info": //h5支付固定传"h5_info" 
 {"type": "", //场景类型
 "wap_url": "",//WAP网站URL地址
 "wap_name": "" //WAP 网站名
 }
}
 
 */
 public function config(){
 $array=array(
 'appid'=>'****', //公众账号ID appid 是 String(32) wxd678efh567hg6787 微信分配的公众账号ID(企业号corpid即为此appId)
 'mch_id'=>'****',// 商户号 mch_id 是 String(32) 1230000109 微信支付分配的商户号
 'nonce_str'=>rand(100000,999999),// 随机字符串 nonce_str 是 String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串,不长于32位。推荐随机数生成算法
 'key'=>'****',
 'APPSECRET'=>'*****',
 
 );
 return $array;
 
 }
 
 public function H5WeiXin(){
 
 $config = $this->config();
 
 
 $count=1;
 //$money= 1;//充值金额 
   
  
  $userip = $this->getIP(); //获得用户设备IP
  $appid = $config['appid']; 
  $mch_id = $config['mch_id']; 
  $key = $config['key']; 
  
  $rand = rand(00000,99999); 
  $out_trade_no = $_POST['number'];//订单号 
  $nonce_str=MD5($rand);//随机字符串 
  $body = $data['title'];//内容 
  $total_fee = $count; //金额 
  $spbill_create_ip = $userip; //IP 
  $notify_url = 'http://'.$_SERVER['HTTP_HOST'].'/Wap/H5wx/WxHD'; //回调地址 
  $redirect_url = 'http://'.$_SERVER['HTTP_HOST'].'/Wap/H5wx/is_wxpay?number='.$_POST['number']; //回调地址 
  $trade_type = 'MWEB';//交易类型
  $scene_info ='{"h5_info":{"type":"Wap","wap_url":"'.$_SERVER['HTTP_HOST'].'","wap_name":"'.$data['title'].'"}}';//场景信息 
  $signA ="appid=$appid&body=$body&mch_id=$mch_id&nonce_str=$nonce_str¬ify_url=$notify_url&out_trade_no=$out_trade_no&scene_info=$scene_info&spbill_create_ip=$spbill_create_ip&total_fee=$total_fee&trade_type=$trade_type"; 
  $strSignTmp = $signA."&key=$key"; //拼接字符串 
 
 
 
  $sign = strtoupper(MD5($strSignTmp)); // MD5 后转换成大写 
  $post_data = "<xml> 
      <appid>$appid</appid> 
      <body>$body</body> 
      <mch_id>$mch_id</mch_id> 
      <nonce_str>$nonce_str</nonce_str> 
      <notify_url>$notify_url</notify_url> 
      <out_trade_no>$out_trade_no</out_trade_no> 
      <scene_info>$scene_info</scene_info> 
      <spbill_create_ip>$spbill_create_ip</spbill_create_ip> 
      <total_fee>$total_fee</total_fee> 
      <trade_type>$trade_type</trade_type> 
      <sign>$sign</sign> 
     </xml>";//拼接成XML 格式 
  $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
  $dataxml = $this->http_post($url,$post_data);
  $objectxml = (array)simplexml_load_string($dataxml, 'SimpleXMLElement', LIBXML_NOCDATA); 
 
 
 if($objectxml['return_code']=='SUCCESS'){
 $json['url'] = $objectxml['mweb_url'].'&redirect_url='.$redirect_url; //唤起微信链接
 $json['msg'] = '1';
 
 }else{
 $json['info'] ='参数错误';
 $json['msg'] ='0';
 }
 
 echo json_encode($json);
 
 
 }
 //查询是否支付成功 示例 根据需要调整
 public function is_wxpay(){
 $out_trade_no = $_GET['number'];
 
 $type = substr($out_trade_no,0,1); 
 if($type=='B'){
 $is_state = M('Bond')->where(array('number'=>$out_trade_no))->find();
 $url = U('Court/details',array('id'=>$is_state['aid']));
 }elseif($type=='W'){
 $is_state = M('Wallet')->where(array('number'=>$out_trade_no))->find();
 $url = U('Member/wallet');
 }else{
 $is_state =M('viplog')->where(array('number'=>$out_trade_no))->find();
 $url = U('Member/vip');
 }
 
 if($is_state['state']=='1'){
 cookie('id',$is_state['mid']);
 header("location: ".$url."");
 }else{
 echo '<h1>未查询到此订单的付款信息</h1>';
 }
 
 
 }
 
 //微信回调地址
 public function WxHD(){
 $url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
 $array = $this->xmlToArray($GLOBALS['HTTP_RAW_POST_DATA']);
 M('api_log')->add(array('content'=>json_encode($this->xmlToArray($GLOBALS['HTTP_RAW_POST_DATA'])).$array['out_trade_no']));
 
 
 
 if($array['return_code']=='SUCCESS'){
 
 $out_trade_no=$array['out_trade_no'];
 //$number = explode('-',$out_trade_no);
 $type = substr($out_trade_no,0,1); 
 
 header("location: http://".$_SERVER['HTTP_HOST'].$url."");
   
 
 }
  
 
 }
public 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; 
 
} 
public function convertUrlQuery($query)
{
 $queryParts = explode('&', $query);
 $params = array();
 foreach ($queryParts as $param) {
 $item = explode('=', $param);
 $params[$item[0]] = $item[1];
 }
 return implode('&',$params);
}
 
public function http_post($url, $data) { 
  $ch = curl_init(); 
  curl_setopt($ch, CURLOPT_URL,$url); 
  curl_setopt($ch, CURLOPT_HEADER,0); 
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  curl_setopt($ch, CURLOPT_POST, 1); 
  curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
  $res = curl_exec($ch); 
  curl_close($ch); 
  return $res; 
 } 
 
 public function getIP() { 
 if(getenv('HTTP_CLIENT_IP')) { 
 $ip = getenv('HTTP_CLIENT_IP'); 
 }elseif (getenv('HTTP_X_FORWARDED_FOR')) { 
 $ip = getenv('HTTP_X_FORWARDED_FOR'); 
 }elseif (getenv('HTTP_X_FORWARDED')) { 
 $ip = getenv('HTTP_X_FORWARDED'); 
 }elseif (getenv('HTTP_FORWARDED_FOR')) { 
 $ip = getenv('HTTP_FORWARDED_FOR'); 
 
 }elseif (getenv('HTTP_FORWARDED')) { 
 $ip = getenv('HTTP_FORWARDED'); 
 }else { 
 $ip = $_SERVER['REMOTE_ADDR']; 
 } 
 return $ip; 
 } 
 
 
}
 
 
?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
用PHP实现Ftp用户的在线管理的代码
Mar 06 PHP
PHP 函数语法介绍一
Jun 14 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
Oct 25 PHP
PHP解码unicode编码的中文字符代码分享
Aug 13 PHP
Yii中使用PHPExcel导出Excel的方法
Dec 26 PHP
Smarty模板简单配置与使用方法示例
May 23 PHP
php安装ssh2扩展的方法【Linux平台】
Jul 20 PHP
php正则表达式基本知识与应用详解【经典教程】
Apr 17 PHP
PHP简单留言本功能实现代码
Jun 09 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
Dec 03 PHP
PHP基于openssl实现非对称加密代码实例
Jun 19 PHP
laravel添加角色和模糊搜索功能的实现代码
Jun 22 PHP
thinkphp5使用无限极分类
Feb 18 #PHP
thinkphp5实现无限级分类
Feb 18 #PHP
php实现文章评论系统
Feb 18 #PHP
php无限级分类实现评论及回复功能
Feb 18 #PHP
PHP-FPM 的管理和配置详解
Feb 17 #PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 #PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 #PHP
You might like
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
php _autoload自动加载类与机制分析
2012/02/10 PHP
ThinkPHP3.2.2的插件控制器功能简述
2014/07/09 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
ASP.NET中AJAX 调用实例代码
2012/05/03 Javascript
基于jquery的simpleValidate简易验证插件
2014/01/31 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
Javascript基础教程之数据类型 (字符串 String)
2015/01/18 Javascript
JavaScript的内存释放问题详解
2015/01/21 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
Vue.js 插件开发详解
2017/03/29 Javascript
20行JS代码实现粘贴板复制功能
2018/02/06 Javascript
webpack打包js的方法
2018/03/12 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
在类Unix系统上开始Python3编程入门
2015/08/20 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
Python简单生成8位随机密码的方法
2017/05/24 Python
Python实现生成随机数据插入mysql数据库的方法
2017/12/25 Python
python 自动批量打开网页的示例
2019/02/21 Python
Python 实现将某一列设置为str类型
2020/07/14 Python
HTML5边玩边学(3)像素和颜色
2010/09/21 HTML / CSS
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
关于Assembly命名空间的三个面试题
2015/07/23 面试题
linux面试题参考答案(9)
2015/01/07 面试题
模具专业推荐信
2013/10/30 职场文书
商业企业管理专业求职信
2014/07/10 职场文书
竞选班干部演讲稿100字
2014/08/20 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
2014年专项整治工作总结
2014/11/17 职场文书
2014年招商引资工作总结
2014/11/22 职场文书