事先准备工作

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版)相关推荐

  1. 小程序 php wecahtpay,PHP 微信公众号,小程序获取支付参数。微信支付

    PHP 微信公众号,小程序获取支付参数.微信支付 发布时间:2018-09-26 11:19, 浏览次数:278 , 标签: PHP 首先下载微信官方demo放入项目中 地址:https://gith ...

  2. 微信小程序暂停“虚拟支付”,知识付费小程序可以这么玩!

    5月8日起小程序关闭虚拟支付,对于此次小程序关闭虚拟支付影响最大的,应该是知识付费/在线教育类的小程序,这类小程序现有的变现模式将受到巨大的冲击. 一.这次整改意味着什么?有3个需要注意 1.虚拟支付 ...

  3. java对接支付宝微信银联_JavaWEB后端支付银联,支付宝,微信对接

    JavaWEB后端支付银联,支付宝,微信对接 标签(空格分隔): java 项目概述 最近项目需要后端打通支付,所以对接部分做成了一个小模块. 先说下项目要求: 后端要对接银联无跳转Token支付,支 ...

  4. Magicodes.Pay,打造开箱即用的统一支付库,已提供ABP模块封装

    Magicodes.Pay,打造开箱即用的统一支付库,已提供ABP模块封装 简介 Magicodes.Pay,是心莱科技团队提供的统一支付库,相关库均使用.NET标准库编写,支持.NET Framew ...

  5. 微信小程序篇(微信小程序的支付)

    微信小程序的支付和微信公众号的支付是类似的,对比起来还比公众号支付简单了一些,我们只需要调用微信的统一下单接口获取prepay_id之后我们在调用微信的支付即可. 今天我们来封装一般node的支付接口 ...

  6. 微信小程序实现支付功能

    小程序支付,没有封装支付代码:直接上一段可用的流程代码吧: 微信小程序支付官网文档有详细的说明,这里我就不再赘述啦: 客户端js: wx.request({ url:'https://www.xxxx ...

  7. 浅析微信支付:微信支付简单介绍(小程序、公众号、App、H5)

    本文是[浅析微信支付]系列文章的第二篇,主要讲解一下普通商户接入的支付方式以及其中的不同之处. 上篇文章讲了本系列的大纲,没有看过的朋友们可以看一下. 浅析微信支付:前篇大纲 微信支付是集成在微信客户 ...

  8. jsapi支付签名_微信支付小程序支付全流程

    点击蓝色字关注我们! 一个努力中的公众号 长的好看的人都关注了 本文给大家讲解微信小程序支付全流程,以及相关功能源代码,项目不开放,带来不便尽请谅解.小程序支付主要包含如下几步骤,1.预下单-调用微信 ...

  9. 支付即服务、门店小程序、微信先享卡分别亮相,微信支付持续助力行业数字化升级

    9月10日,在2020腾讯全球数字生态大会微信专场上,微信支付零售行业运营总监白振杰分享"微信支付行业深耕,助力商业经济复苏增长",介绍微信支付及生态内在产品能力和营销工具上的运营 ...

  10. 微信小程序调用支付接口支付(tp5、小程序)

    微信小程序调用支付接口支付 今天记录一下学习的小程序调用微信支付接口 一.先理清一下调起微信支付的整个流程. 1.就是先调用微信的支付统一下单api获取到prepay_id 2.然后后端再将这个pre ...

最新文章

  1. .bat脚本自动yes_推荐|PyToBI自动标注韵律
  2. java 非法字符u3000_IDEA编码格式问题:Error:(3, 13) java: 非法字符: '\u0000'
  3. [13] 弧面(Arc)图形的生成算法
  4. 工作随笔——Intellij_idea-14官方快捷键中文版
  5. 1130 - Host ‘win7' is not allowed to connect to this mysql server
  6. C++:函数参数不确定时用cstdarg(stdarg.h)
  7. idea补全代码快捷键
  8. ORA-20446: The owner of the job is not registered ORA-06512: at SYSMAN.MGMT
  9. PostgreSQL数据库修改sql表的方法汇总
  10. DataNode,NameNode,JobTracker,TaskTracker用jps查看无法启动解决办法
  11. STM8输出PWM变频时波形断开解决方法
  12. select * from什么意思_SQL入门教程第15课:什么是内连接
  13. jdbc获取数据库元数据,获取数据库列表,获取数据库基本信息,获取指定数据库中的表信息,获取指定表中的字段信息
  14. bzoj 2553 [BeiJing2011]禁忌——AC自动机+概率DP+矩阵
  15. 哈工大威海计算机考研招生简章,2017年哈尔滨工业大学(威海)考研专业目录及考试科目...
  16. 特朗普“能源独立”政策效果存疑
  17. 【Java】GUI图形化界面中,setBounds()中参数的含义
  18. 华为在俄罗斯开设基于ARM技术的数据中心:技术之外,环境使然?
  19. RAW和QCOW2 两种存储设备格式区别
  20. krpano 如何开启调试

热门文章

  1. JAVA基础8-封装(2)
  2. python 图片 文本 矫正
  3. python 中文转unicode编码_Python 解码 Unicode 转义字符串
  4. 超详细的Python中的字符串常识【赶紧收藏】
  5. mysql server远程连接_MySql server:开放mysql远程连接
  6. 刷新table数据_经典 - 一文轻松看懂数据透视表
  7. php memcached 扩展安装目录,php安装memcached扩展
  8. html页面布局名称,HTML页面模块的常用命名
  9. Windows10为什么自带Linux,一直没有发现原来 Win10 内置了一个 Linux
  10. 8、Kubernetes核心技术Service