Home  >  Article  >  Backend Development  >  PHP realizes WeChat enterprise payment to change

PHP realizes WeChat enterprise payment to change

王林
王林forward
2020-01-29 20:29:303852browse

PHP realizes WeChat enterprise payment to change

We know that WeChat Pay’s enterprise payment to change function is widely used, such as WeChat red envelope rewards, business settlement, etc. Make payments to individuals through businesses, and the payment funds will go directly into the user's WeChat change. So how do we implement this feature?

1. Activation conditions

PHP realizes WeChat enterprise payment to change

(Free learning video tutorial sharing: php video tutorial)

Payment funds

Enterprises pay to change funds using the balance of the merchant number.

According to the account opening status of the merchant number, the actual withdrawal account is different:

◆ By default, the enterprise uses the balance of the basic account (or balance account) of the merchant number to pay in change. If the merchant account has opened an operating account, the enterprise can use the funds in the operating account to pay the change.

◆ The source of funds for the basic account (or other withdrawal accounts mentioned above) may be transaction settlement funds (basic account only), or funds to recharge the account. When the balance of the withdrawal account is insufficient, the payment will fail due to insufficient balance.

Payment Rules

Payment Method

◆ Support API interface or web page operation, payment to target users.

Specification of payment user identity

◆Specify the payment user through APPID OPENID.

◆ The APPID needs to be the APPID used when applying for a merchant account, or be bound to the merchant account.

◆ How to obtain OPENID, please refer to: https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId

Payment limit

◆ Payment to non-real-name users is not supported

◆ Payment to the same real-name user has a single daily limit of 2W/2W

◆ The total payment limit for a merchant on the same day is 100W

Note: The limits of 20,000 and 1,000,000 in the above rules are not completely accurate due to the relationship between calculation rules and risk control strategies. The amount is only For reference, please do not rely on this amount for system processing. The actual return and query results of the interface should prevail. Please know.

Payment User Identity Verification

◆ Provide the function of verifying the real name of the target user for payment

Query payment status

◆ For paid records, enterprises can check the corresponding data through enterprise payment query, or query the merchant account's capital flow.

Payment frequency

◆ By default, payments can be made to the same user up to 10 times a day, which can be set in the merchant platform--API security

Other notes

◆The payment amount must be less than or equal to the merchant’s current available balance;

2. Interface address

Interface link: https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers

Request parameters:

For details, please refer to the official enterprise payment Development document description

PHP realizes WeChat enterprise payment to change

1. Basic configuration

//公众账号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. PHP code

/**
**开始支付
/
 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([
   &#39;status&#39; => 2,
   &#39;message&#39; => &#39;提现金额不能小于1元&#39;,
   &#39;code&#39;=>&#39;提现金额太低&#39;
  ]);
  }else{
 $openid = $this->openid;
 $trade_no = date(&#39;YmdHis&#39;).mt_rand(1000,9999);
 $res = $this->pay($openid,$trade_no,$money*100,&#39;微信提现&#39;);

 //结果打印
 if($res[&#39;result_code&#39;]=="SUCCESS"){

   echo json_encode([
   &#39;status&#39; => 3,
   &#39;message&#39; => &#39;提现成功!&#39;,
   ]);
  }elseif ($res[&#39;err_code&#39;]=="SENDNUM_LIMIT"){
   echo json_encode([
   &#39;status&#39; => 4,
   &#39;message&#39; => &#39;提现失败!&#39;,
   &#39;code&#39;=>&#39;每日仅能提现一次&#39;,
   ]);
  }else{
   echo json_encode([
   &#39;status&#39; => 5,
   &#39;message&#39; => &#39;提现失败!&#39;,
   &#39;code&#39;=>$res[&#39;err_code&#39;],
   ]);
  }
  }
 }else{
  echo json_encode([
  &#39;status&#39; => 5,
  &#39;message&#39; => &#39;未检测到您当前微信账号~&#39;,

  ]);
 }
 }

Payment method:

/**
*支付方法
/
public function pay($openid,$trade_no,$money,$desc){
 $params["mch_appid"]=&#39;&#39;; 
 $params["mchid"] = &#39;&#39;; 
 $params["nonce_str"]= &#39;suiji&#39;.mt_rand(100,999); 
 $params["partner_trade_no"] = $trade_no;  
 $params["amount"]= $money;  
 $params["desc"]= $desc;  
 $params["openid"]= $openid;  
 $params["check_name"]= &#39;NO_CHECK&#39;; 
 $params[&#39;spbill_create_ip&#39;] = $_SERVER[&#39;SERVER_ADDR&#39;]; 

 //生成签名
 $str = &#39;amount=&#39;.$params["amount"].&#39;&check_name=&#39;.$params["check_name"].&#39;&desc=&#39;.$params["desc"].&#39;&mch_appid=&#39;.$params["mch_appid"].&#39;&mchid=&#39;.$params["mchid"].&#39;&nonce_str=&#39;.$params["nonce_str"].&#39;&openid=&#39;.$params["openid"].&#39;&partner_trade_no=&#39;.$params["partner_trade_no"].&#39;&spbill_create_ip=&#39;.$params[&#39;spbill_create_ip&#39;].&#39;&key=商户密钥&#39;;

 //md5加密 转换成大写
 $sign = strtoupper(md5($str));
 //生成签名
 $params[&#39;sign&#39;] = $sign;

 //构造XML数据
 $xmldata = $this->array_to_xml($params); //数组转XML
 $url=&#39;https://api.mch.weixin.qq.com/mmpaymkttransfers/prom otion/transfers&#39;;

 //发送post请求
 $res = $this->curl_post_ssl($url, $xmldata); //curl请求 
 if(!$res){
 return array(&#39;status&#39;=>1, 
   &#39;msg&#39;=>"服务器连接失败" );
 }

 //付款结果分析
 $content = $this->xml_to_array($res); //xml转数组
 return $content;
 }

curl request

/**
* 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, &#39;10.206.30.98&#39;);
 //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,&#39;PEM&#39;);
//绝对地址可使用 dirname(__DIR__)打印,如果不是绝对地址会报 58 错误
 curl_setopt($ch,CURLOPT_SSLCERT,&#39; 绝对地址/apiclient_cert.pem&#39;);
 curl_setopt($ch,CURLOPT_SSLKEYTYPE,&#39;PEM&#39;);
 curl_setopt($ch,CURLOPT_SSLKEY,&#39;绝对地址/apiclient_key.pem&#39;);
 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;
 }
 }

Generate signature

/**
 * 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, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA)), true);
 return $values;
 }

The result is as shown in the figure:

PHP realizes WeChat enterprise payment to change

Related Recommended article tutorials: php tutorial

The above is the detailed content of PHP realizes WeChat enterprise payment to change. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:cnblogs.com. If there is any infringement, please contact admin@php.cn delete