微信小程序支付功能 php后台对接完整代码分享

微信小程序支付,php后台对接完整代码,全是干货呀,拿过来可以直接使用。小程序在调起微信支付之前需要5个参数,这时候就需要携带code向后台请求,然后后台根据code获取openid 再进行服务器之间的。

一、准备工作

1、小程序注册,要以公司的以身份去注册一个小程序,才有微信支付权限;

2、绑定商户号。

3、在小程序填写合法域

 二、完成以上条件,你可以得到

     小程序appid 小程序秘钥    这两个用于获取用户openid;

商户号id ,商户号秘钥     支付接口必须的;

三、开始开发

前台代码

 /*
 调起微信支付
 @param 支付价格,不填写默认为1分钱
*/
function pay(total_fee) { 

 var total_fee = total_fee;
 wx.login({
 success: res => { 

 //code 用于获取openID的条件之一
 var code = res.code;
 wx.request({
 url: '后台地址/index.php',
 method: "POST",
 data: {
  total_fee:total_fee,
  code: code,
 },
 header: {
  'content-type': 'application/x-www-form-urlencoded' // 默认值
 },
 success: function (res) { //后端返回的数据
  var data = res.data;
  console.log(data);
  console.log(data["timeStamp"]);
  wx.requestPayment({
  timeStamp: data['timeStamp'],
  nonceStr: data['nonceStr'],
  package: data['package'],
  signType: data['signType'],
  paySign: data['paySign'],
  success: function (res) {
  wx.showModal({
  title: '支付成功',
  content: '',
  })
  },
  fail: function (res) {
  console.log(res);
  }
  })
 }
 }); 

 }
 }) 

} 

以下是PHP后台代码 ,这里用的是tp框架

<?php
namespace Home\Controller;
use Think\Controller;
class PayController extends Controller { 

 /**
 * [callback 微信支付回调处理]
 * @Author zhengmingzhou
 * @DateTime 2018-05-22
 * @return function [description]
 */
 public function callback(){
 vendor("Wechart.WxPay.Api");
 vendor("Wechart.NativePay");
 vendor("Wechart.WxPay.Data");
 vendor("Wechart.WxPay.Notify"); 

 //获取微信返回支付信息
 $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
 $WxPayData = new \WxPayDataBase();
 $result = $WxPayData->FromXml($xml);
 if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){
  //回调逻辑处理。。。 

  //返回给微信的参数
  $data['RETURN_CODE'] = 'SUCCESS';
  $data['RETURN_MSG'] = 'OK'; 

 }else{
  $data['RETURN_CODE'] = 'FAIL';
  $data['RETURN_MSG'] = 'NO';
 }
 //返回给微信
 $xml = self::arrtoxml($data);
 echo $xml;
 } 

 /**
 * [arrtoxml 格式化返回给微信的数据格式]
 * @Author zhengmingzhou
 * @DateTime 2018-05-22
 * @param [type] $arr [description]
 * @return [type]  [description]
 */
 private function arrtoxml( $arr ){
 if(!$arr){
  return '';
 }else{
  $xml = "<xml>";
  foreach ($arr as $key=>$val)
  {
  if (is_numeric($val)){
   $xml.="<".$key.">".$val."</".$key.">";
  }else{
   $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
  }
  }
  $xml.="</xml>";
  return $xml;
 }
 } 

