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读取30天之内的根据算法排序的代码
Apr 06 PHP
PHP Mysql编程之高级技巧
Aug 27 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
Jan 11 PHP
PHP设计模式 注册表模式
Feb 05 PHP
php的ddos攻击解决方法
Jan 08 PHP
php判断并删除空目录及空子目录的方法
Feb 11 PHP
ThinkPHP的常用配置选项汇总
Mar 24 PHP
Yii CFileCache 获取不到值的原因分析
Feb 08 PHP
ThinkPHP删除栏目(实现批量删除栏目)
Jun 21 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
PHP文件上传小程序 适合初学者学习!
May 23 PHP
Laravel ORM 数据model操作教程
Oct 21 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自定义函数截取汉字长度
2014/05/15 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
2013/05/15 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
详解JS对象封装的常用方式
2016/12/30 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
nodejs动态创建二维码的方法
2017/08/12 NodeJs
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
使用vue-router设置每个页面的title方法
2018/02/11 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
浅谈vue后台管理系统权限控制思考与实践
2018/12/19 Javascript
详解使用React制作一个模态框
2019/03/14 Javascript
nodejs分离html文件里面的js和css的方法
2019/04/09 NodeJs
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
微信小程序如何加载数据库真实数据的实现
2020/03/04 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
手把手教你如何编译打包video.js
2020/12/09 Javascript
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
详解python中的线程
2018/02/10 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
Python读取excel指定列生成指定sql脚本的方法
2018/11/28 Python
python自动化之Ansible的安装教程
2019/06/13 Python
详解python中*号的用法
2019/10/21 Python
亚马逊印度站:Amazon.in
2017/10/15 全球购物
旷课检讨书大全
2014/01/21 职场文书
不拖欠农民工工资承诺书
2014/03/31 职场文书
机械专业求职信范文
2014/07/15 职场文书
个人房屋买卖协议书(范本)
2014/10/04 职场文书
2014小学年度工作总结
2014/12/20 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书
Vue Element-ui表单校验规则实现
2021/07/09 Vue.js