Maison développement back-end tutoriel php PHP implémente le paiement WeChat pour les paiements d'entreprise

PHP implémente le paiement WeChat pour les paiements d'entreprise

May 31, 2018 pm 04:19 PM
php Paiement 企业

Cet article présente principalement en détail la fonction de paiement d'entreprise du paiement WeChat en PHP. Il a une certaine valeur de référence. Les amis intéressés peuvent se référer à

Il existe de nombreux accès au paiement PHP WeChat sur Internet. assez compliqué et nécessite beaucoup de configuration et d'introduction de fichiers. Je les ai triés et fourni une version mono-fichier. J'espère que cela pourra apporter de l'aide et des références à ceux qui souhaitent accéder à WeChat Pay.

Exécutez ce fichier directement pour transférer de l'argent à l'utilisateur WeChat désigné.

Choses à noter :

1. Le paiement d'entreprise WeChat nécessite le transfert d'un certificat vers le changement. Vous devez vous rendre ici Centre de compte->Paramètres du compte-. >Sécurité API -> Téléchargez le certificat, puis modifiez le chemin du certificat dans le code
2. Le fichier doit être placé dans le répertoire d'autorisation de paiement, qui peut être défini dans la plateforme marchande de paiement WeChat-> Centre produit -> Configuration de développement.
3. Si une erreur de signature s'affiche, vous pouvez la vérifier via l'outil de vérification de la signature de paiement WeChat : outil de débogage de l'interface de paiement de la plateforme publique WeChat
Référence du code d'erreur : Adresse de référence

Le code. est le suivant :

<?php
/**
 * 关于微信企业付款的说明
 * 1.微信企业付款要求必传证书,需要到https://pay.weixin.qq.com 账户中心->账户设置->API安全->下载证书,证书路径在第207行和210行修改
 * 2.错误码参照 :https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2
 */
