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 相关文章推荐
第五节--克隆
Nov 16 PHP
PHP 应用程序的安全 -- 不能违反的四条安全规则
Nov 26 PHP
php array_search() 函数使用
Apr 13 PHP
PHP 透明水印生成代码
Aug 27 PHP
分享一段php获取linux服务器状态的代码
May 27 PHP
Codeigniter实现处理用户登录验证后的URL跳转
Jun 12 PHP
Zend Framework上传文件重命名的实现方法
Nov 25 PHP
php使用GD2绘制几何图形示例
Feb 15 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
Feb 23 PHP
Laravel框架实现的rbac权限管理操作示例
Jan 16 PHP
php实现根据身份证获取精准年龄
Feb 26 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 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
JS 网站性能优化笔记
2011/05/24 PHP
解析PHP的session过期设置
2013/06/29 PHP
PHP面向对象程序设计重载(overloading)操作详解
2019/06/13 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
2009/11/04 Javascript
extjs grid设置某列背景颜色和字体颜色的方法
2010/09/03 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
12306验证码破解思路分享
2015/03/25 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
JS实现左右拖动改变内容显示区域大小的方法
2015/10/13 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
深入理解JS DOM事件机制
2016/08/06 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
js前端导出Excel的方法
2017/11/01 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
clipboard在vue中的使用的方法示例
2018/10/19 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
vue自定义指令和动态路由实现权限控制
2020/08/28 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
2020/11/12 Javascript
Python基于pyCUDA实现GPU加速并行计算功能入门教程
2018/06/19 Python
分享PyCharm的几个使用技巧
2019/11/10 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
Python找出列表中出现次数最多的元素三种方式
2020/02/24 Python
keras.layer.input()用法说明
2020/06/16 Python
详解tensorflow之过拟合问题实战
2020/11/01 Python
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
木马的传播途径主要有哪些
2016/04/08 面试题
遗体告别仪式主持词
2014/03/20 职场文书
企业活动策划方案
2014/06/02 职场文书
党的群众路线教育实践活动个人整改措施
2014/10/27 职场文书
顶岗实习计划书
2015/01/16 职场文书
小学五年级班主任工作经验交流材料
2015/11/02 职场文书
干部作风纪律整顿心得体会
2016/01/23 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书
python爬取新闻门户网站的示例
2021/04/25 Python
Apache Hudi数据布局黑科技降低一半查询时间
2022/03/31 Servers