Nous savons que la fonction de paiement d'entreprise pour changer de WeChat Pay est largement utilisée, comme les récompenses d'enveloppe rouge WeChat, le règlement commercial, etc. Effectuez des paiements à des particuliers par l'intermédiaire d'entreprises, et les fonds de paiement seront directement reversés au compte WeChat de l'utilisateur. Alors, comment implémenter cette fonctionnalité ?
1. Conditions d'activation
(Partage de tutoriel vidéo d'apprentissage gratuit : Tutoriel vidéo php)
Fonds de paiement
Le paiement d'entreprise pour modifier les fonds utilise le solde du compte marchand.
Selon le statut d'ouverture du compte marchand, le compte de retrait réel est différent :
◆ Par défaut, le solde du compte de base (ou compte solde) du compte marchand est utilisé lorsque l'entreprise paie la monnaie. Si le compte marchand a ouvert un compte d'exploitation, l'entreprise peut utiliser les fonds du compte d'exploitation pour payer la monnaie.
◆ La source de fonds pour le compte de base (ou d'autres comptes de retrait mentionnés ci-dessus) peut être des fonds de règlement des transactions (compte de base uniquement) ou des fonds pour recharger le compte. Lorsque le solde du compte de retrait est insuffisant, le paiement échouera en raison d'un solde insuffisant.
Règles de paiement
Méthode de paiement
◆ Prise en charge de l'interface API ou du fonctionnement de la page Web, paiement aux utilisateurs cibles.
Spécification de l'identité de l'utilisateur de paiement
◆ Spécifiez l'utilisateur de paiement via APPID+OPENID.
◆ L'APPID doit être l'APPID utilisé lors de la demande d'un compte marchand, ou être lié au compte marchand.
◆ Comment obtenir OPENID, veuillez vous référer à : https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId
Limite de paiement
◆ Le paiement à des utilisateurs dont le nom n'est pas réel n'est pas pris en charge
◆ Le paiement au même utilisateur de nom réel a une seule limite quotidienne de 2W/2W
◆ La limite totale de paiement pour un commerçant le même jour est de 1 million
Remarque : les limites de 20 000 et 1 million dans les règles ci-dessus ne sont pas complètement précis en raison de la relation entre les règles de calcul et les stratégies de contrôle des risques. Le montant est uniquement à titre de référence, veuillez ne pas vous fier à ce montant pour le traitement du système. Les résultats réels des retours et des requêtes de l'interface doivent prévaloir.
Vérification de l'identité de l'utilisateur de paiement
◆ Fournir une fonction pour vérifier le vrai nom de l'utilisateur cible pour le paiement
Interroger l'état du paiement
◆ Pour les enregistrements de paiement, les entreprises peuvent vérifier les données correspondantes via une requête de paiement d'entreprise ou interroger le flux de trésorerie du compte marchand.
Fréquence de paiement
◆ Par défaut, les paiements peuvent être effectués au même utilisateur jusqu'à 10 fois par jour, paramétrable dans la plateforme marchande - API sécurité
Autres notes
◆ Le montant du paiement doit être inférieur ou égal au solde disponible actuel du commerçant
2. Adresse de l'interface
Lien de l'interface : https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
Paramètres de la requête :
Pour plus de détails, veuillez vous référer à la description officielle du document de développement des paiements d'entreprise
1 Configuration de base
//公众账号appid $data["mch_appid"] = 'appid'; //商户号 $data["mchid"] = ''; //随机字符串 $data["nonce_str"] = 'suiji'.mt_rand(100,999); //商户订单号 $data["partner_trade_no"]=date('YmdHis').mt_rand(1000,9999); //金额 用户输入的提现金额需要乘以100 $data["amount"] = $money; //企业付款描述 $data["desc"] = '企业付款到个人零钱'; //用户openid $data["openid"] = $openid; //不检验用户姓名 $data["check_name"] = 'NO_CHECK'; //获取IP $data['spbill_create_ip']=$_SERVER['SERVER_ADDR']; //商户密钥 $data['key']=''; //商户证书 商户平台的API安全证书下载 $data['apiclient_cert.pem'] $data['apiclient_key.pem']
2.
/** **开始支付 / public function userpay(){ $money = ‘用户输入提现金额'; $info['money'] = ‘用户余额'; if ($this->openid && $money){ if ($money>$info['money'] ){ echo json_encode([ 'status' => 1, 'message' => '余额不足,不能提现!', 'code'=>'余额不足,不能提现!' ]); }elseif ($money<1){ echo json_encode([ 'status' => 2, 'message' => '提现金额不能小于1元', 'code'=>'提现金额太低' ]); }else{ $openid = $this->openid; $trade_no = date('YmdHis').mt_rand(1000,9999); $res = $this->pay($openid,$trade_no,$money*100,'微信提现'); //结果打印 if($res['result_code']=="SUCCESS"){ echo json_encode([ 'status' => 3, 'message' => '提现成功!', ]); }elseif ($res['err_code']=="SENDNUM_LIMIT"){ echo json_encode([ 'status' => 4, 'message' => '提现失败!', 'code'=>'每日仅能提现一次', ]); }else{ echo json_encode([ 'status' => 5, 'message' => '提现失败!', 'code'=>$res['err_code'], ]); } } }else{ echo json_encode([ 'status' => 5, 'message' => '未检测到您当前微信账号~', ]); } }
/** *支付方法 / public function pay($openid,$trade_no,$money,$desc){ $params["mch_appid"]=''; $params["mchid"] = ''; $params["nonce_str"]= 'suiji'.mt_rand(100,999); $params["partner_trade_no"] = $trade_no; $params["amount"]= $money; $params["desc"]= $desc; $params["openid"]= $openid; $params["check_name"]= 'NO_CHECK'; $params['spbill_create_ip'] = $_SERVER['SERVER_ADDR']; //生成签名 $str = 'amount='.$params["amount"].'&check_name='.$params["check_name"].'&desc='.$params["desc"].'&mch_appid='.$params["mch_appid"].'&mchid='.$params["mchid"].'&nonce_str='.$params["nonce_str"].'&openid='.$params["openid"].'&partner_trade_no='.$params["partner_trade_no"].'&spbill_create_ip='.$params['spbill_create_ip'].'&key=商户密钥'; //md5加密 转换成大写 $sign = strtoupper(md5($str)); //生成签名 $params['sign'] = $sign; //构造XML数据 $xmldata = $this->array_to_xml($params); //数组转XML $url='https://api.mch.weixin.qq.com/mmpaymkttransfers/prom otion/transfers'; //发送post请求 $res = $this->curl_post_ssl($url, $xmldata); //curl请求 if(!$res){ return array('status'=>1, 'msg'=>"服务器连接失败" ); } //付款结果分析 $content = $this->xml_to_array($res); //xml转数组 return $content; }
/** * curl请求 / public function curl_post_ssl($url, $xmldata, $second=30,$aHeader=array()){ $ch = curl_init(); //超时时间 curl_setopt($ch,CURLOPT_TIMEOUT,$second); curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); //这里设置代理,如果有的话 //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98'); //curl_setopt($ch,CURLOPT_PROXYPORT, 8080); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); //默认格式为PEM,可以注释 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); //绝对地址可使用 dirname(__DIR__)打印,如果不是绝对地址会报 58 错误 curl_setopt($ch,CURLOPT_SSLCERT,' 绝对地址/apiclient_cert.pem'); curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLKEY,'绝对地址/apiclient_key.pem'); if( count($aHeader) >= 1 ){ curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader); } curl_setopt($ch,CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_POSTFIELDS,$xmldata); $data = curl_exec($ch); if($data){ curl_close($ch); return $data; } else { $error = curl_errno($ch); echo "call faild, errorCode:$error\n"; die(); curl_close($ch); return false; } }
/** * array 转 xml * 用于生成签名 */ public function array_to_xml($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; } /** * xml 转化为array */ public function xml_to_array($xml){ //禁止引用外部xml实体 libxml_disable_entity_loader(true); $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $values; }
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!