写小程序发现微信支付有了v3版本, 就想着接个新的支付看看, 结果发现,有毒,记录一下历程
先是统一下单
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 | public function wechartAddOrder( $name , $ordernumber , $money , $openid ){
$url = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi" ;
$urlarr = parse_url ( $url );
$appid = config( 'config.appId' );
$mchid = config( 'config.mchid' );
$xlid = config( 'config.apiXL' );
$data = array ();
$randstr = getRanStr(16,false);
$time = time();
$data [ 'appid' ] = $appid ;
$data [ 'mchid' ] = $mchid ;
$data [ 'description' ] = $name ;
$data [ 'out_trade_no' ] = $ordernumber ;
$data [ 'notify_url' ] = "https://www.xffly-/api/admin/order/wechartCallback" ;//回调接口
$data [ 'amount' ][ 'total' ] = 1;
$data [ 'payer' ][ 'openid' ] = $openid ;
$data = json_encode( $data );
$key = $this ->getSign( $data , $urlarr [ 'path' ], $randstr , $time );
$token = sprintf( 'mchid="%s",serial_no="%s",nonce_str="%s",timestamp="%d",signature="%s"' , $mchid , $xlid , $randstr , $time , $key );
$header = array (
'Content-Type:' . 'application/json; charset=UTF-8' ,
'Accept:application/json' ,
'User-Agent:*/*' ,
'Authorization: WECHATPAY2-SHA256-RSA2048 ' . $token
);
$ret = curl_post_https( $url , $data , $header );
return $ret ;
}
|
计算签名, 也是按照文档弄了好多遍
1 2 3 4 5 6 7 | public function getSign( $data = array (), $url , $randstr , $time ){
$str = "POST" . "\n" . $url . "\n" . $time . "\n" . $randstr . "\n" . $data . "\n" ;
$key = file_get_contents ( 'apiclient_key.pem' );
$str = getSha256WithRSA( $str , $key );
return $str ;
}
|
通过统一下单接口得到prepay_id
在小程序里面用他的wx.requestPayment接口调起支付,没啥含量,不贴代码了,照着文档写
其中调起支付还需要一个签名,同理
1 2 3 4 5 6 7 8 9 10 11 | public function getWechartSign( $post ){
$data = array ();
$data [ 'timeStamp' ] = $post [ 'timeStamp' ];
$data [ 'nonceStr' ] = $post [ 'str' ];
$data [ 'package' ] = $post [ 'package' ];
$str = config( 'config.appId' ). "\n" . $data [ 'timeStamp' ]. "\n" . $data [ 'nonceStr' ]. "\n" . $data [ 'package' ]. "\n" ;
$key = file_get_contents ( 'apiclient_key.pem' );
$str = getSha256WithRSA( $str , $key );
return $str ;
}
|
重点是支付成功的回调,简直有毒
返回回来的json信息, json_decode解析就成了空, 复制出来再解析是可以解析的,说是他有bom信息吧, 弄了也不好使, 用htmlspecialchars_decode转义一下, 调试工具可以成功, 可是真实微信支付,还是不行,最后没办法, 存的log里面, 自己再取一下,就可以用了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public function writeWechartLog( $post ){
if (! is_dir ( "upload/log" )){
mkdir ( "upload/log" ,0777,true);
}
$log = fopen ( "upload/log/wechart.txt" , "a+" );
if ( is_array ( $post )){
$post = json_encode( $post );
}
fwrite( $log , $post . "\n" );
fclose( $log );
$read = fopen ( "upload/log/wechart.txt" , "r" );
fseek ( $read , -1, SEEK_END);
$s = '' ;
while (( $c = fgetc ( $read )) !== false) {
if ( $c == "\n" && $s ) break ;
$s = $c . $s ;
fseek ( $read , -2, SEEK_CUR);
}
fclose( $read );
return $s ;
}
|
回调信息里面,有个加密的东西,还得解密一下,这个传入的是自己又从log里面取出来的数据
sodium_crypto_aead_aes256gcm_decrypt 这个解密密方法需要php扩展 sodium
1 2 3 4 5 6 7 8 9 | public function wechartDecrypt( $str ) {
$str = htmlspecialchars_decode( $str ,ENT_COMPAT);
$post = json_decode( $str ,true);
$key = config( "config.apiv3Key" );
$text = base64_decode ( $post [ 'resource' ][ 'ciphertext' ]);
$str = sodium_crypto_aead_aes256gcm_decrypt( $text , $post [ 'resource' ][ 'associated_data' ], $post [ 'resource' ][ 'nonce' ], $key );
return json_decode( $str ,true);
}
|
然后就是取到回调信息后的业务处理了
又看到这个文章的朋友, 如果知道为什么 微信回调回来的 json信息, 没办法直接使用的, 麻烦告告我,谢谢啦, 研究一天没研究出来, 只能先这样处理了。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~