php 微信转账,php实现微信公众号企业转账功能

企业付款提供由商户直接付钱至用户微信零钱的能力,支持平台操作及接口调用两种方式,资金到账速度快,使用及查询方便。主要用来解决合理的商户对用户付款需求,比如:保险理赔、彩票兑换等等。

特点发起方式灵活,可通过页面或接口发起

微信消息触达,用户及时获知入账详情

支持实名校验,判断收款人真实身份

通过openid即可实现付款,无需用户敏感隐私信息

到账速度快,在发起后,用户可在几分钟内收到付款

企业转账需要到微信商户平台=》产品中心=》企业付款到零钱,开启此功能

下面是程序截图:

第一步:设置配置参数$url="https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";$pars = array();$pars["mch_appid"] =$this->module["config"]["appid"];$pars["mchid"]=$this->module["config"]["mchid"];$pars["nonce_str"] =random(32);$pars["partner_trade_no"] =time().random(3,1);$pars["openid"] =$openid;$pars["check_name"] ="NO_CHECK" ;//$pars["re_user_name"] ="" ;$monet_finall = $price * 100;$pars["amount"] =$monet_finall; //这里是折算成1%的所以要*100$pars["desc"] ="您已成功提现 ".$price." 现金";$pars["spbill_create_ip"] =$this->module["config"]["ip"];ksort($pars, SORT_STRING);$string1 = "";foreach ($pars as $k => $v) { $string1 .= "{$k}={$v}&";}$string1 .= "key=".$this->module["config"]["password"];$pars["sign"] = strtoupper(md5($string1));$xml = array2xml($pars);$extras = array();$extras["CURLOPT_CAINFO"] = ATTACHMENT_ROOT . "/withdraw/cert/rootca.pem." . $_W["uniacid"];$extras["CURLOPT_SSLCERT"] = ATTACHMENT_ROOT . "/withdraw/cert/apiclient_cert.pem." . $_W["uniacid"];$extras["CURLOPT_SSLKEY"] = ATTACHMENT_ROOT . "/withdraw/cert/apiclient_key.pem." . $_W["uniacid"];$procResult = null;

第二步:CURL请求微信服务器load()->func("communication");$resp = ihttp_request($url, $xml, $extras);

