<?php
namespace app\parent\controller;

use think\Request;

class Wxpay
{
    function wechat(){ //微信配置信息和初始逻辑

$openid            =Request::instance()->param('openid');

$out_trade_no    =Request::instance()->param('out_trade_no');

$total_fee        =Request::instance()->param('total_fee');
        
        $appid            = "*******";

$body            = mb_convert_encoding("订单详情","utf-8","gbk"); //商品描述

$mch_id            = "*******"; //商户号

$nonce_str         = $this->getNonceStr();  //随机字符

$notify_url     = *******'; //回调地址

$openid         = $openid;/*"o-E0L0X-hr-kXdHVrLwjzxF--sE4";*/ //openid

$out_trade_no    = $out_trade_no; //商户订单编号

$ip             = request()->ip(); //ip

$total_fee        = $total_fee; //支付金额 分
    
        $key             = "*******";

$param             = $this->signature($appid,$body,$mch_id,$nonce_str,$notify_url,$openid,$out_trade_no,$ip,$total_fee,$key);

//发起请求
        $xml             = $this->post_curl("https://api.mch.weixin.qq.com/pay/unifiedorder",$param); //发起请求
        //数据结果解析
        $info             = json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),true);

$prepay_id        = $info['prepay_id'];
        
        $noncestr         = $info['nonce_str'];

$timestamp         = time();

$SignA = strtoupper(md5("appid=$appid&noncestr=$noncestr&package=Sign=WXPay&partnerid=$mch_id&prepayid=$prepay_id&timestamp=$timestamp&key=$key"));
        
        $info['sign']    = $SignA;
        
        $info['timestamp'] = $timestamp;

return json_decode($info);
    }

private function signature($appid,$body,$mch_id,$nonce_str,$notify_url,$openid,$out_trade_no,$ip,$total_fee,$key){ //清新支付请求数据组装
        $stringA = "appid=$appid&body=$body&mch_id=$mch_id&nonce_str=$nonce_str&notify_url=$notify_url&openid=$openid&out_trade_no=$out_trade_no&spbill_create_ip=$ip&total_fee=$total_fee&trade_type=JSAPI";
        $stringSignTemp = $stringA."&key=$key";
        $sign  = strtoupper(md5($stringSignTemp));
        $param = "<xml>\n";
        $param .= "<appid>{$appid}</appid>\n";
        $param .= "<body>{$body}</body>\n";      
        $param .= "<mch_id>{$mch_id}</mch_id>\n";
        $param .= "<nonce_str>{$nonce_str}</nonce_str>\n";
        $param .= "<notify_url>{$notify_url}</notify_url>\n";
        $param .= "<openid>{$openid}</openid>\n";
        $param .= "<out_trade_no>{$out_trade_no}</out_trade_no>\n";
        $param .= "<spbill_create_ip>{$ip}</spbill_create_ip>\n";
        $param .= "<total_fee>{$total_fee}</total_fee>\n";
        $param .= "<trade_type>JSAPI</trade_type>\n";
        $param .= "<sign>{$sign}</sign>\n";
        $param .= "</xml>";
        return $param;
    }

/**
    * 产生随机字符串,不长于32位
    * @param int $length
    * @return 产生的随机字符串
    */
    private function getNonceStr($length = 32)
    {
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";  
        $str ="";
        for ( $i = 0; $i < $length; $i++ )  {  
            $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);  
        }
        return $str;
    }

private function post_curl($url,$data,$agreement = 0){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        if($agreement == 0){//0 https   1   http
            unset($_REQUEST['agreement']);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        }
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
        curl_setopt($ch, CURLOPT_TIMEOUT, 15);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }
}

转载自:https://blog.csdn.net/qq_34629975/article/details/72420411

