怎么开通企业付款到零钱?
有的商户号的产品中心是没有这个功能的,不过,该功能的pid(product id)是5,只要随便进去某一个产品,在地址栏把pid改为5。
即可进入该功能页面,进行开通,不过要满足条件。
用户提现代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//用户微信提现
private function withdrawals_weixin( $id ){
$falg = M( 'withdrawals' )->where([ 'id' => $id ])->find();
$openid = M( 'users' )->where( 'user_id' , $falg [ 'user_id' ])->value( 'openid' );
$data [ 'openid' ] = $openid ;
$data [ 'pay_code' ] = $falg [ 'id' ]. $falg [ 'user_id' ];
$data [ 'desc' ] = '提现ID' . $falg [ 'id' ];
if ( $falg [ 'taxfee' ] >= $falg [ 'money' ]){
return array ( 'status' =>1, 'msg' => "提现额度必须大于手续费!" );
} else {
$data [ 'money' ] = bcsub( $falg [ 'money' ], $falg [ 'taxfee' ], 2);
}
include_once PLUGIN_PATH . "payment/weixin/weixin.class.php" ;
$weixin_obj = new \weixin();
$result = $weixin_obj ->transfer( $data );
return $result ;
}
|
其中pay_code在商户号的提现功能是唯一的,所以为了防重放攻击,这个值千万不能用随机数,最好用ID,具有提现记录唯一。
提现逻辑代码:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
// 微信提现转账
function transfer( $data ){
header( "Content-type: text/html; charset=utf-8" );
//CA证书及支付信息
$wxchat [ 'appid' ] = WxPayConfig:: $appid ;
$wxchat [ 'mchid' ] = WxPayConfig:: $mchid ;
$wxchat [ 'api_cert' ] = PLUGIN_PATH. '/payment/weixin/cert/apiclient_cert.pem' ;
$wxchat [ 'api_key' ] = PLUGIN_PATH. '/payment/weixin/cert/apiclient_key.pem' ;
// $wxchat['api_ca'] = '/plugins/payment/weixin/cert/rootca.pem';
$webdata = array (
'mch_appid' => $wxchat [ 'appid' ],
'mchid' => $wxchat [ 'mchid' ],
'nonce_str' => md5(time()),
//'device_info' => '1000',
'partner_trade_no' => $data [ 'pay_code' ], //商户订单号,需要唯一
'openid' => $data [ 'openid' ], //转账用户的openid
'check_name' => 'NO_CHECK' , //OPTION_CHECK不强制校验真实姓名, FORCE_CHECK:强制 NO_CHECK:
//'re_user_name' => 'jorsh', //收款人用户姓名
'amount' => $data [ 'money' ] * 100, //付款金额单位为分
'desc' => $data [ 'desc' ],
'spbill_create_ip' => request()->ip(),
);
foreach ( $webdata as $k => $v ) {
$tarr [] = $k . '=' . $v ;
}
sort( $tarr );
$sign = implode( $tarr , '&' );
$sign .= '&key=' .WxPayConfig:: $key ;
$webdata [ 'sign' ]= strtoupper (md5( $sign ));
$wget = $this ->array2xml( $webdata );
$pay_url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers' ;
$res = $this ->http_post( $pay_url , $wget , $wxchat );
if (! $res ){
return array ( 'status' =>1, 'msg' => "Can't connect the server" );
}
$content = simplexml_load_string( $res , 'SimpleXMLElement' , LIBXML_NOCDATA);
if ( strval ( $content ->return_code) == 'FAIL' ){
return array ( 'status' =>1, 'msg' => strval ( $content ->return_msg));
}
if ( strval ( $content ->result_code) == 'FAIL' ){
return array ( 'status' =>1, 'msg' => strval ( $content ->err_code), ':' . strval ( $content ->err_code_des));
}
$rdata = array (
'mch_appid' => strval ( $content ->mch_appid),
'mchid' => strval ( $content ->mchid),
'device_info' => strval ( $content ->device_info),
'nonce_str' => strval ( $content ->nonce_str),
'result_code' => strval ( $content ->result_code),
'partner_trade_no' => strval ( $content ->partner_trade_no),
'payment_no' => strval ( $content ->payment_no),
'payment_time' => strval ( $content ->payment_time),
);
return $rdata ;
}
|
其中 PLUGIN_PATH 是一个常量
1
|
define( 'PLUGIN_PATH' , __DIR__ . '/plugins/' );
|
定义插件目录
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
/**
* 将一个数组转换为 XML 结构的字符串
* @param array $arr 要转换的数组
* @param int $level 节点层级, 1 为 Root.
* @return string XML 结构的字符串
*/
function array2xml( $arr , $level = 1) {
$s = $level == 1 ? "<xml>" : '' ;
foreach ( $arr as $tagname => $value ) {
if ( is_numeric ( $tagname )) {
$tagname = $value [ 'TagName' ];
unset( $value [ 'TagName' ]);
}
if (! is_array ( $value )) {
$s .= "<{$tagname}>" .(! is_numeric ( $value ) ? '<![CDATA[' : '' ). $value .(! is_numeric ( $value ) ? ']]>' : '' ). "</{$tagname}>" ;
} else {
$s .= "<{$tagname}>" . $this ->array2xml( $value , $level + 1). "</{$tagname}>" ;
}
}
$s = preg_replace( "/([\x01-\x08\x0b-\x0c\x0e-\x1f])+/" , ' ' , $s );
return $level == 1 ? $s . "</xml>" : $s ;
}
function http_post( $url , $param , $wxchat ) {
$oCurl = curl_init();
if ( stripos ( $url , "https://" ) !== FALSE) {
curl_setopt( $oCurl , CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt( $oCurl , CURLOPT_SSL_VERIFYHOST, FALSE);
}
if ( is_string ( $param )) {
$strPOST = $param ;
} else {
$aPOST = array ();
foreach ( $param as $key => $val ) {
$aPOST [] = $key . "=" . urlencode( $val );
}
$strPOST = join( "&" , $aPOST );
}
curl_setopt( $oCurl , CURLOPT_URL, $url );
curl_setopt( $oCurl , CURLOPT_RETURNTRANSFER, 1);
curl_setopt( $oCurl , CURLOPT_POST, true);
curl_setopt( $oCurl , CURLOPT_POSTFIELDS, $strPOST );
if ( $wxchat ){
curl_setopt( $oCurl ,CURLOPT_SSLCERT, $wxchat [ 'api_cert' ]);
curl_setopt( $oCurl ,CURLOPT_SSLKEY, $wxchat [ 'api_key' ]);
curl_setopt( $oCurl ,CURLOPT_CAINFO, $wxchat [ 'api_ca' ]);
}
$sContent = curl_exec( $oCurl );
$aStatus = curl_getinfo( $oCurl );
curl_close( $oCurl );
if ( intval ( $aStatus [ "http_code" ]) == 200) {
return $sContent ;
} else {
return false;
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_36602939/article/details/91399977