其中ihttp_request函数内容是:function ihttp_request($url, $post = "", $extra = array(), $timeout = 60) { $urlset = parse_url($url); if (empty($urlset["path"])) { $urlset["path"] = "/"; } if (!empty($urlset["query"])) { $urlset["query"] = "?{$urlset["query"]}"; } if (empty($urlset["port"])) { } if (strexists($url, "https://") && !extension_loaded("openssl")) { if (!extension_loaded("openssl")) { message("请开启您PHP环境的openssl"); } } if (function_exists("curl_init") && function_exists("curl_exec")) { $ch = curl_init(); if (!empty($extra["ip"])) { $extra["Host"] = $urlset["host"]; $urlset["host"] = $extra["ip"]; unset($extra["ip"]); } curl_setopt($ch, CURLOPT_URL, $urlset["scheme"] . "://" . $urlset["host"] . ($urlset["port"] == "80" || empty($urlset["port"]) ? "" : ":" . $urlset["port"]) . $urlset["path"] . $urlset["query"]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_HEADER, 1); @curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); if ($post) { if (is_array($post)) { $filepost = false; foreach ($post as $name => &$value) { if (version_compare(phpversion(), "5.6") >= 0 && substr($value, 0, 1) == "@") { $value = new CURLFile(ltrim($value, "@")); } if ((is_string($value) && substr($value, 0, 1) == "@") || (class_exists("CURLFile") && $value instanceof CURLFile)) { $filepost = true; } } if (!$filepost) { $post = http_build_query($post); } } curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); } if (!empty($GLOBALS["_W"]["config"]["setting"]["proxy"])) { $urls = parse_url($GLOBALS["_W"]["config"]["setting"]["proxy"]["host"]); if (!empty($urls["host"])) { curl_setopt($ch, CURLOPT_PROXY, "{$urls["host"]}:{$urls["port"]}"); $proxytype = "CURLPROXY_" . strtoupper($urls["scheme"]); if (!empty($urls["scheme"]) && defined($proxytype)) { curl_setopt($ch, CURLOPT_PROXYTYPE, constant($proxytype)); } else { curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); } if (!empty($GLOBALS["_W"]["config"]["setting"]["proxy"]["auth"])) { curl_setopt($ch, CURLOPT_PROXYUSERPWD, $GLOBALS["_W"]["config"]["setting"]["proxy"]["auth"]); } } } curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSLVERSION, 1); if (defined("CURL_SSLVERSION_TLSv1")) { curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); } curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1"); if (!empty($extra) && is_array($extra)) { $headers = array(); foreach ($extra as $opt => $value) { if (strexists($opt, "CURLOPT_")) { curl_setopt($ch, constant($opt), $value); } elseif (is_numeric($opt)) { curl_setopt($ch, $opt, $value); } else { $headers[] = "{$opt}: {$value}"; } } if (!empty($headers)) { curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } } $data = curl_exec($ch); $status = curl_getinfo($ch); $errno = curl_errno($ch); $error = curl_error($ch); curl_close($ch); if ($errno || empty($data)) { return error(1, $error); } else { return ihttp_response_parse($data); } } $method = empty($post) ? "GET" : "POST"; $fdata = "{$method} {$urlset["path"]}{$urlset["query"]} HTTP/1.1"; $fdata .= "Host: {$urlset["host"]}"; if (function_exists("gzdecode")) { $fdata .= "Accept-Encoding: gzip, deflate"; } $fdata .= "Connection: close"; if (!empty($extra) && is_array($extra)) { foreach ($extra as $opt => $value) { if (!strexists($opt, "CURLOPT_")) { $fdata .= "{$opt}: {$value}"; } } } $body = ""; if ($post) { if (is_array($post)) { $body = http_build_query($post); } else { $body = urlencode($post); } $fdata .= "Content-Length: " . strlen($body) . "{$body}"; } else { $fdata .= ""; } if ($urlset["scheme"] == "https") { $fp = fsockopen("ssl://" . $urlset["host"], $urlset["port"], $errno, $error); } else { $fp = fsockopen($urlset["host"], $urlset["port"], $errno, $error); } stream_set_blocking($fp, true); stream_set_timeout($fp, $timeout); if (!$fp) { return error(1, $error); } else { fwrite($fp, $fdata); $content = ""; while (!feof($fp)) $content .= fgets($fp, 512); fclose($fp); return ihttp_response_parse($content, true); }}

第三步:解析分析微信服务器返回值并返回。if (is_error($resp)) { $procResult = $resp;} else { $arr=json_decode(json_encode((array) simplexml_load_string($resp["content"])), true); $xml = "<?xml version="1.0" encoding="utf-8"?>" . $resp["content"]; $dom = new DOMDocument(); if ($dom->loadXML($xml)) { $xpath = new DOMXPath($dom); $code = $xpath->evaluate("string(//xml/return_code)"); $ret = $xpath->evaluate("string(//xml/result_code)"); if (strtolower($code) == "success" && strtolower($ret) == "success") { $procResult = array("errno"=>0,"error"=>"success");; } else { $error = $xpath->evaluate("string(//xml/err_code_des)"); $procResult = array("errno"=>-2,"error"=>$error); } } else { $procResult = array("errno"=>-1,"error"=>"未知错误"); }}return $procResult;

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java之HashMap.values()转List时的错误和正确操作

因为项目中需要获取到Map的值的集合&#xff0c;所以调用了HashMap.values()方法转成List&#xff0c;当时是使用了以下代码。&#xff08;逻辑上这样想应该没问题&#xff0c;但生活总是会是不是给你一点小“”惊喜“”&#xff09; List<AreaItemOpt> areaItemOpts (…