微信小程序支付 后台处理逻辑 (转)的更多相关文章

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

    微信小程序的支付和退款流程 近期在做微信小程序时,涉及到了小程序的支付和退款流程,所以也大概的将这方面的东西看了一个遍,就在这篇博客里总结一下. 首先说明一下,微信小程序支付的主要逻辑集中在后端,前端 ...

  2. 微信小程序支付接入注意点

    一.微信支付后台服务器部署 服务器采用ubuntu16.04 + php7.0 + apache2.0. 微信支付后台服务使用了curl 和 samplexml ,因此php.ini配置中必须开启这两 ...

  3. .Net后台实现微信小程序支付

    最近一直再研究微信支付和支付宝支付,官方支付文档中一直在讲与第三方支付打交道的原理,却没有介绍我们自己项目中的APP与后台该怎么交互(哈哈,人家也没必要介绍这一块).拜读了官方文档和前辈们的佳作,自己 ...

  4. 【原创】微信小程序支付java后台案例(公众号支付同适用)(签名错误问题)

    前言 1.微信小程序支付官方接口文档:[点击查看微信开放平台api开发文档]2.遇到的坑:预支付统一下单签名结果返回[签名错误]失败,建议用官方[签名验证工具]检查签名是否存在问题.3.遇到的坑:签名 ...

  5. 微信小程序支付源码,后台服务端代码

    作者:尹华南,来自原文地址 微信小程序支付绕坑指南 步骤 A:小程序向服务端发送商品详情.金额.openid B:服务端向微信统一下单 C:服务器收到返回信息二次签名发回给小程序 D:小程序发起支付 ...

  6. SpringBoot2.0微信小程序支付多次回调问题

    SpringBoot2.0微信小程序支付多次回调问题 WxJava - 微信开发 Java SDK(开发工具包); 支持包括微信支付.开放平台.公众号.企业微信/企业号.小程序等微信功能的后端开发. ...

  7. .NET Core 微信小程序支付——(统一下单)

    最近公司研发了几个电商小程序,还有一个核心的电商直播,只要是电商一般都会涉及到交易信息,离不开支付系统,这里我们统一实现小程序的支付流程(与服务号实现步骤一样). 目录1.开通小程序的支付能力2.商户 ...

  8. 微信小程序支付功能 C# .NET开发

    微信小程序支付功能的开发的时候坑比较多,不过对于钱的事谨慎也是好事.网上关于小程序支付的实例很多,但是大多多少有些问题,C#开发的更少.此篇文档的目的是讲开发过程中遇到的问题做一个备注,也方便其他开发 ...

  9. php对接微信小程序支付

    前言:这里我就假装你已经注册了微信小程序,并且基本的配置都已经好了.注: 个人注册小程序不支持微信支付,所以我还是假装你是企业或者个体工商户的微信小程序,其他的商户号注册,二者绑定,授权,支付开通,就 ...

随机推荐

  1. STM32 keil中编译遇到的问题

    发现 移植的SPI程序 说里面的 SPI_InitTypeDef 所有有关  SPI库函数的都找不到 这是因为 用的是  原子的程序   在 config函数中  把这个注释了

  2. untiy项目中使用MD5加密

    没有详细研究过暂时贴上代码以便以后研究: public static string MD5Encrypt(string strText) { MD5 md5 = MD5.Create(); byte[ ...

  3. java并发编程工具类JUC第三篇:DelayQueue延时队列

    DelayQueue 是BlockingQueue接口的实现类,它根据"延时时间"来确定队列内的元素的处理优先级(即根据队列元素的"延时时间"进行排序).另一层 ...

  4. nlp任务中的传统分词器和Bert系列伴生的新分词器tokenizers介绍

    layout: blog title: Bert系列伴生的新分词器 date: 2020-04-29 09:31:52 tags: 5 categories: nlp mathjax: true ty ...

  5. 记一次zabbix-server故障恢复导致的事故 zabbix-server.log -- One child process died

    前言 zabbix-server昨天出了个问题,不停的重启.昨天摆弄到晚上也不搞清楚原因,按照网上说的各种操作,各种CacheSize.TimeOut.StartPollers都改了,还有什么Incl ...

  6. CAS(Compare and Swap)无锁算法-学习笔记

    非阻塞同步算法与CAS(Compare and Swap)无锁算法 这篇问题对java的CAS讲的非常透彻! 锁的代价 1. 内核态的锁的时候需要操作系统进行一次上下文切换,加锁.释放锁会导致比较多的 ...

  7. 解决使用go get 下载模块下载超时的问题

    解决使用go get 下载模块下载超时的问题   解决使用go get 下载模块下载超时的问题 使用go env可以看到,默认的GOPROXY的值是https://proxy.golang.org, ...

  8. TensorFlow简单线性回归

    TensorFlow简单线性回归 将针对波士顿房价数据集的房间数量(RM)采用简单线性回归,目标是预测在最后一列(MEDV)给出的房价. 波士顿房价数据集可从http://lib.stat.cmu.e ...

  9. Redisson 分布式锁实现之前置篇 → Redis 的发布/订阅 与 Lua

    开心一刻 我找了个女朋友,挺丑的那一种,她也知道自己丑,平常都不好意思和我一块出门 昨晚,我带她逛超市,听到有两个人在我们背后小声嘀咕:"看咱前面,想不到这么丑都有人要." 女朋友 ...

  10. raft 图解 (秒懂)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...