header(&#39;Content-type:text/html; Charset=utf-8&#39;);
$mchid = &#39;xxxxx&#39;;  //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送
$appid = &#39;xxxxx&#39;; //微信支付申请对应的公众号的APPID
$appKey = &#39;xxxxx&#39;; //微信支付申请对应的公众号的APP Key
$apiKey = &#39;xxxxx&#39;; //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥

//①、获取当前访问页面的用户openid(如果给指定用户转账,则直接填写指定用户的openid)
$wxPay = new WxpayService($mchid,$appid,$appKey,$apiKey);
$openId = $wxPay->GetOpenid(); //获取openid
if(!$openId) exit(&#39;获取openid失败&#39;);
//②、付款
$outTradeNo = uniqid(); //订单号
$payAmount = 1;  //转账金额,单位:元。转账最小金额为1元
$trueName = &#39;张三&#39;;  //收款人真实姓名
$result = $wxPay->createJsBizPackage($openId,$payAmount,$outTradeNo,$trueName);
echo &#39;success&#39;;
class WxpayService
{
 protected $mchid;
 protected $appid;
 protected $appKey;
 protected $apiKey;
 public $data = null;

 public function __construct($mchid, $appid, $appKey,$key)
 {
 $this->mchid = $mchid;
 $this->appid = $appid;
 $this->appKey = $appKey;
 $this->apiKey = $key;
 }

 /**
 * 通过跳转获取用户的openid,跳转流程如下:
 * 1、设置自己需要调回的url及其其他参数,跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize
 * 2、微信服务处理完成之后会跳转回用户redirect_uri地址,此时会带上一些参数,如:code
 * @return 用户的openid
 */
 public function GetOpenid()
 {
 //通过code获得openid
 if (!isset($_GET[&#39;code&#39;])){
  //触发微信返回code码
  $scheme = $_SERVER[&#39;HTTPS&#39;]==&#39;on&#39; ? &#39;https://&#39; : &#39;http://&#39;;
  $baseUrl = urlencode($scheme.$_SERVER[&#39;HTTP_HOST&#39;].$_SERVER[&#39;PHP_SELF&#39;].$_SERVER[&#39;QUERY_STRING&#39;]);
  $url = $this->__CreateOauthUrlForCode($baseUrl);
  Header("Location: $url");
  exit();
 } else {
  //获取code码,以获取openid
  $code = $_GET[&#39;code&#39;];
  $openid = $this->getOpenidFromMp($code);
  return $openid;
 }
 }

 /**
 * 通过code从工作平台获取openid机器access_token
 * @param string $code 微信跳转回来带上的code
 * @return openid
 */
 public function GetOpenidFromMp($code)
 {
 $url = $this->__CreateOauthUrlForOpenid($code);
 $res = self::curlGet($url);
 //取出openid
 $data = json_decode($res,true);
 $this->data = $data;
 $openid = $data[&#39;openid&#39;];
 return $openid;
 }

 /**
 * 构造获取open和access_toke的url地址
 * @param string $code,微信跳转带回的code
 * @return 请求的url
 */
 private function __CreateOauthUrlForOpenid($code)
 {
 $urlObj["appid"] = $this->appid;
 $urlObj["secret"] = $this->appKey;
 $urlObj["code"] = $code;
 $urlObj["grant_type"] = "authorization_code";
 $bizString = $this->ToUrlParams($urlObj);
 return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
 }

 /**
 * 构造获取code的url连接
 * @param string $redirectUrl 微信服务器回跳的url,需要url编码
 * @return 返回构造好的url
 */
 private function __CreateOauthUrlForCode($redirectUrl)
 {
 $urlObj["appid"] = $this->appid;
 $urlObj["redirect_uri"] = "$redirectUrl";
 $urlObj["response_type"] = "code";
 $urlObj["scope"] = "snsapi_base";
 $urlObj["state"] = "STATE"."#wechat_redirect";
 $bizString = $this->ToUrlParams($urlObj);
 return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
 }

 /**
 * 拼接签名字符串
 * @param array $urlObj
 * @return 返回已经拼接好的字符串
 */
 private function ToUrlParams($urlObj)
 {
 $buff = "";
 foreach ($urlObj as $k => $v)
 {
  if($k != "sign") $buff .= $k . "=" . $v . "&";
 }
 $buff = trim($buff, "&");
 return $buff;
 }

 /**
 * 企业付款
 * @param string $openid 调用【网页授权获取用户信息】接口获取到用户在该公众号下的Openid
 * @param float $totalFee 收款总费用 单位元
 * @param string $outTradeNo 唯一的订单号
 * @param string $orderName 订单名称
 * @param string $notifyUrl 支付结果通知url 不要有问号
 * @param string $timestamp 支付时间
 * @return string
 */
 public function createJsBizPackage($openid, $totalFee, $outTradeNo,$trueName)
 {
 $config = array(
  &#39;mch_id&#39; => $this->mchid,
  &#39;appid&#39; => $this->appid,
  &#39;key&#39; => $this->apiKey,
 );
 $unified = array(
  &#39;mch_appid&#39; => $config[&#39;appid&#39;],
  &#39;mchid&#39; => $config[&#39;mch_id&#39;],
  &#39;nonce_str&#39; => self::createNonceStr(),
  &#39;openid&#39; => $openid,
  &#39;check_name&#39;=>&#39;FORCE_CHECK&#39;, //校验用户姓名选项。NO_CHECK:不校验真实姓名,FORCE_CHECK:强校验真实姓名
  &#39;re_user_name&#39;=>$trueName,   //收款用户真实姓名(不支持给非实名用户打款)
  &#39;partner_trade_no&#39; => $outTradeNo,
  &#39;spbill_create_ip&#39; => &#39;127.0.0.1&#39;,
  &#39;amount&#39; => intval($totalFee * 100), //单位 转为分
  &#39;desc&#39;=>&#39;付款&#39;,  //企业付款操作说明信息
 );
 $unified[&#39;sign&#39;] = self::getSign($unified, $config[&#39;key&#39;]);
 $responseXml = $this->curlPost(&#39;https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers&#39;, self::arrayToXml($unified));
 $unifiedOrder = simplexml_load_string($responseXml, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA);
 if ($unifiedOrder === false) {
  die(&#39;parse xml error&#39;);
 }
 if ($unifiedOrder->return_code != &#39;SUCCESS&#39;) {
  die($unifiedOrder->return_msg);
 }
 if ($unifiedOrder->result_code != &#39;SUCCESS&#39;) {
  die($unifiedOrder->err_code);
 }
 return true;
 }

 public static function curlGet($url = &#39;&#39;, $options = array())
 {
 $ch = curl_init($url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_TIMEOUT, 30);
 if (!empty($options)) {
  curl_setopt_array($ch, $options);
 }
 //https请求 不验证证书和host
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
 $data = curl_exec($ch);
 curl_close($ch);
 return $data;
 }

 public function curlPost($url = &#39;&#39;, $postData = &#39;&#39;, $options = array())
 {
 if (is_array($postData)) {
  $postData = http_build_query($postData);
 }
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
 curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
 if (!empty($options)) {
  curl_setopt_array($ch, $options);
 }
 //https请求 不验证证书和host
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

 //第一种方法,cert 与 key 分别属于两个.pem文件
 //默认格式为PEM,可以注释
 curl_setopt($ch,CURLOPT_SSLCERTTYPE,&#39;PEM&#39;);
 curl_setopt($ch,CURLOPT_SSLCERT,getcwd().&#39;/cert/apiclient_cert.pem&#39;);
 //默认格式为PEM,可以注释
 curl_setopt($ch,CURLOPT_SSLKEYTYPE,&#39;PEM&#39;);
 curl_setopt($ch,CURLOPT_SSLKEY,getcwd().&#39;/cert/apiclient_key.pem&#39;);
 //第二种方式,两个文件合成一个.pem文件
// curl_setopt($ch,CURLOPT_SSLCERT,getcwd().&#39;/all.pem&#39;);
 $data = curl_exec($ch);
 curl_close($ch);
 return $data;
 }

 public static function createNonceStr($length = 16)
 {
 $chars = &#39;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&#39;;
 $str = &#39;&#39;;
 for ($i = 0; $i < $length; $i++) {
  $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
 }
 return $str;
 }
 public static function arrayToXml($arr)
 {
 $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 static function getSign($params, $key)
 {
 ksort($params, SORT_STRING);
 $unSignParaString = self::formatQueryParaMap($params, false);
 $signStr = strtoupper(md5($unSignParaString . "&key=" . $key));
 return $signStr;
 }
 protected static function formatQueryParaMap($paraMap, $urlEncode = false)
 {
 $buff = "";
 ksort($paraMap);
 foreach ($paraMap as $k => $v) {
  if (null != $v && "null" != $v) {
  if ($urlEncode) {
   $v = urlencode($v);
  }
  $buff .= $k . "=" . $v . "&";
  }
 }
 $reqPar = &#39;&#39;;
 if (strlen($buff) > 0) {
  $reqPar = substr($buff, 0, strlen($buff) - 1);
 }
 return $reqPar;
 }
}
?>
Copier après la connexion

C'est tout le contenu de cet article, merci d'avoir lu. Veuillez prêter attention au site Web PHP chinois pour plus d'informations !

Recommandations associées :

php implémente la fonction de remboursement du paiement WeChat

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Configuration du projet CakePHP Configuration du projet CakePHP Sep 10, 2024 pm 05:25 PM

Dans ce chapitre, nous comprendrons les variables d'environnement, la configuration générale, la configuration de la base de données et la configuration de la messagerie dans CakePHP.

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Date et heure de CakePHP Date et heure de CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler avec la date et l'heure dans cakephp4, nous allons utiliser la classe FrozenTime disponible.

CakePHP travaillant avec la base de données CakePHP travaillant avec la base de données Sep 10, 2024 pm 05:25 PM

Travailler avec la base de données dans CakePHP est très simple. Nous comprendrons les opérations CRUD (Créer, Lire, Mettre à jour, Supprimer) dans ce chapitre.

Téléchargement de fichiers CakePHP Téléchargement de fichiers CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

Routage CakePHP Routage CakePHP Sep 10, 2024 pm 05:25 PM

Dans ce chapitre, nous allons apprendre les sujets suivants liés au routage ?

Discuter de CakePHP Discuter de CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

CakePHP créant des validateurs CakePHP créant des validateurs Sep 10, 2024 pm 05:26 PM

Le validateur peut être créé en ajoutant les deux lignes suivantes dans le contrôleur.

See all articles