php检测表大小,查询mysql数据库、表的大小

一、关于mysql表数据大小mysql存储数据文件一般使用表空间存储 &#xff1b;当mysql使用innodb存储引擎的时候&#xff0c;mysql使用表存储数据分为共享表空间和独享表空间两种方式 。共享表空间&#xff1a;Innodb的所有数据保存在一个单独的表空间里面&#xff0c;而这个表空…

Java利用stream(流)对map中的values进行过滤、排序操作

前言 对于Java8中的stream(流)这种优雅、方便、快捷、高效的操作已经是信手沾来了吧&#xff0c;但是却仅限List、Set。难道我Map不要面子得嘛&#xff1f;在工作中需要对从List转Map的数据进行操作&#xff0c;因此便有这随笔。 新建一个User类&#xff0c;注意下面使用lombok…

cls certificate.php,php加密解密处理类

PHP加密解密也是常有的事&#xff0c;发现discuz论坛里的PHP加密解密处理类代码&#xff0c;感觉挺不错&#xff0c;在用的时候&#xff0c;要参考Discuz论坛的passport相关函数&#xff0c;后面我会附上使用方法。php加密解密处理类<?php /* 文件名称&#xff1a;cls.sys_…

【redis】java操作redis时,StringRedisTemplate的expire()方法的作用,什么时候使用

java操作redis时&#xff0c;StringRedisTemplate的expire()方法的作用&#xff0c;什么时候使用 //重新设置过期时间为30分钟&#xff0c;刷新时间 redisTemplate.expire(MsOpenApiRedisUtil.SESSION_KEY_IN_LOGIN_NAMEloginName,30,TimeUnit.MINUTES); redisTemplate.expire…

springboot使用redis(StringRedisTemplate的常用方法)

1. 先了解RedisTemplate和StringRedisTemplate之间的关系&#xff1a; RedisTemplate是Spring对于Redis的封装&#xff0c;而StringRedisTemplate继承RedisTemplate。两者的数据是不共通的&#xff1b;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据&…

html提交表单给php邮件发送,在HTML表单中通过PHP自动发送电子邮件

