微信app支付,完整流程,完整代码 (转)
微信app支付流程
需要的配置参数
private function wechat($body,$indent_id,$cou,$user_id,$total_fee,$ip,$domain,$nonce_str){ //微信配置信息和初始逻辑
$appid= \WxPayConfig::APPID; //appid (微信开放平台的应用appid)
$body= $body; //商品描述
$mch_id= \WxPayConfig::MCHID; //商户号(注册商户平台时,发置注册邮箱的商户id)
$notify_url= ******; //回调地址(外部可访问的)
$out_trade_no= time(); //商户订单编号自定义
$ip = $ip;
$total_fee= $total_fee; //支付金额 分
$key = \WxPayConfig::KEY;(商户平台api支付处设置的key)
$param = $this->signature($appid,$body,$mch_id,$nonce_str,$notify_url,$out_trade_no,$ip,$total_fee,$key); //请求数据转码,xml格式 下文会有介绍
$payment = Payment::create([//插入预订单(这个对应数据库字段就行,根据自己情况来)
'indent_id'=> $indent_id, //订单id
'coupon_id'=> $cou==null?0:$cou->id, //优惠券id
'ordernum'=> $out_trade_no,
'user_id'=> $user_id, //用户id
'update_time' => time(),
'create_time'=> time(),
'way'=> $body,
'content' => 'APP马上拍【微信】'
]);
return $param;
}
2.请求数据组装成xml格式
private function signature($appid,$body,$mch_id,$nonce_str,$notify_url,$out_trade_no,$ip,$total_fee,$key){ //支付请求数据组装
$stringA = "appid=$appid&body=$body&mch_id=$mch_id&nonce_str=$nonce_str¬ify_url=$notify_url&out_trade_no=$out_trade_no&spbill_create_ip=$ip&total_fee=$total_fee&trade_type=APP";
$stringSignTemp = $stringA."&key=$key";
$sign = strtoupper(md5($stringSignTemp)); //签名
$param = "<xml>\n";
$param .= "<appid>{$appid}</appid>\n";
$param .= "<body>{$body}</body>\n";
$param .= "<mch_id>{$mch_id}</mch_id>\n";
$param .= "<nonce_str>{$nonce_str}</nonce_str>\n";
$param .= "<notify_url>{$notify_url}</notify_url>\n";
$param .= "<out_trade_no>{$out_trade_no}</out_trade_no>\n";
$param .= "<spbill_create_ip>{$ip}</spbill_create_ip>\n";
$param .= "<total_fee>{$total_fee}</total_fee>\n";
$param .= "<trade_type>APP</trade_type>\n";
$param .= "<sign>{$sign}</sign>\n";
$param .= "</xml>";
return $param;
}
3.统一下单,拿到需要的参数,并二次签名,(这一步,就可以拿到所有的字段,倒是后app请求的时候,返回给app就可以,app藉此可以调起app支付)
private function unify_curl($param,$ip,$total_fee,$domain,$body,$timestamp){//统一下单(拿到微信临时会话id,二次签名组装,返回给app ,)
$xml = $this->post_curl("https://api.mch.weixin.qq.com/pay/unifiedorder",$param); //发起请求
$info = json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),true); //数据结果解析
$appid= $info['appid'];//二次签名
$body= $body; //商品描述
$mch_id= $info['mch_id'];
$ip = $ip;
$key = \WxPayConfig::KEY;
$prepay_id= $info['prepay_id'];
$noncestr = $info['nonce_str'];
$SignA = strtoupper(md5("appid=$appid&noncestr=$noncestr&package=Sign=WXPay&partnerid=$mch_id&prepayid=$prepay_id×tamp=$timestamp&key=$key"));
$info['sign']= $SignA;
$info['timestamp'] = $timestamp;
return $info;
}
private function post_curl($url,$data,$agreement = 0){//curl远程请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
if($agreement == 0){//0 https 1 http
unset($_REQUEST['agreement']);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
}
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
4.微信支付回调
function wechat_notify(){
$postStr = @$GLOBALS["HTTP_RAW_POST_DATA"];
$getData = json_decode(json_encode(simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA)),true);
if (!empty($getData['result_code']) || $getData['result_code'] =='SUCCESS') {//如果支付成功
//你的业务逻辑
return 'SUCCESS';
}
}
转载自:https://blog.csdn.net/qq_34629975/article/details/53609241
微信app支付,完整流程,完整代码 (转)的更多相关文章
- 微信APP支付整体流程记录备忘
支付整体流程见文档:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3 商户系统和微信支付系统主要交互说明: 步骤1: ...
- nodejs+koa2微信app支付,小程序支付
企业付款到零钱文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2 1,搞微信支付,先看流程图 https: ...
- 微信App支付接入步骤&支付中前后端交互流程
最近对微信App支付(App端集成微信支付SDK)申请步骤,以及终端在进行微信支付时商户App.商户Server.微信App.微信支付Server的交互流程进行了简单了解.这篇文章应该算是学习笔记,分 ...
- .net 微信APP支付接口的开发流程以及坑
流程 申请APP的微信支付 申请成功之后得到APPID 商户号 以及自己设置商户号的支付密码 这时就可以开发接口了 微信APP支付API:https://pay.weixin.qq.com/wiki/ ...
- php开发微信APP支付接口
之前在开发APP中用到了微信支付,因为是第一次用,所以中途也遇到了好多问题,通过查看文档和搜集资料,终于完成了该功能的实现.在这里简单分享一下后台php接口的开发实例. 原文地址:代码汇个人博客 ht ...
- 微信支付-微信公众号支付,微信H5支付,微信APP支付,微信扫码支付
在支付前,如果使用第三方MVC框架,则使用重写模式,服务器也需要配置该项 if (!-e $request_filename){ rewrite ^/(.*)$ /index.php/$ last; ...
- .Net后台实现微信APP支付
上一节分享了微信小程序支付的后台,这一节来分享一下微信APP支付的后台.微信APP支付和微信小程序差别不大,微信APP支付后台不需要微信登录凭证.后台下单时交易类型(trade_type)不再是&qu ...
- 微信app支付android客户端以及.net服务端实现
由于公司运营需要,需要在客户端(android/ios)增加微信以及支付宝支付,在调用微信app支付时遇到一些问题,也算是一些踩过的坑,记录下来 ,希望能对.net开发者服务端网站更快的集成微信app ...
- H5使用codovar插件实现微信支付(微信APP支付模式,前端)
H5打包的app实现微信支付及支付宝支付,本章主要详解微信支付,支付宝支付请查看另一篇“H5使用codovar插件实现支付宝支付(支付宝APP支付模式,前端)” ps:本文只试用H5开发的,微信 AP ...
随机推荐
- Lua _G
1.全局变量的原形 在Lua中,要声明全局变量很简单,那就是定义变量的时候,前面不要加上local. 这个神秘的全局变量,其实本质上也是一个table,它把我们创建的全局变量都保存到一个table里了 ...
- unity给子物体添加Shader
分享两个自制Shader:http://pan.baidu.com/s/1nuRcF2L Shader存放路径:\Assets\Resources\Shader\ 定义Shader类型: public ...
- python类属性和实例属性的访问
- 如何设计 API 接口,实现统一格式返回?
文章目录: 目录 前后端接口交互 接口返回值约定 返回值规范 正确返回 错误返回 统一定义错误码 错误码规范 Controller 层如何用? 正确返回 错误返回 详细代码实现 错误码 Control ...
- 3. servlet 和 springmvc框架关系
在springmvc上我们会编写很多相关的配置 编写springmvc.xml 配置映射器 配置 处理适配器 ... web.xml 配置前端控制器 (DispatcherServlet) 官网: h ...
- GO文件读写01---读文件
打开文件 package main import ( "fmt" "os" ) /* buffer 缓冲区 utility 便利的工具 util 便捷工具(傻瓜 ...
- MapReduce —— MapTask阶段源码分析(Input环节)
不得不说阅读源码的过程,极其痛苦 .Dream Car 镇楼 ~ ! 虽说整个MapReduce过程也就只有Map阶段和Reduce阶段,但是仔细想想,在Map阶段要做哪些事情?这一阶段具体应该包含数 ...
- Java网络编程实践
网络编程的目的 无线电台......传播交流信息,数据交换.通信 想要达到这个效果需要什么: 1. 如何准确的定位网络上的第一台主机 192.168.16.124:端口,定位到这个计算机上的某个资源. ...
- 深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用
反射的概念 反射: Refelection,反射是Java的特征之一,允许运行中的Java程序获取自身信息,并可以操作类或者对象的内部属性 通过反射,可以在运行时获得程序或者程序中的每一个类型的成员活 ...
- TopN算法,流式数据获取前N条数据
背景:由于业务需求,用户想要统计每周,每月,几个月,一年之中的前N条数据. 根据已有的思路无非就是对全部的数据进行排序,然后取出前N条数据,可是这样的话按照目前最优的排序算法复杂度也在O(nlog(n ...