1、微信公众号、微信小程序开发过程中,第三方服务器与微信服务器数据交互,需要进行数据转换,必须用到这两个函数:

分别是xml_to_array、array_to_xml ;

    /**
* 输出xml字符(数组转换成xml)
* @param $params 参数名称
* return string 返回组装的xml
**/
public function array_to_xml( $params ){
if(!is_array($params)|| count($params) <= 0)
{
return false;
}
$xml = "<xml>";
foreach ($params as $key=>$val)
{
if (is_numeric($val)){
$xml.="<".$key.">".$val."</".$key.">";
}else{
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
}
$xml.="</xml>";
return $xml;
}
/**
* 将xml转为array
* @param string $xml
* return array
*/
public function xml_to_array($xml){
if(!$xml){
return false;
}
//将XML转为array
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $data;
}

2、拼接参数,将数组转换成键值对形式的字符串:key=value&k=v

    /**
* 将参数拼接为url: key=value&key=value
* @param $params
* @return string
*/
public function ToUrlParams( $params ){
$string = '';
if( !empty($params) ){
$array = array();
foreach( $params as $key => $value ){
$array[] = $key.'='.$value;
}
$string = implode("&",$array);
}
return $string;
}

3、微信小程序生成签名,makeSign($params,$KEY),第一个参数是微信官方文档需要的参数;第二个参数是 申请微信支付获得的KEY

    /**
* 生成签名, $KEY就是支付key
* @return 签名
*/
public function MakeSign( $params,$KEY){
//签名步骤一:按字典序排序数组参数
ksort($params);
$string = $this->ToUrlParams($params); //参数进行拼接key=value&k=v
//签名步骤二:在string后加入KEY
$string = $string . "&key=".$KEY;
//签名步骤三:MD5加密
$string = md5($string);
//签名步骤四:所有字符转为大写
$result = strtoupper($string);
return $result;
}

4、微信小程序的签名,总共需要三次;期中前两次是必须的,最后一次尽量加上

4.1 第一次是【统一下单】,将所有需要的信息进行生成签名,包括:

$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;//服务器终端的ip
$post['total_fee'] = intval($total_fee); //总金额 最低为一分钱 必须是整数
$post['trade_type'] = $trade_type;
$sign = $this->MakeSign($post,$KEY); //签名

..等等信息;

4.2 第二次是根据【统一下单】获得的"PREPAY_ID",和申请支付获得的KEY,进行makeSign签名,返回给前端(如JS、APP等)进行调用wx.requestPayment({...})微信支付,包括:

$tmp['appId'] = $appid;
$tmp['nonceStr'] = $nonce_str;
$tmp['package'] = 'prepay_id='.$array['PREPAY_ID'];
$tmp['signType'] = 'MD5';
$tmp['timeStamp'] = "$time";

//上面是签名所需数据,下面是返回数据

$data['timeStamp'] = "$time";

$data['nonceStr'] = $nonce_str;

$data['signType'] = 'MD5';

$data['paySign'] = $this->MakeSign($tmp,$KEY);

$data['package'] = 'prepay_id='.$array['PREPAY_ID'];

($array是【统一下单】返回的数据,经过了xml_to_array处理)

4.3 第三次是微信将支付结果通知给商户,商户需要进行处理通知结果。(通俗点:就是微信告诉你,用户支付成功,你要给微信回一句话:我知道了。)

这个时候也需要makeSing签名,具体代码如下:

/* 微信支付完成,回调地址url方法  xiao_notify_url() */
public function xiao_notify_url(){
$KEY = '你申请微信支付的KEY';
$post = post_data(); //接受POST数据
$post_data = $this->xml_to_array($post); //微信支付成功,返回回调地址url的数据:XML转数组Array
$postSign = $post_data['sign'];
unset($post_data['sign']); //这里很重要哦,一定要将返回的sign剔除掉 /* 微信官方提醒:
* 商户系统对于支付结果通知的内容一定要做【签名验证】,
* 并校验返回的【订单金额是否与商户侧的订单金额】一致,
* 防止数据泄漏导致出现“假通知”,造成资金损失。
*/
ksort($post_data);// 对数据进行排序
//正常情况微信是不会返回支付的key的,为保万一我们判断一下 --xzz 0622
if($post_data['key']){
$str = $this->ToUrlParams($post_data);//对数组数据拼接成key=value字符串
}else{
$str = $this->ToUrlParams($post_data).'&key='.$KEY; //这里也一定要加上key,不然签名就错了
}
$user_sign = strtoupper(md5($str)); //再次生成签名,与$postSign比较 $where['crsNo'] = $post_data['out_trade_no'];
$order_msg = M('home_order','xxf_witkey_')->where($where)->find();
/*
* 分别判断返回状态码、返回签名sign、返回订单总金额,三者同时为真,订单交易成功,状态修改为‘ok’
*/
if($post_data['return_code']=='SUCCESS'&&$postSign==$user_sign&&$order_msg['order_amount']*100==$post_data['total_fee']){
/*
* 首先判断,订单是否已经更新为ok,因为微信会总共发送8次回调确认
* 其次,订单已经为ok的,直接返回SUCCESS
* 最后,订单没有为ok的,更新状态为ok,返回SUCCESS
*/
if($order_msg['order_status']=='ok'){
$this->return_success();
}else{
$updata['order_status'] = 'ok';
if(M('home_order','xxf_witkey_')->where($where)->save($updata)){
$this->return_success();
}
}
}else{
echo '微信支付失败';
}
} /*
* 给微信发送确认订单金额和签名正确,SUCCESS信息 -xzz0521
*/
private function return_success(){
$return['return_code'] = 'SUCCESS';
$return['return_msg'] = 'OK';
$xml_post = '<xml>
<return_code>'.$return['return_code'].'</return_code>
<return_msg>'.$return['return_msg'].'</return_msg>
</xml>';
echo $xml_post;exit;
}

5、再次提醒一下,这个代码是给微信小程序用的,其他的别照搬哦。

PHP:微信小程序调用【统一下单】【微信支付】【支付回调】API;XML转Array,Array转XML方法(通用)的更多相关文章

  1. 图解微信小程序---调用API操作步骤

    图解微信小程序---调用API操作步骤 什么是API API(Application Programming Interface,应用程序编程接口:是一些预先定义的函数,目的是提供应用程序与开发人员基 ...

  2. 微信小程序把玩(三十九)navigation API

    原文:微信小程序把玩(三十九)navigation API 演示效果也看到了小程序也就提供这几个处理导航控制.值得注意的是只能同时导航五个页面 主要属性: 导航条一些方法 wx.setNavigati ...

  3. 微信小程序把玩(三十六)Storage API

    原文:微信小程序把玩(三十六)Storage API 其实这个存储在新建Demo的时候就已经用到了就是存储就是那个logs日志,数据存储主要分为同步和异步 异步存储方法: 存数据 wx.setStor ...

  4. 【微信小程序】调起微信支付完整demo

    微信小程序调用微信支付接口 https://blog.csdn.net/u012667477/article/details/80940578

  5. 微信小程序全选,微信小程序checkbox,微信小程序购物车

    微信小程序,这里实现微信小程序checkbox,有需要此功能的朋友可以参考下. 摘要: 加减商品数量,汇总价格,全选与全不选 设计思路: 一.从网络上传入以下Json数据格式的数组  1.标题titl ...

  6. 微信小程序自运营器 微信小程序自动运营器(让你的微信小程序,公众号零运营成本,24小时全自动运营)

    自动发单,自动评价,自动评论,自动推广 微信小程序自运营器  微信小程序自动运营器(让你的微信小程序,公众号零运营成本,24小时全自动运营) 我们会根据你的微信公众号或微信小程序定制开发带有一定AI智 ...

  7. 微信小程序如何实现和微信客服通话?

    微信小程序如何实现和微信客服通话?

  8. 微信小程序把玩(三十四)Audio API

    原文:微信小程序把玩(三十四)Audio API 没啥可值得太注意的地方 重要属性: 1. wx.getBackgroundAudioPlayerState(object) 获取播放状态 2.wx.p ...

  9. 微信小程序把玩(三十五)Video API

    原文:微信小程序把玩(三十五)Video API 电脑端不能测试拍摄功能只能测试选择视频功能,好像只支持mp4格式,值得注意的是成功之后返回的临时文件路径是个列表tempFilePaths而不是tem ...

  10. 微信小程序把玩(三十二)Image API

    原文:微信小程序把玩(三十二)Image API 选择图片时可设置图片是否是原图,图片来源.这用的也挺常见的,比如个人中心中设置头像,可以与wx.upLoadFile()API使用 主要方法: wx. ...

随机推荐

  1. 算法:优先级队列(PriorityQueue)

    背景 此文给出基于已排序数组的实现,多数情况应该基于 Heap 进行实现,因为数组的插入效率为O(n),而 Heap 的插入效率为 Log(n). PriorityQueue 代码 using Sys ...

  2. Mybatis 传入List类型参数,报错:There is no getter for property named '__frch_item_0' in

    错误如下: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.Re ...

  3. 版本号控制-git(二)

    上次文章给大家介绍了Git的一些基本知识(http://www.cnblogs.com/jerehedu/p/4582398.html).并介绍了使用git init初始化化版本号库.使用git ad ...

  4. CenoOS下如何对mysql编码进行配置

    1 修改/etc/mysql/my.cnf配置文件 增加default-character-set=utf8 配置文件如下 [client] port = 3306 socket = /var/run ...

  5. libjson 编译和使用 - 1. 编译

    以下转自:http://blog.csdn.net/laogong5i0/article/details/8212511 最近想用box2dEdit来编辑一下比较复杂的图形然后倒入到自己有游戏里,但b ...

  6. 第九章 LinkedBlockingQueue源码解析

    1.对于LinkedBlockingQueue需要掌握以下几点 创建 入队(添加元素) 出队(删除元素) 2.创建 Node节点内部类与LinkedBlockingQueue的一些属性 static ...

  7. QT笔记:数据库总结(三)之SQL模型类-QSqlTableModel模型

    QSqlTableModel类继承至QSqlQueryModel类,该类提供了一个可读写单张SQL表的可编辑数据模型,功能:修改,插入,删除,查询,和排序 常用函数 QVariant headerDa ...

  8. IOS开发-提升app性能的25条建议和技巧

    前言 这篇文章介绍了作者开发工作中总结的25个iOS开发tips, 多年之前读过这篇文章.收益良多,基本每一个tips在我的应用开发过程中都使用过.今天把这篇文章又一次整理转发下,与大家一起学习,不论 ...

  9. Systemd 三部曲 之 PHP7

    安装编译php7时需要的依赖包 : yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-deve ...

  10. (转)NGUI制作转圈的技能CD特效

    在技能图标上面放个半透明的精灵,用来做技能冷却的特效,如下图所示,我就用NGUI中的图标来带代替. NGUI制作转圈的技能CD特效 然后修改一下特效的精灵类型,它是在技能图标上面悬浮半透明可旋转的精灵 ...