我最终解决了我的问题吧一个细节。我的HTML帖子回答:Navn: Kontakt e-post: Kontakt telefon: Fest:LokalfestHjemmefestKommune: Deltagere: Rydding: Vasking: Dorvakt: Noe annet?: 我的PHP帖子回答:if(isset($_POST[mailform]))$email $_POST[Epost] ;$name $_POST[Navn…

Arrays.asList()和Collections.singletonList()比较

Collections.singletonList(something)是不可变的&#xff0c; 对Collections.singletonList(something)返回的列表所做的任何更改将导致UnsupportedOperationException。 Arrays.asList(something)允许Arrays.asList(something) 更改 。 此外&#xff0c;由Collections.sin…

php 邮件类库,[3.3]-扩展类库:基于PHPMailer的邮件发送 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...

3.3.1 扩展类库&#xff1a;基于PHPMailer的邮件发送此扩展可用于发送邮件。3.3.2 安装和配置从 PhalApi-Library 扩展库中下载获取 PHPMailer 包&#xff0c;如使用&#xff1a;$ git clone https://git.oschina.net/dogstar/PhalApi-Library.git然后把 PHPMailer 目录复制到 …

spring boot报FileSizeLimitExceededException异常的解决方法

开发spring boot程序时&#xff0c;遇到了如下错误&#xff1a; The field file exceeds its maximum permitted size of 1048576 bytes. 原因&#xff1a; Spring Boot工程嵌入的tomcat限制了请求的文件大小&#xff0c;官方文档中这样描述&#xff1a; Spring Boot embraces…

js表单提交 php,JavaScript提交表单的几种方法

在我们工作中我们会经常使用到form表单&#xff0c;相信大家再熟悉不过了&#xff0c;那么提交表单有很多种方法&#xff0c;JavaScript提交表单的方法又是如何呢&#xff0c;今天就带大家介绍下JavaScript提交表单的几种方法&#xff01;第一种方式&#xff1a;表单提交&#…

前后端分离中的权限管理思路

在传统的前后端不分的开发中&#xff0c;权限管理主要通过过滤器或者拦截器来进行&#xff08;权限管理框架本身也是通过过滤器来实现功能&#xff09;&#xff0c;如果用户不具备某一个角色或者某一个权限&#xff0c;则无法访问某一个页面。 但是在前后端分离中&#xff0c;…

陈顺志 php,芦芽山之情

芦芽山之情循着潺潺的水声&#xff0c;穿过颗颗红桦树&#xff0c;踩着红色的木板桥&#xff0c;听着山谷中传来的一声声清脆的鸟鸣&#xff0c;闻着扑鼻的在空气中酝酿着的雨露的清新&#xff0c;我们向芦芽山上走去。青山 白雾我们仿佛踏入了梦境的天地&#xff0c;山在雾中…

前、后端分离权限控制设计与实现

简述 近几年随着react、angular、vue等前端框架兴起&#xff0c;前后端分离的架构迅速流行。但同时权限控制也带来了问题。 网上很多前、后端分离权限仅仅都仅仅在描述前端权限控制、且是较简单、固定的角色场景&#xff0c;满足不了我们用户、角色都是动态的场景。且仅仅前端…

风云php,t.php · 风云酷小子/js - Gitee.com

$ch curl_init();curl_setopt($ch, CURLOPT_URL, "http://zx.rcpx.cc/els/html/courseStudyItem/courseStudyItem.updateTimestepByUserTimmer.do");curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// post数据curl_setopt($ch,…

前后端分离必备的接口规范,十分接地气

1. 前言 随着互联网的高速发展&#xff0c;前端页面的展示、交互体验越来越灵活、炫丽&#xff0c;响应体验也要求越来越高&#xff0c;后端服务的高并发、高可用、高性能、高扩展等特性的要求也愈加苛刻&#xff0c;从而导致前后端研发各自专注于自己擅长的领域深耕细作。 然…

ubuntu php设置,关于ubuntu php环境设置详解-PHP问题

ubuntu php设置办法&#xff1a;起首更新源列表&#xff1b;而后关上“终端窗口”&#xff0c;输出饬令“sudo apt-get install php5”来装置php&#xff1b;接着装置设置装备摆设好apache环境&#xff0c;并装置php5-gd模块&#xff1b;最初创立“info.php”文件便可。Ubuntu …

springboot前后端分离后权限原理浅谈

1. 需求描述 最近在梳理springboot前后端分离后的权限管理问题。前段时间&#xff0c;已经把shiro的实现和spring security 的实现进行了初步的了解。如果深入细节&#xff0c;一个篇幅怕是不够。本文仅对权限管理的一些通用原理进行探讨。 2. 权限分类 在前后端分离之后&am…

js异步请求php数据,原生JS发送异步数据请求实例详解

这篇文章主要为大家详细介绍了原生JS发送异步数据请求的相关资料&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下在做项目的时候&#xff0c;有时候需要用到异步数据请求&#xff0c;但是如果这个时候没有框架的依赖&#xff0c;就需要用到原生JS进行…

MyBatis-Plus——增删查改

开发环境 IDEA JDK&#xff1a;1.8 Spring Boot:2.6.2 Maven:3.3.9 MySQL:8.0.23 数据库准备 CREATE DATABASE mybatis_plus_db;DROP TABLE IF EXISTS person; CREATE TABLE person(id BIGINT(20) NOT NULL COMMENT 主键ID, name VARCHAR(30) NULL DEFAULT NULL COMMENT 姓…