最近做了一个小程序支付,发现网上还是有很多问题的今天就把整个思路和代码贴给大家并详细的讲解一下
思路:1.预支付2.预支付返回的prepay_id 进行重新组建数据,搭建需要的参数调用js进行移动端支付3.在2步骤中上传的notify_url地址就是回调地址记住:小程序这个地址不允许有参数切记,在这个地址中处理你的服务器的逻辑
准备的数据:1.小程序appid2.小程序绑定的商户号3.商户号申请或者重置后的key值
代码:1.准备配置公共配置参数  static $wxpayconf = ['wx_smallprogram_appid'=>'wx13212312313123',// 小程序appid'mch_id'=>12312345454 ,// 小程序商户号'key'=>'Gjanuarygaoqingsong','appsecret'=>'1231231212daseqe123213','notify_url'=>'http://www.gaoqingsong.com/index.php?',// 支付回调地址];2.预支付部分(其实就是统一下单和微信公众号的都一样不过这里我还要贴出来), 支付环境配置部分:// 统一下单,并且直接支付public function unifiedorder($paydata,$orderSn){// 初始化小程序支付配置$wxpayconf = self::$wxpayconf;$userIP = $_SERVER['REMOTE_ADDR'];$sign['appid']            = $appid            = $wxpayconf['wx_smallprogram_appid'];$sign['mch_id']           = $mch_id           = $wxpayconf['mch_id'];$sign['nonce_str']        = $nonce_str        = $this->nonceStr();$sign['body']             = $body             = 'Gjanury测试商品';$sign['out_trade_no']     = $out_trade_no     = $orderSn;$sign['total_fee']        = $total_fee        = 1/*$paydata['actualpayment'] * 100*/;// 单位是分 1元 = 100分$sign['spbill_create_ip'] = $spbill_create_ip = $userIP;// 终端客户端ip$sign['trade_type']       = $trade_type       = 'JSAPI';$sign['openid']           = $openid           = $paydata['openid'];$sign['notify_url']       = $notify_url       = $wxpayconf['notify_url'];;$sign['sign'] = $this->getSign($sign,$wxpayconf['key']);// 统一下单接口$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';$data = $this->arrayToXml($sign);$res = $this->postXmlCurl($data,$url);if($res['errNum'] != 0){echo json_encode($res);die;}else{$res = $res['info'];}if($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS'){$prepay_id = $res['prepay_id'];// prepay_id的为预支付// 小程序提供的是接口而已。直接调出即可// 支付环境参数配置部分$yuzhifudata['appId'] = $wxpayconf['wx_smallprogram_appid'];$yuzhifudata['package'] =  'prepay_id='.$prepay_id;$yuzhifudata['timeStamp'] = (string)time();$yuzhifudata['nonceStr'] = $this->nonceStr();$yuzhifudata['signType'] = 'MD5';$yuzhifudata['paySign'] = $this->getSign($yuzhifudata,$wxpayconf['key']);exit(json_encode($yuzhifudata));}else{if($res['return_code'] == 'FAIL'){$info['return_msg'] = $res['return_msg'];}if($res['result_code'] == 'FAIL'){$info['err_code'] = $res['err_code'];$info['err_code_des'] = $res['err_code_des'];}exit($info);}//  签名方法private function getSign($params, $key1){//签名步骤一:按字典序排序数组参数ksort($params);$singstring = '';foreach ($params as $key => $value) {$singstring .= '&'.$key . '=' . $value;}$string = $singstring . "&key=" . $key1;//签名步骤三:MD5加密$string = ltrim($string,'&');$string = md5($string);//签名步骤四:所有字符转为大写$result = strtoupper($string);return $result;}// 数组转xmlpublic function arrayToXml($arr,$is_array=false){  if (!$is_array){  $xml = '<xml>';  }  foreach ($arr as $key=>$val){  if(is_array($val)){  $xml.="<".$key.">".$this->arrayToXml($val,true)."</".$key.">";  }else{  $xml.="<".$key.">".$val."</".$key.">";  }  }  if (!$is_array){  $xml.="</xml>";  }return $xml;     }3.小程序js部分:wx.request({url: 'http://www.gaoqingsong.com/index.php?m=xxxx&a=payment', data: {tablenumber: tablenumber,// 下单桌号orderdetail: JSON.stringify(that.data.goods),// 点餐的详情,对象转化成json字符串方便后台进行存储调用amount: that.data.totalprice,// 订餐的总价格actualpayment: that.data.totalprice,// 实际付款金额openid: useropenid,// 实际付款金额wxheadimg: wxinfo.avatarUrl,wxname: wxinfo.nickName,},method: "POST",header: {"content-type": "application/x-www-form-urlencoded"// post方式提交用这种header头},success: function (res) {wx.navigateTo({url: '../paysuccess/paysuccess'});var timeStamp = res.data.timeStamp;wx.requestPayment({'timeStamp': timeStamp,'nonceStr': res.data.nonceStr,'package': res.data.package,'signType': res.data.signType,'paySign': res.data.paySign,'success': function (res) {if(res.errMsg == 'requestPayment:ok'){wx.navigateTo({url: '../paysuccess/paysuccess'});}},'fail': function (res) {console.log(res);},'complete': function (res) { }})}})4.回调页面代码:$receipt = $_REQUEST;if($receipt==null){$receipt = file_get_contents("php://input");}if($receipt == null){$receipt = $GLOBALS['HTTP_RAW_POST_DATA'];}$post_data = $this->xml_to_array($receipt); $postSign = $post_data['sign'];unset($post_data['sign']);ksort($post_data);// 对数据进行排序$str = $this->ToUrlParams($post_data);//对数组数据拼接成key=value字符串$user_sign = strtoupper(md5($post_data));   //再次生成签名,与$postSign比较$ordernumber = $post_data['out_trade_no'];// 订单可以查看一下数据库是否有这个订单if($post_data['return_code']=='SUCCESS'&&$postSign){// 查询订单是否已经支付$result = M('userorder')->where('ordernumber = "'.$ordernumber.'"')->select();if($result){if($result[0]['paystatus'] == 0){// 进行更改支付成功状态$obj = array("paystatus" =>1,);$res = M('userorder')->where('ordernumber = "'.$ordernumber.'"')->save($obj);file_put_contents('gg.txt',$res);if($res){$this->return_success();}}else{$this->return_success();}}else{echo '微信支付失败,数据未存在该订单。';}}else{// 写个日志记录file_put_contents('wxpayerrorlog.txt',$post_data['return_code'].PHP_EOL, FILE_APPEND);echo '微信支付失败';}5.效果图:1.web开发端效果:2.移动端效果:

小程序支付 和 回调处理相关推荐

  1. 小程序支付微信回调地址问题

    1.小程序支付完成后,微信回调本地服务时,报错,信息如下: org.eclipse.jetty.http.HttpParser : bad HTTP parsed: 400 Illegal chara ...

  2. SpringBoot 搭建微信小程序支付(JSAPI) 纯后端

    一.支付流程 PS:做这个之前  ,先去下载官方的SDK吧  https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 1.首先要拿到 ...

  3. 微信小程序webview(H5页面)调用微信小程序支付

    1.业务描述:微信小程序商城入口进入的页面是商城H5页面,在H5页面进行微信支付如何实现: 2.微信小程序(webview访问H5页面)必须使用微信小程序支付: 如何实现以及实现方式以及支付后页面返回 ...

  4. 微信小程序支付最容易犯的坑notify_url(支付回调)

    最近做了微信小程序支付,支付成功之后发现notify_url回调地址竟然没有访问. 检查了无数次代码,下单结果里面的回调地址看了又看,都没有错啊. 把回调地址复制出来到浏览器上面,外网也是可以访问的啊 ...

  5. java微信小程序支付-回调(Jsapi-APIv3)

    一.接入前准备,按照这个文档准备 准备: 接入前准备-小程序支付 | 微信支付商户平台文档中心 准备好了就可以获得(第二点里需要的参数):         参数1 商户号 merchantId:xxx ...

  6. SpringBoot对接微信小程序支付功能开发(二,支付回调功能)

    接着上一篇: SpringBoot对接微信小程序支付功能开发(一,下单功能) 在上一篇下单功能中我们有传支付结果回调地址. 下面是回调接口实现 package com.office.miniapp.c ...

  7. 微信支付,JSAPI支付,APP支付,H5支付,Native支付,小程序支付功能详情以及回调处理

    一.支付相关文档地址 支付wiki:https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml 支付api: https://pay.weixin.qq. ...

  8. 微信小程序支付,查询和支付回调

    微信支付经常用到,做个详细的demo!!! 为了配置好更换,我一般都是把配置放在数据库. pom依赖 <!--微信支付--><dependency><groupId> ...

  9. 微信小程序支付后无法回调

    首先确定开发小程序支付要域名,要https请求,之后才能继续,也正是这两个前置要求引发了支付后无法回调的问题. 分享下排查思路 由于项目采用的是微服务,所以所有请求都要先经过网关,由网关做统一分发,此 ...

最新文章

  1. case when 效率高不高_南京薄蜂窝纸板效率高
  2. NET仿微信Oauth2.0
  3. C 语言编程 — 管道(Pipe)
  4. Java连MySQL性能调优(batch insert和连续left join筛选)
  5. Python内置函数查询表——总结篇
  6. C# 计算IP段之间的IP列表
  7. 电脑网络信号传输频率_高速数字电路设计中信号完整性
  8. 【深入理解JVM】ClassLoader类加载机制
  9. Tomcat(二):server.xml配置
  10. 全网首发:OPPO推送:服务器端的参考代码,JAVA版
  11. flightgear通过UDP协议输出飞行态势数据以及利用C++接收flightgear数据
  12. python人口普查数据数据分析_2010年第六次人口普查数据分析
  13. java web实训任务书,课程设计任务书模板-《JavaWeb程序设计》.doc
  14. 高通平台 LCD 的 LK部分代码解析
  15. linux非连续内存,linux高端内存管理之非连续内存区(分配和释放)
  16. 如何使用KALI攻击“恶意网站“实验
  17. c++ 统计指定字母开头单词的数量
  18. 百度SEO站群WeLive免费在线客服系统 v5
  19. edp和edt哪个好_香水edt和edp的区别
  20. 求助做过笔记本ec的大佬

热门文章

  1. D. AB-string(对立事件)
  2. 第16周实践——复数结构体
  3. 第16周实践——学生成绩处理
  4. OFDM中分析不同频偏(CFO)对通信链路的误码率影响仿真分析
  5. 台式计算机找不到蓝牙发射器,台式机没有蓝牙功能,怎么连接蓝牙设备呢?
  6. 惠普台式电脑引导不了系统_解决惠普电脑无法启动pe的方法
  7. dhm-echarts图表架构与说明书
  8. 【stm32】引脚高低电平、上拉输入与下拉输入
  9. Qt sqlite 使用备忘
  10. 后台开发,从基础到高级,有什么好的书籍推荐?