//微信支付
public function pay(){
 //获取openid
 if(I("post.code"))
 { //用code获取openid
  $code=I("post.code");
  $WX_APPID = '';//appid
  $WX_SECRET = '';//AppSecret
  $url = "https://api.weixin.qq.com/sns/jscode2session?appid=" . $WX_APPID . "&secret=" . $WX_SECRET . "&js_code=" . $code . "&grant_type=authorization_code";
  $infos = json_decode(file_get_contents($url));
  $openid = $infos->openid;
 }
 if(I("post.total_fee"))
 {
  $total_fee=I("post.total_fee");
 }
 else
 {
  $total_fee=0.01;
 } 

 $fee = 0.01;//举例充值0.01
 $appid = '';//appid
 $body =  '标题';
 $mch_id = ''; //商户号
 $nonce_str = $this->nonce_str();//随机字符串
 $notify_url = ''; //回调的url【自己填写】
 $openid = $openid;
 $out_trade_no = $this->order_number();//商户订单号
 $spbill_create_ip = '';//服务器的ip【自己填写】;
 $total_fee = $fee*100;//这里需要*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;//终端的ip
 $post['total_fee'] = $total_fee;//总金额
 $post['trade_type'] = $trade_type;
 $sign = $this->sign($post);//签名
 $post_xml = '<xml>
  <appid>'.$appid.'</appid>
  <body>'.$body.'</body>
  <mch_id>'.$mch_id.'</mch_id>
  <nonce_str>'.$nonce_str.'</nonce_str>
  <notify_url>'.$notify_url.'</notify_url>
  <openid>'.$openid.'</openid>
  <out_trade_no>'.$out_trade_no.'</out_trade_no>
  <spbill_create_ip>'.$spbill_create_ip.'</spbill_create_ip>
  <total_fee>'.$total_fee.'</total_fee>
  <trade_type>'.$trade_type.'</trade_type>
  <sign>'.$sign.'</sign>
 </xml> '; 

 //print_r($post_xml);die;
 //统一接口prepay_id
 $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
 $xml = $this->http_request($url,$post_xml); 

 $array = $this->xml($xml);//全要大写 

 //print_r($array);
 if($array['RETURN_CODE'] == 'SUCCESS' && $array['RESULT_CODE'] == 'SUCCESS'){
 $time = time();
 $tmp='';//临时数组用于签名
 $tmp['appId'] = $appid;
 $tmp['nonceStr'] = $nonce_str;
 $tmp['package'] = 'prepay_id='.$array['PREPAY_ID'];
 $tmp['signType'] = 'MD5';
 $tmp['timeStamp'] = "$time"; 

 $data['state'] = 200;
 $data['timeStamp'] = "$time";//时间戳
 $data['nonceStr'] = $nonce_str;//随机字符串
 $data['signType'] = 'MD5';//签名算法,暂支持 MD5
 $data['package'] = 'prepay_id='.$array['PREPAY_ID'];//统一下单接口返回的 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'];
 } 

 echo json_encode($data);
} 

//随机32位字符串
private function nonce_str(){
 $result = '';
 $str = 'QWERTYUIOPASDFGHJKLZXVBNMqwertyuioplkjhgfdsamnbvcxz';
 for ($i=0;$i<32;$i++){
 $result .= $str[rand(0,48)];
 }
 return $result;
} 

//生成订单号
private function order_number($openid){
 //date('Ymd',time()).time().rand(10,99);//18位
 return md5($openid.time().rand(10,99));//32位
} 

//签名 $data要先排好顺序
private function sign($data){
 $stringA = '';
 foreach ($data as $key=>$value){
 if(!$value) continue;
 if($stringA) $stringA .= '&'.$key."=".$value;
 else $stringA = $key."=".$value;
 }
 $wx_key = '';//申请支付后有给予一个商户账号和密码,登陆后自己设置的key
 $stringSignTemp = $stringA.'&key='.$wx_key;
 return strtoupper(md5($stringSignTemp));
} 

//curl请求
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;
} 

//获取xml
private function xml($xml){
 $p = xml_parser_create();
 xml_parse_into_struct($p, $xml, $vals, $index);
 xml_parser_free($p);
 $data = "";
 foreach ($index as $key=>$value) {
 if($key == 'xml' || $key == 'XML') continue;
 $tag = $vals[$value[0]]['tag'];
 $value = $vals[$value[0]]['value'];
 $data[$tag] = $value;
 }
 return $data;
} 

} 

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

(0)

