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 相关文章推荐
AJAX for PHP简单表数据查询实例
Jan 02 PHP
php 前一天或后一天的日期
Jun 28 PHP
兼容性比较好的PHP生成缩略图的代码
Jan 12 PHP
PHP用身份证号获取星座和生肖的方法
Nov 07 PHP
ThinkPHP视图查询详解
Jun 30 PHP
使用php转义输出HTML到JavaScript
Mar 27 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
May 18 PHP
PHP合并数组的2种方法小结
Nov 24 PHP
PHP未登录自动跳转到登录页面
Dec 21 PHP
PHP 实现公历日期与农历日期的互转换
Sep 13 PHP
使用vs code编辑调试php配置的方法
Jan 29 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
Sep 30 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
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
PHP静态成员变量和非静态成员变量详解
2017/02/14 PHP
用javascript编写的第一人称射击游戏
2007/02/25 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
基于jquery打造的百分比动态色彩条插件
2012/09/19 Javascript
获取鼠标在div中的相对位置的实现代码
2013/12/30 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
利用JS实现页面删除并重新排序功能
2016/12/09 Javascript
ES6新特性之模块Module用法详解
2017/04/01 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
2018/04/19 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
JS数组方法slice()用法实例分析
2020/01/18 Javascript
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
python如何生成网页验证码
2018/07/28 Python
python读取并写入mat文件的方法
2019/07/12 Python
200行python代码实现2048游戏
2019/07/17 Python
利用python-pypcap抓取带VLAN标签的数据包方法
2019/07/23 Python
python os.rename实例用法详解
2020/12/06 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
使用纯HTML5编写一款网页上的时钟的代码分享
2015/11/16 HTML / CSS
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
自考自我鉴定范文
2013/10/30 职场文书
化妆品活动策划方案
2014/05/23 职场文书
英文自荐信范文
2015/03/25 职场文书
幸福来敲门观后感
2015/06/04 职场文书
2015教师个人年度工作总结
2015/10/23 职场文书
Jsonp劫持学习
2021/04/01 PHP
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers