PHP开发APP端微信支付功能


Posted in PHP onFebruary 17, 2017

用PHP开发APP端微信支付的一点个人心得

最近因为公司需求,要开发APP端上的微信支付,看了微信文档,感觉还不错,没有遇到太大的坑,需要注意的点不算太多。

写一个记事文档,作为备忘录。

APP支付流程

PHP开发APP端微信支付功能

从上面的图片中,可以看出来,需要注意的流程是一共是3部分;
第一部分:调用下单API,返回预支付订单,签名之后再返回信息(4、5、6、7)
第二部分:异步通知(15、16)
第三部分:最后的判断支付结果
最需要注意的就是第一部分:调用下单API,返回预支付订单,签名之后再返回信息

微信文档中有详细的说明,这里不再赘述。

附录一下我的代码,伸手党,稍微改点代码就可以用了。

//入口函数
function weChatPay(){
   $json = array();
   //生成预支付交易单的必选参数:
   $newPara = array();
   //应用ID
   $newPara["appid"] = "wx2421b1c4370ec43b";
   //商户号
   $newPara["mch_id"] = "10000100";
   //设备号
   $newPara["device_info"] = "WEB";
   //随机字符串,这里推荐使用函数生成
   $newPara["nonce_str"] = "1add1a30ac87aa2db72f57a2375d8fec";
   //商品描述
   $newPara["body"] = "APP支付测试";
   //商户订单号,这里是商户自己的内部的订单号
   $newPara["out_trade_no"] = "1415659990";
   //总金额
   $newPara["total_fee"] = 1;
   //终端IP
   $newPara["spbill_create_ip"] = $_SERVER["REMOTE_ADDR"];
   //通知地址,注意,这里的url里面不要加参数
   $newPara["notify_url"] = "http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php";
   //交易类型
   $newPara["trade_type"] = "APP";
   //第一次签名
   $newPara["sign"] = produceWeChatSign($newPara);
   //把数组转化成xml格式
   $xmlData = getWeChatXML($newPara);
   //利用PHP的CURL包,将数据传给微信统一下单接口,返回正常的prepay_id
   $get_data = sendPrePayCurl($xmlData);
   //返回的结果进行判断。
   if($get_data['return_code'] == "SUCCESS" && $get_data['result_code'] == "SUCCESS"){
    //根据微信支付返回的结果进行二次签名
    //二次签名所需的随机字符串
    $newPara["nonce_str"] = "5K8264ILTKCH16CQ2502SI8ZNMTM67VS";
    //二次签名所需的时间戳
    $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['datas'] = $secondSignArray;
    $json['ordersn'] = $newPara["out_trade_no"];
    $json['datas']['sign'] = weChatSecondSign($newPara,$get_data['prepay_id']);
    $json['message'] = "预支付完成";
    //预支付完成,在下方进行自己内部的业务逻辑
    /*****************************/
    return json_encode($json);
   }
   else{
    $json['message'] = $get_data['return_msg'];
   }
  }
  return json_encode($json);
 }

//第一次签名的函数produceWeChatSign
function produceWeChatSign($newPara){
  $stringA = self::getSignContent($newPara);
  $stringSignTemp=$stringA."&key=192006250b4c09247ec02edce69f6a2d";
  return strtoupper(MD5($stringSignTemp));
 }

//生成xml格式的函数
 public static function getWeChatXML($newPara){
  $xmlData = "<xml>";
  foreach ($newPara as $key => $value) {
   $xmlData = $xmlData."<".$key.">".$value."</".$key.">";
  }
  $xmlData = $xmlData."</xml>";
  return $xmlData;
 }

//通过curl发送数据给微信接口的函数
function sendPrePayCurl($xmlData) {
  $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
  $header[] = "Content-type: text/xml";
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl, CURLOPT_POST, 1);
  curl_setopt($curl, CURLOPT_POSTFIELDS, $xmlData);
  $data = curl_exec($curl);
  if (curl_errno($curl)) {
   print curl_error($curl);
  }
  curl_close($curl);
  return self::XMLDataParse($data);

 }

//xml格式数据解析函数
 public static function XMLDataParse($data){
  $msg = array();
  $msg = (array)simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);
  return $msg;
 }

//二次签名的函数
function weChatSecondSign($newPara,$prepay_id){
  $secondSignArray = array(
   "appid"=>$newPara['appid'],
   "noncestr"=>$newPara['nonce_str'],
   "package"=>"Sign=WXPay",
   "prepayid"=>$prepay_id,
   "partnerid"=>$newPara['mch_id'],
   "timestamp"=>$newPara['timeStamp'],
  );
  $stringA = self::getSignContent($secondSignArray);
  $stringSignTemp=$stringA."&key=192006250b4c09247ec02edce69f6a2d";
  return strtoupper(MD5($stringSignTemp));
 }

两个注意点:

1.二次签名需要在后台完成,并且完成之后,连带着二次签名所用的所有信息一起传给前端,让前段唤起微信支付。这样不容易出现没法吊起微信支付的情况。
2.两次签名,用的是不同的随机字符串。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP中for循环语句的几种变型
Nov 26 PHP
将数组写入txt文件 var_export
Apr 21 PHP
一步一步学习PHP(7) php 字符串相关应用
Mar 05 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
Apr 28 PHP
php jq jquery getJSON跨域提交数据完整版
Sep 13 PHP
PHP JS Ip地址及域名格式检测代码
Sep 27 PHP
PHP清除字符串中所有无用标签的方法
Dec 01 PHP
CI框架中通过hook的方式实现简单的权限控制
Jan 07 PHP
php7 安装yar 生成docker镜像
May 09 PHP
PHP PDOStatement::bindParam讲解
Jan 30 PHP
php+lottery.js实现九宫格抽奖功能
Jul 21 PHP
Laravel 对某一列进行筛选然后求和sum()的例子
Oct 10 PHP
php+webSoket实现聊天室示例代码(附源码)
Feb 17 #PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
Feb 17 #PHP
PHP常用的三种设计模式
Feb 17 #PHP
轻松实现php文件上传功能
Feb 17 #PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
Feb 17 #PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
Feb 17 #PHP
php使用parse_str实现查询字符串解析到变量中的方法
Feb 17 #PHP
You might like
自制PHP框架之设计模式
2017/05/07 PHP
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
jQuery插件zTree实现的多选树效果示例
2017/03/08 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
Angular2整合其他插件的方法
2018/01/20 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
2018/04/21 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
layui 解决富文本框form表单提交为空的问题
2019/10/26 Javascript
Python中条件判断语句的简单使用方法
2015/08/21 Python
Python的Asyncore异步Socket模块及实现端口转发的例子
2016/06/14 Python
Python实现字符串反转的常用方法分析【4种方法】
2017/09/30 Python
Python中类的初始化特殊方法
2017/12/01 Python
对Python中内置异常层次结构详解
2018/10/18 Python
PyCharm设置每行最大长度限制的方法
2019/01/16 Python
python3对拉勾数据进行可视化分析的方法详解
2019/04/03 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
python三大神器之fabric使用教程
2019/06/10 Python
python time.sleep()是睡眠线程还是进程
2019/07/09 Python
Form表单及django的form表单的补充
2019/07/25 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
python 读取二进制 显示图片案例
2020/04/24 Python
python如何停止递归
2020/09/09 Python
python 实现单例模式的5种方法
2020/09/23 Python
pyqt5实现井字棋的示例代码
2020/12/07 Python
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
党的群众路线教育学习材料
2014/05/12 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
如何拟写通知正文?
2019/04/02 职场文书
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js
Python函数中apply、map、applymap的区别
2021/11/27 Python