微信小程序 统一支付 php,微信/微信小程序统一下单(PHP版)
事先准备工作
1.开通公众号/小程序支付
2.商户号后台设置支付目录、回调目录、白名单等设置。
3.记录商户号ID(mchid)和生成支付key
需要准备辅助函数
//-----------------支付相关-----------------
//随机32位字符串
public function nonce_str(){
$result = '';
$str = 'QWERTYUIOPASDFGHJKLZXVBNMqwertyuioplkjhgfdsamnbvcxz';
for ($i=0;$i<32;$i++){
$result .= $str[rand(0,48)];
}
return $result;
}
//生成订单号
public function order_number(){
return date('Ymd',time()).time().rand(10,99);//18位
}
//签名 $data要先排好顺序
public function sign($data, $mch_key){
$stringA = '';
ksort($data);
foreach ($data as $key=>$value){
if(!$value) continue;
if($stringA) $stringA .= '&'.$key."=".$value;
else $stringA = $key."=".$value;
}
$wx_key = $mch_key;
$stringSignTemp = $stringA.'&key='.$wx_key;//申请支付后有给予一个商户账号和密码,登陆后自己设置key
return strtoupper(md5($stringSignTemp));
}
/**
* [http_request CURL请求函数版本1 发送数组或字符串]
* @param [type] $url [description]
* @param [type] $data [description]
* @param array $headers [description]
* @return [type] [description]
*/
public function http_request($url,$data = null,$headers=array()){
$curl = curl_init();
if( count($headers) >= 1 ){
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
}
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if (!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
/**
* [curl_post CURL请求函数 版本2 发送json]
* @param [String] $url [请求URL]
* @param [Array] $post_data [请求数组]
* @return [Array] [返回请求结果数组]
*/
public function curl_post($url, $post_data = ''){
$requestUrl = $url;
if ($post_data == '') {
$data_string = '{}';
}else{
$data = $post_data;
$data_string = json_encode($data, JSON_UNESCAPED_UNICODE);
}
$ch = curl_init($requestUrl);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string)
));
$result = curl_exec($ch);
if (curl_errno($ch)) {
curl_close($ch);
print curl_error($ch);
}else{
$result = json_decode($result, true);
curl_close($ch);
return $result;
}
}
/**
* [xml xml转数组]
* @param [type] $xml [description]
* @return [type] [description]
*/
public function xml($xml){
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $values;
}
支付核心
/**
* [Pay 支付]
* @return [type] [description]
*/
public function Pay() {
//支付金额
$fee = 0.01;
//公众号或小程序appid
$appid = '';
//商品描述
$body = 'XX服务购买';
//商户ID
$mch_id = '';
//商户key
$mch_key = '';
//随机字符串
$nonce_str = $this->nonce_str();
//异步回调URL(需在商户平台添加白名单)
$notify_url = '';
//用户openid
$openid = '';
//商户订单号
$out_trade_no = $this->order_number();
//用户openid
$openid = '';
//终端IP(服务器IP)
$spbill_create_ip = '';
//单位为分
$total_fee = $fee*100;
//交易类型 默认
$trade_type = 'JSAPI';
//这里是按照顺序的 因为下面的签名是按照顺序 排序错误 肯定出错
$post['appid'] = $appid;
$post['body'] = $body;
$post['mch_id'] = $mch_id;
$post['nonce_str'] = $nonce_str;
$post['notify_url'] = $notify_url;
$post['openid'] = $openid;
$post['out_trade_no'] = $out_trade_no;
$post['spbill_create_ip'] = $spbill_create_ip;
$post['total_fee'] = $total_fee;
$post['trade_type'] = $trade_type;
//生成签名
$sign = $this->sign($post, $mch_key);
//统一下单XML数据包生成
$post_xml = '
'.$appid.'
'.$mch_id.'
'.$nonce_str.'
'.$notify_url.'
'.$openid.'
'.$out_trade_no.'
'.$spbill_create_ip.'
'.$total_fee.'
'.$trade_type.'
'.$sign.'
';
//统一接口接口
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
//下单
$xml = $this->http_request($url,$post_xml);
//对下单结果解包(XML)
$array = $this->xml($xml);
if($array['return_code'] == 'SUCCESS' && $array['result_code'] == 'SUCCESS'){
$time = time();
$tmp = array();//临时数组用于签名
$tmp['appId'] = $appid;
$tmp['nonceStr'] = $nonce_str;
$tmp['package'] = 'prepay_id='.$array['prepay_id'];
$tmp['signType'] = 'MD5';
$tmp['timeStamp'] = "$time";
$data['state'] = 1;
$data['timeStamp'] = "$time"; //时间戳
$data['nonceStr'] = $nonce_str;//随机字符串
$data['signType'] = 'MD5'; //签名算法,暂支持 MD5
$data['package'] = 'prepay_id='.$array['prepay_id'];//统一下单接口返回的 prepay_id 参数值
$data['paySign'] = $this->sign($tmp);//签名,具体签名方案参见微信公众号支付帮助文档;
$data['out_trade_no'] = $out_trade_no;
}else{
$data['state'] = 0;
$data['text'] = "错误";
$data['RETURN_CODE'] = $array['RETURN_CODE'];
$data['RETURN_MSG'] = $array['RETURN_MSG'];
}
//订单储存到本地
$pay_data = array(
'order_id' => $out_trade_no,
'total_pay' => $fee,
'pay_status' => '未支付',
'pay_time' => time()
);
//输出订单数据到前端,调用支付SDK
echo json_encode($data, true);
}
异步回调
xml转数组函数
function xmlToArray($xml)
{
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $values;
}
异步回调验证
$pay_data = file_get_contents('php://input');
$pay_data = xmlToArray($pay_data);
if ($pay_data['result_code'] == 'SUCCESS' && $pay_data['return_code'] == 'SUCCESS') {
//此处为订单成功回调后的业务逻辑
//注:要验证订单真实性
}else{
//支付失败的业务逻辑,记录异常
}
备注
1.订单数据返回到前端之前,将订单信息插入到订单表,用来异步回调时核对账单。
2.异步回调要做好订单验证,相关验证SDK可以去微信支付开发文档查看。
3.本代码支持微信公众号和小程序的JSAPI支付。
4.本代码需要根据自身业务需求进行封装使用。
标签: 微信 php
顶一下
(0)
0%
踩一下
(0)
0%
微信小程序 统一支付 php,微信/微信小程序统一下单(PHP版)相关推荐
- 小程序 php wecahtpay,PHP 微信公众号,小程序获取支付参数。微信支付
PHP 微信公众号,小程序获取支付参数.微信支付 发布时间:2018-09-26 11:19, 浏览次数:278 , 标签: PHP 首先下载微信官方demo放入项目中 地址:https://gith ...
- 微信小程序暂停“虚拟支付”,知识付费小程序可以这么玩!
5月8日起小程序关闭虚拟支付,对于此次小程序关闭虚拟支付影响最大的,应该是知识付费/在线教育类的小程序,这类小程序现有的变现模式将受到巨大的冲击. 一.这次整改意味着什么?有3个需要注意 1.虚拟支付 ...
- java对接支付宝微信银联_JavaWEB后端支付银联,支付宝,微信对接
JavaWEB后端支付银联,支付宝,微信对接 标签(空格分隔): java 项目概述 最近项目需要后端打通支付,所以对接部分做成了一个小模块. 先说下项目要求: 后端要对接银联无跳转Token支付,支 ...
- Magicodes.Pay,打造开箱即用的统一支付库,已提供ABP模块封装
Magicodes.Pay,打造开箱即用的统一支付库,已提供ABP模块封装 简介 Magicodes.Pay,是心莱科技团队提供的统一支付库,相关库均使用.NET标准库编写,支持.NET Framew ...
- 微信小程序篇(微信小程序的支付)
微信小程序的支付和微信公众号的支付是类似的,对比起来还比公众号支付简单了一些,我们只需要调用微信的统一下单接口获取prepay_id之后我们在调用微信的支付即可. 今天我们来封装一般node的支付接口 ...
- 微信小程序实现支付功能
小程序支付,没有封装支付代码:直接上一段可用的流程代码吧: 微信小程序支付官网文档有详细的说明,这里我就不再赘述啦: 客户端js: wx.request({ url:'https://www.xxxx ...
- 浅析微信支付:微信支付简单介绍(小程序、公众号、App、H5)
本文是[浅析微信支付]系列文章的第二篇,主要讲解一下普通商户接入的支付方式以及其中的不同之处. 上篇文章讲了本系列的大纲,没有看过的朋友们可以看一下. 浅析微信支付:前篇大纲 微信支付是集成在微信客户 ...
- jsapi支付签名_微信支付小程序支付全流程
点击蓝色字关注我们! 一个努力中的公众号 长的好看的人都关注了 本文给大家讲解微信小程序支付全流程,以及相关功能源代码,项目不开放,带来不便尽请谅解.小程序支付主要包含如下几步骤,1.预下单-调用微信 ...
- 支付即服务、门店小程序、微信先享卡分别亮相,微信支付持续助力行业数字化升级
9月10日,在2020腾讯全球数字生态大会微信专场上,微信支付零售行业运营总监白振杰分享"微信支付行业深耕,助力商业经济复苏增长",介绍微信支付及生态内在产品能力和营销工具上的运营 ...
- 微信小程序调用支付接口支付(tp5、小程序)
微信小程序调用支付接口支付 今天记录一下学习的小程序调用微信支付接口 一.先理清一下调起微信支付的整个流程. 1.就是先调用微信的支付统一下单api获取到prepay_id 2.然后后端再将这个pre ...
最新文章
- .bat脚本自动yes_推荐|PyToBI自动标注韵律
- java 非法字符u3000_IDEA编码格式问题:Error:(3, 13) java: 非法字符: '\u0000'
- [13] 弧面(Arc)图形的生成算法
- 工作随笔——Intellij_idea-14官方快捷键中文版
- 1130 - Host ‘win7' is not allowed to connect to this mysql server
- C++:函数参数不确定时用cstdarg(stdarg.h)
- idea补全代码快捷键
- ORA-20446: The owner of the job is not registered ORA-06512: at SYSMAN.MGMT
- PostgreSQL数据库修改sql表的方法汇总
- DataNode,NameNode,JobTracker,TaskTracker用jps查看无法启动解决办法
- STM8输出PWM变频时波形断开解决方法
- select * from什么意思_SQL入门教程第15课:什么是内连接
- jdbc获取数据库元数据,获取数据库列表,获取数据库基本信息,获取指定数据库中的表信息,获取指定表中的字段信息
- bzoj 2553 [BeiJing2011]禁忌——AC自动机+概率DP+矩阵
- 哈工大威海计算机考研招生简章,2017年哈尔滨工业大学(威海)考研专业目录及考试科目...
- 特朗普“能源独立”政策效果存疑
- 【Java】GUI图形化界面中,setBounds()中参数的含义
- 华为在俄罗斯开设基于ARM技术的数据中心:技术之外,环境使然?
- RAW和QCOW2 两种存储设备格式区别
- krpano 如何开启调试
热门文章
- JAVA基础8-封装(2)
- python 图片 文本 矫正
- python 中文转unicode编码_Python 解码 Unicode 转义字符串
- 超详细的Python中的字符串常识【赶紧收藏】
- mysql server远程连接_MySql server:开放mysql远程连接
- 刷新table数据_经典 - 一文轻松看懂数据透视表
- php memcached 扩展安装目录,php安装memcached扩展
- html页面布局名称,HTML页面模块的常用命名
- Windows10为什么自带Linux,一直没有发现原来 Win10 内置了一个 Linux
- 8、Kubernetes核心技术Service