本文实例讲述了php实现微信企业号支付个人的方法。分享给大家供大家参考,具体如下:
导语:分销商,微商提现怎么提?
直接用微信支付。
实现如下:
微信支付配置
1
2
3
4
5
6
7
8
9
|
/*微信支付*/ 'PAY_WEIXIN' => array ( 'appid' => 'XXXX' , 'appsecret' => 'XXXXXXX' , 'mchid' => '1283301801' , //商户号 'key' => 'zhudianbaodiandodozhudianbao0527' , //商户支付秘钥 'apiclient_cert' => 'Conf/cert/apiclient_cert.pem' , //商户证书apiclient_cert.pem 'apiclient_key' => 'Conf/cert/apiclient_key.pem' , //商户证书apiclient_key.pem ) |
arrayToXml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/** * array转xml */ 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 ; } |
使用证书,以post方式提交xml到对应的接口url
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
/** * 作用:使用证书,以post方式提交xml到对应的接口url */ function postXmlSSLCurl( $xml , $url , $second , $cert , $key ) { $ch = curl_init(); //超时时间 curl_setopt( $ch ,CURLOPT_TIMEOUT, $second ? $second : $this ->timeout); //这里设置代理,如果有的话 //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8'); //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); //设置header curl_setopt( $ch ,CURLOPT_HEADER,FALSE); //要求结果为字符串且输出到屏幕上 curl_setopt( $ch ,CURLOPT_RETURNTRANSFER,TRUE); //设置证书 //使用证书:cert 与 key 分别属于两个.pem文件 //默认格式为PEM,可以注释 curl_setopt( $ch ,CURLOPT_SSLCERTTYPE, 'PEM' ); curl_setopt( $ch ,CURLOPT_SSLCERT, $cert ); //默认格式为PEM,可以注释 curl_setopt( $ch ,CURLOPT_SSLKEYTYPE, 'PEM' ); curl_setopt( $ch ,CURLOPT_SSLKEY, $key ); //post提交方式 curl_setopt( $ch ,CURLOPT_POST, true); curl_setopt( $ch ,CURLOPT_POSTFIELDS, $xml ); $data = curl_exec( $ch ); //返回结果 if ( $data ){ curl_close( $ch ); return $this ->xmlToArray( $data ); } else { $error = curl_errno( $ch ); echo "curl出错,错误码:$error" . "<br>" ; curl_close( $ch ); return false; } } |
企业向个人付款
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
//企业向个人付款 public function payToUser( $params , $key , $apicent_cert , $apiclient_key ) { $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers' ; //检测必填参数 if ( $params [ "partner_trade_no" ] == null) { // exit ( "退款申请接口中,缺少必填参数partner_trade_no!" . "<br>" ); } elseif ( $params [ "openid" ] == null){ exit ( "退款申请接口中,缺少必填参数openid!" . "<br>" ); } elseif ( $params [ "check_name" ] == null){ //NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功) exit ( "退款申请接口中,缺少必填参数check_name!" . "<br>" ); } elseif (( $params [ "check_name" ] == 'FORCE_CHECK' or $params [ "check_name" ] == 'OPTION_CHECK' ) && ( $params [ "re_user_name" ] == null)){ //收款用户真实姓名。 exit ( "退款申请接口中,缺少必填参数re_user_name!" . "<br>" ); } elseif ( $params [ "amount" ] == null){ exit ( "退款申请接口中,缺少必填参数amount!" . "<br>" ); } elseif ( $params [ "desc" ] == null){ exit ( "退款申请接口中,缺少必填参数desc!" . "<br>" ); } $params [ "mch_appid" ] = $this ->appid; //公众账号ID $params [ "mchid" ] = $this ->mchid; //商户号 $params [ "nonce_str" ] = $this ->createNoncestr(); //随机字符串 $params [ 'spbill_create_ip' ] = $_SERVER [ 'REMOTE_ADDR' ] == '::1' ? '192.127.1.1' : $_SERVER [ 'REMOTE_ADDR' ]; //获取IP $params [ "sign" ] = $this ->getSign( $params , $key ); //签名 $xml = $this ->arrayToXml( $params ); return $this ->postXmlSSLCurl( $xml , $url , false, $apicent_cert , $apiclient_key ); } |
企业付款
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
private function _enterprisePay( $number , $member_id , $amount , $desc ) { // 获取openid $wxuser_id = M( 'Member' )->where( array ( 'id' => $member_id ))->getField( 'wxuser_id' ); $openid = M( 'Wxuser' )->where( array ( 'id' => $wxuser_id ))->getField( 'openid' ); $pay = C( 'PAY_WEIXIN' ); import( '@.Action.WxDevelop' ); $enterprise = new WxEnterprise( $pay [ 'appid' ], $pay [ 'appsecret' ], $pay [ 'mchid' ]); $params = array ( 'partner_trade_no' => $number , 'openid' => $openid , 'check_name' => 'NO_CHECK' , 'amount' => $amount , // 总计 'desc' => $desc , ); $result = $enterprise ->payToUser( $params , $pay [ 'key' ], $pay [ 'apiclient_cert' ], $pay [ 'apiclient_key' ]); return $result ; } |
处理分销商提现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
private function _handle( $truename , $price ) { // 处理分销商提现 $withdrawid = date ( "ymdHis" ) . strval (rand(1000, 9999)); $data = array ( 'withdrawid' => $withdrawid , 'store_id' => $this ->store_id, 'member_id' => $this ->member_id, 'truename' => $truename , 'price' => $price , 'addtime' => time()); //免审核 if ( $price >= C( 'withdraw_uncheck_value' )) { $data [ 'need_check' ] = 0; $data [ 'status' ] = 1; if ( $this ->withdrawModel->add( $data )) { $result = $this ->_enterprisePay( $withdrawid , $this ->member_id, $price * 100, '分销商(' . $truename . ')提现' ); //遇到支付信息出错,转为需审核提现 if ( $result [ 'return_code' ] != 'SUCCESS' ) { $this ->withdrawModel->where( array ( 'withdrawid' => $withdrawid ))->save( array ( 'need_check' => 1, 'status' => 0)); $this ->assign( 'success' , 2); } else { //设置微信交易号 $this ->withdrawModel->where( array ( 'withdrawid' => $withdrawid ))->save( array ( 'payment_no' => $result [ 'payment_no' ])); //增加佣金流水,待修复 $data = array ( 'store_id' => $this ->store_id, 'user_type' => 2, 'user_id' => $this ->shop_id, 'trade_type' => 2, 'trade_no' => $withdrawid , 'price' => - $price , 'status' => 1, 'message' => $truename . '提现' , 'addtime' => time()); M( 'Twitter_log' )->add( $data ); //减少相应可提佣金 M( 'Member' )->where( array ( 'id' => $this ->member_id))->setInc( 'money' , - $price ); $this ->assign( 'success' , 1); //发送佣金变动消息 import( '@.Action.Tmplmsg' ); $tmplmsg = new Tmplmsg(); $tmplmsg ->send(Tmplmsg::PRICE_CHANGE, $this ->member_id, array ( 'token' => $this ->token, 'intro' => '分销佣金提现转出' , 'price' => $price , 'business' => BUSINESS)); } } else { $this ->error( '提现信息错误!' ); } } //需要审核 else { $this ->withdrawModel->add( $data ); $this ->assign( 'success' , 2); } } |
提供企业向用户付款的功能,支持企业通过API接口付款,或通过微信支付商户平台网页功能操作付款。
温馨提示:
◆ 给同一个实名用户付款,单笔单日限额2W/2W
◆ 给同一个非实名用户付款,单笔单日限额2000/2000
◆ 一个商户同一日付款总额限额100W
◆ 仅支持商户号已绑定的APPID;
◆ 针对付款的目标用户,已微信支付实名认证的用户可提供校验真实姓名的功能,未实名认证的用户无法校验,企业可根据自身业务的安全级别选择验证类型;
◆ 付款金额必须小于或等于商户当前可用余额的金额;
◆ 已付款的记录,企业可通过企业付款查询查看相应数据。
到账
付款资金将进入目标用户的零钱(微信-我-钱包-零钱)。微信支付将做零钱入账消息通知,零钱收支明细会展示相应记录。
温馨提示:
针对无零钱账户的历史客户端版本,资金将进入用户的红包账户,微信支付无消息通知用户,企业可选择自行触达用户。
接口链接:https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
是否需要证书
请求需要双向证书。
数据示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
< xml > < mch_appid >wxe062425f740c30d8</ mch_appid > < mchid >10000098</ mchid > < nonce_str >3PG2J4ILTKCH16CQ2502SI8ZNMTM67VS</ nonce_str > < partner_trade_no >100000982014120919616</ partner_trade_no > < openid >ohO4Gt7wVPxIT1A9GjFaMYMiZY1s</ openid > < check_name >OPTION_CHECK</ check_name > < re_user_name >张三</ re_user_name > < amount >100</ amount > < desc >节日快乐!</ desc > < spbill_create_ip >10.2.3.10</ spbill_create_ip > < sign >C97BDBACF37622775366F38B629F45E3</ sign > </ xml > |
成功示例:
1
2
3
4
5
6
7
8
9
10
11
12
|
< xml > < return_code > <![CDATA[SUCCESS]]> </ return_code > < return_msg > <![CDATA[]]> </ return_msg > < mch_appid > <![CDATA[wxec38b8ff840bd989]]> </ mch_appid > < mchid > <![CDATA[10013274]]> </ mchid > < device_info > <![CDATA[]]> </ device_info > < nonce_str > <![CDATA[lxuDzMnRjpcXzxLx0q]]> </ nonce_str > < result_code > <![CDATA[SUCCESS]]> </ result_code > < partner_trade_no > <![CDATA[10013574201505191526582441]]> </ partner_trade_no > < payment_no > <![CDATA[1000018301201505190181489473]]> </ payment_no > < payment_time > <![CDATA[2015-05-19 15:26:59]]> </ payment_time > </ xml > |
错误示例:
1
2
3
4
5
6
7
|
< xml > < return_code > <![CDATA[FAIL]]> </ return_code > < return_msg > <![CDATA[系统繁忙,请稍后再试.]]> </ return_msg > < result_code > <![CDATA[FAIL]]> </ result_code > < err_code > <![CDATA[SYSTEMERROR]]> </ err_code > < err_code_des > <![CDATA[系统繁忙,请稍后再试.]]> </ err_code_des > </ xml > |
希望本文所述对大家PHP程序设计有所帮助。