相关推荐

  • 微信小程序-详解微信登陆、微信支付、模板消息

    微信公众平台近日悄然开始内测微信小程序(微信公众号)功能,引来无数开发者和普通用户关注,微信支付的能力,是随着小程序的发布一并推出的,具有介绍如下: wx.login(OBJECT) 调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key).用户数据的加解密通讯需要依赖会话密钥完成. OBJECT参数说明: success返回参数说明: 示例代码: //app.js App({ onLaunch: functio

  • 微信小程序与php 实现微信支付的简单实例

    微信小程序与php 实现微信支付的简单实例 小程序访问地址: payfee.PHP: include 'WeixinPay.php'; $appid=''; $openid= $_GET['id']; $mch_id=''; $key=''; $out_trade_no = $mch_id. time(); $total_fee = $_GET['fee']; if(empty($total_fee)) //押金 { $body = "充值押金"; $total_fee = float

  • 微信小程序支付及退款流程详解

    首先说明一下,微信小程序支付的主要逻辑集中在后端,前端只需携带支付所需的数据请求后端接口然后根据返回结果做相应成功失败处理即可.我在后端使用的是php,当然在这篇博客里我不打算贴一堆代码来说明支付的具体实现,而主要会侧重于整个支付的流程和一些细节方面的东西.所以使用其他后端语言的朋友有需要也是可以看一下的.很多时候开发的需求和相应问题的解决真的要跳出语言语法层面,去从系统和流程的角度考虑.好的,也不说什么废话了.进入正题. 一. 支付 支付主要分为几个步骤: 前端携带支付需要的数据(商品id,购

  • 微信小程序支付PHP代码

    本文实例为大家分享了微信小程序支付PHP具体代码,供大家参考,具体内容如下 服务器端获取 openid Getopenid.php <?php header('Content-type: application/json; charset=UTF-8'); $APPID="";//填写小程序appid $SECRET="";//填写小程序secret $JSCODE=""; if(isset($_GET['js_code'])){ $JSC

  • 微信小程序 支付功能(前端)的实现

    微信小程序 支付功能(前端)的实现 只提供微信小程序端代码: var app = getApp(); Page({ data: {}, onLoad: function (options) { // 页面初始化 options为页面跳转所带来的参数 var that = this //登陆获取code wx.login({ success: function (res) { console.log(res.code) //获取openid that.getOpenId(res.code) } }

  • 微信小程序 支付功能开发错误总结

    微信小程序 支付功能开发错误总结 微信小程序支付终于踩完坑了,发现里面坑挺大的,现在发个贴,希望以后入坑的同学可以看一下 : https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4&index=2 业务流程在这里大家看文档的时候可以看到.第一个坑,获取用户的openid,参数一定要拼在url连接上,否则会报{"errcode":40013,"errmsg":"invali

  • 小程序微信退款功能实现方法详解【基于thinkPHP】

    本文实例讲述了小程序微信退款功能实现方法.分享给大家供大家参考,具体如下: ☹. 背景 微信开发中,既然涉及到了微信支付,对于合理的购物网站,必定会有用户退款请求 当然,一种方式是登录 微信商户平台,在 交易列表 中进行微信退款操作 但是,如果业务量庞大,作为友好交互,自然需要进行代码实现 微信退款 操作咯 稍作一提,这是针对 小程序退款申请 的方法指导(目测跟公众号退款没啥区别) 理论上,请对应参考文章:小程序微信支付 实例配置详解 编程语言:PHP 使用框架:ThinkPHP3.2.3 (我

  • 小程序微信支付功能配置方法示例详解【基于thinkPHP】

    本文实例讲述了小程序微信支付功能配置方法.分享给大家供大家参考,具体如下: ★ 背景 近期进行小程序的开发,毕竟是商城项目的开发,最后牵扯到的微信支付是必要的 个人开发过程中也是遇到各种问题,在此,我根据自己的实际操作,进行了代码的详细配置,以方便小程序新手的快速操作 -  使用语言:PHP             # PHP世界上最好的语言 HaHahahaaha -  使用框架:ThinkPHP 3.2    # 版本有点低而已,没啥大碍 -  测试工具:微信开发者工具    # 其实还挺好

  • 微信小程序微信支付接入开发实例详解

    本文主要讲述微信小程序接入微信支付开发过程中遇到的坑,分为两大块,小程序端和后台接口封装.本文主要内容如下: 一.后台接口封装: 二.小程序端整合: 三.总结 一.后台接口封装 本文介绍基于ThinkPHP5进行接口封装,具体步骤如下: 1.微信支付官方文档提供了PHP脚本微信支付的样例,下载下来: 2.样例已经封装好了每个类,我们只需要加上命名空间即可,在TP5的extend目录下新建一个目录wxpay,把样例中的类复制到该目录下,然后加上命名空间即可: 样例改造结果 其中最主要的一个类即Wx

  • 微信小程序 支付功能实现PHP实例详解

    微信小程序 支付功能实现PHP实例详解 前端代码: wx.request({ url: 'https://www.yourhost.com/weixin/WeiActivity/payJoinfee',//改成你自己的链接 header: { 'Content-Type': 'application/x-www-form-urlencoded' }, method:'POST', success: function(res) { console.log(res.data); console.lo

  • 微信小程序之支付后调用SDK的异步通知及验证处理订单方法

    小程序之后的异步验证和订单处理 <?php /** * Created by YuanPan. * User: YuanPan * Date: 2017/12/21 * Time: 15:15 */ namespace app\api\service; use app\api\model\Product; use app\lib\enum\OrderStatusEnum; use think\Db; use think\Exception; use think\Loader; use app\a

随机推荐