微信支付服务器端php,APP微信支付php服务端函数方法
namespace wxPay\Controller;
use Think\Controller;
class AjaxpayfunController extends Controller {
function index(){
header('Content-Type:text/html;Charset=utf-8'); //php页面输出 乱码
//参数配置
$appid = '*********'; /*微信开放平台上的应用id*/
$mch_id = '*************'; /*微信申请成功之后邮件中的商户id*/
$api_key = '************************'; /*在微信商户平台上自己设定的api密钥 32位*/
$out_trade_no = $this -> ordersinfo(); /*商户订单号*/
$price = $_GET['total']*1; /*支付金额*/
$price = 0.02*1; /*支付金额*/
$code = $this -> weChatPay($out_trade_no,$price,$appid,$mch_id,$api_key);
echo($code);
}
//入口函数
function weChatPay($order_num,$price,$appid,$mch_id,$api_key){
$json = array();//生成预支付交易单的必选参数:
$newPara = array();//所需各项参数
$newPara["appid"] = $appid; //应用APP appid
$newPara["mch_id"] = $mch_id; //微信支付商户id//设备号
$newPara["device_info"] = $this -> createNoncestr(); //终端设备号(门店号或收银设备ID),如没有这里推荐使用函数生成随机字符串
$newPara["nonce_str"] = $this -> createNoncestr(); //随机字符串,不长于32位。推荐随机数生成算法
$newPara["body"] = "添美爱车"; //商品描述 或应用名称
$newPara["out_trade_no"] = $order_num; //商户订单号,这里是商户自己的内部的订单号
$newPara["total_fee"] = $price*100; //支付金额
$newPara["spbill_create_ip"] = $_SERVER["REMOTE_ADDR"]; //正在浏览当前页面用户的 IP 地址。
$newPara["notify_url"] = "http://**********/wxpay.php/Ajaxpayfun/wxpaynotify_url_sqlsta"; //支付成功后的回调地址注意,这里的url里面不要加参数
$newPara["trade_type"] = "APP"; //交易类型
$key = $api_key;// 密钥:在商户后台个人安全中心设置//第一次签名
$newPara["sign"] = $this -> appgetSign($newPara,$key);
//把数组转化成xml格式
$xmlData = $this -> arrayToXml($newPara);
$get_data = $this -> sendPrePayCurl($xmlData);
//返回的结果进行判断。
if($get_data["return_code"] == "SUCCESS" && $get_data["result_code"] == "SUCCESS"){
//根据微信支付返回的结果进行二次签名
//二次签名所需的随机字符串
$newPara["nonce_str"] = $this -> createNoncestr(); //二次签名所需的时间戳
$newPara["timeStamp"] = time().""; //二次签名剩余参数的补充
$secondSignArray = array(
"appid" =>$newPara["appid"],
"noncestr" =>$newPara["nonce_str"],
"package" =>"Sign=WXPay",
"prepayid" =>$get_data["prepay_id"],
"partnerid" =>$newPara["mch_id"],
"timestamp" =>$newPara["timeStamp"],);
$json["success"] = 1;
$json["ordersn"] = $newPara["out_trade_no"]; //订单号
$json["order_arr"] = $secondSignArray; //返给前台APP的预支付订单信息
$json["order_arr"]["sign"] = $this -> appgetSign($secondSignArray,$key); //预支付订单签名
$json["order_arr"]["out_trade_no"] = $newPara["out_trade_no"]; //商户订单号
$json["data"] = "预支付完成"; //预支付完成,在下方进行自己内部的业务逻辑
return json_encode($json["order_arr"]);
}else{
$json["success"] = 0;
$json["error"] =
$get_data["return_msg"];
return json_encode($json);
}
}
//商品订单号码生成方法可自定义
function ordersinfo(){
$shop = "TIANMEIAIC";
$date = date("YmdHi");
$time = time();
$out_trade_no = $shop.$date.$time;
return $out_trade_no;
}
//将数组转换为xml格式
function arrayToXml($arr){
$xml = "";
foreach ($arr as $key=>$val){
if (is_numeric($val)){
$xml.="".$val."".$key.">";
}else{
$xml.="".$key.">";
}
}
$xml.="";
return $xml;
}
//发送请求
function sendPrePayCurl($xml,$second=30){
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);//设置header
curl_setopt($ch, CURLOPT_HEADER, FALSE);//果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//post提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//运行curl
$data = curl_exec($ch);
curl_close($ch);
$data_xml_arr =$this -> XMLDataParse($data);
if($data_xml_arr){
return $data_xml_arr;
}else{
$error = curl_errno($ch);
echo"curl出错,错误码:$error"."
";
echo "错误原因查询";
curl_close($ch);
return false;
}
}
//xml格式数据解析函数
function XMLDataParse($data){
$xml = simplexml_load_string($data,NULL,LIBXML_NOCDATA);
$array=json_decode(json_encode($xml),true);
return $array;
}
//随机字符串
function createNoncestr( $length = 32 ){
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for($i = 0; $i < $length;$i++){
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}return $str;
}
/*格式化参数格式化成url参数 生成签名sign*/
function appgetSign($Obj,$appwxpay_key){
foreach ($Obj as $k => $v){
$Parameters[$k] = $v;
}
//签名步骤一:按字典序排序参数
ksort($Parameters);
$String = $this -> formatBizQueryParaMap($Parameters, false);
//echo "【string1】".$String."";
//签名步骤二:在string后加入KEY
if($appwxpay_key){
$String = $String."&key=".$appwxpay_key;
}
//echo "【string2】".$String."";
//签名步骤三:MD5加密
$String = md5($String);
//echo "【string3】 ".$String."";
//签名步骤四:所有字符转为大写
$result_ = strtoupper($String);
//echo "【result】 ".$result_."";
return $result_;
}
//按字典序排序参数
function formatBizQueryParaMap($paraMap, $urlencode) {
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v){
if($urlencode){
$v = urlencode($v);
}
//$buff .= strtolower($k) . "=" . $v . "&";
$buff .= $k . "=" . $v . "&";}
$reqPar;if (strlen($buff) > 0){
$reqPar = substr($buff, 0, strlen($buff)-1);
}
return $reqPar;
}
//微信支付成功后回调方法
public function wxpaynotify_url_sqlsta(){
$testxml = file_get_contents("php://input");
$jsonxml = json_encode(simplexml_load_string($testxml, 'SimpleXMLElement', LIBXML_NOCDATA));
$result = json_decode($jsonxml, true);//转成数组,
if($result){
//如果成功返回了
$out_trade_no = $result['out_trade_no'];
$transaction_id = $result['transaction_id'];
if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){
//执行业务逻辑改变订单状态等操作
$orderssave = $this -> orderssqlstasave($out_trade_no,$transaction_id);
}
}
}
//数据库订单数据修改方法
public function orderssqlstasave($out_trade_no,$transaction_id){
//查询创建订单表 where("out_trade_no='".$out_trade_no."' and paysta=1")
$where['paysta'] = 1;
$where['out_trade_no'] = $out_trade_no;
$list = M("orders") -> where($where) -> find();
if ($list && $list['transaction_id'] == '') {
$data['id'] = $list['id'];
$data['transaction_id'] = $transaction_id;
//查询出来有该订单 就改变状态
$save = M("orders") -> save($data);
if ($save) {
return $save;
}
}
}
}
微信支付服务器端php,APP微信支付php服务端函数方法相关推荐
- 送餐app+php,订餐APP源码Food Delivery App v2.1(客户端+服务端)
android订餐APP源码Food Delivery App v2.1(客户端+服务端),包含android客户端源码.php+mysql服务端源码. Version 2.1 Food Delive ...
- 游戏交流社区BBS论坛APP客户端和网页服务端设计 毕业论文+前后端源码及数据库文件
下载地址:https://download.csdn.net/download/m0_63680064/36065411 项目介绍: 游戏交流社区BBS论坛APP客户端和网页服务端设计 毕业论文+前后 ...
- 微信支付:app端提示微信签名失败,errCode=-2;后台服务端返回成功
1.微信有两个平台:一个开放平台一个商户平台 看开放平台V2版文档: 注意给微信传参的参数要小写: app端配置开放平台的签名 最好是打包正式版后获取的签名: 后台服务端有两次验签的过程,一定要第一次 ...
- 【APP支付】关于APP支付宝支付那些事
昨天整理了关于APP微信支付的东西,今天在整理代码之后,来谈谈支付宝的APP支付. 两者有很大相似之处,也有区别,只要理解了一个,另一个就很好理解了,如果是第一次做服务端的支付的话,建议先看看上面那篇 ...
- openid java_微信小程序调用微信登陆获取openid及java做为服务端示例
一.微信小程序 第一步:调用 wx.login获取code 文档地址 第二步:判断用户是否授权读取用户信息 文档地址 第三步:调用wx.getUserInfo读取用户数据 文档地址 第四步:由于小程序 ...
- 微信小程序获取用户信息(含服务端)
本文获取用户信息方式需要服务端配合,纯前端的可查看 微信小程序获取用户信息(纯前端) 若需获取 openid 和用户信息,可使用 wx.getUserInfo() 获取加密后的信息,传给服务端后解密. ...
- app消息推送服务器端,系统服务:APP消息推送服务
APP消息推送服务开通方法 在云表官网-管理控制台中,选择要开通APP消息推送服务的服务器,然后选择要开通APP消息推送服务的应用空间,点击对应应用空间的"应用空间管理". 在进入 ...
- 如何用php向wsdl服务器发请求,知道服务器端Wsdl,不写服务端代码,仅写客户端代码能调用服务端的方法吗?...
新手请教,望高手朋友不吝赐教,无比感谢中. 今天一大早开始研究Webservice,有一本不太专业的参考书,随便找了一个服务端的Wsdl,想调用其中的方法,结果搞了一天,无果,老报错,郁闷. 代码如下 ...
- android 快传 源码_最新安卓仿茄子快传APP源码包括服务端源码Android开发快传类项目源码全套...
适使用范围: 安卓APP茄子快传源码 Android项目源码相似茄子快传的快传项目包括服务端 运行环境: Android app 源码详细: 本项目是一个基于安卓的相似茄子快传的项目源码,包括安卓 ...
最新文章
- redis学习笔记---redis的哨兵Sentinel
- R创建分类变量(categorical variable)
- gitzip没有作用以及github如何下载单个文件或目录
- ITTC数据挖掘平台介绍(四) 框架改进和新功能
- Python的基本运算符
- python 调用摄像头拍照_《自拍教程67》Python调用摄像头, 拍照拍照!
- 梯度下降法Gradient Descent深度学习 机器学习
- linux more 下一页_Linux学习笔记
- 重写系统中的UINavigationController返回按钮的事件
- 从一道面试题谈linux下fork的运行机制
- Selenium常用API的使用java语言之13-多表单切换
- poj 1083 Moving Tables
- 胖球为李佳琦做数据?官方回应:系不实信息 已提出了投诉举报
- EXSi5.5安装篇
- Easy make - emake
- swiper5 点击图换下一张_软网推荐:骗倒社交好友 制作另类隐藏图
- python中三角函数计算
- 运放放大倍数计算公式_运放选型速记指南
- [杂谈]亿元大奖为何总落陌生客
- 操作系统实验一:线程的创建与撤销