php实现微信支付之现金红包
网上的很多PHP微信支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,希望可以给各位想接入微信支付的带来些许帮助和借鉴意义。
直接运行该文件即可给指定的微信用户发送现金红包。
需要注意的事项:
1.微信现金红包要求必传证书,需要到这里账户中心->账户设置->API安全->下载证书,然后修改代码中的证书路径
2.默认的使用场景是抽奖(即scene_id参数为PRODUCT_2),额度是1-200元,所以测试时的最低金额是1元。如需修改在产品中心->产品大全->现金红包->产品设置中修改
3.该文件需放到支付授权目录下,可以在微信支付商户平台->产品中心->开发配置中设置。
4.如提示签名错误可以通过微信支付签名验证工具进行验证:微信公众平台支付接口调试工具
5.错误码参照:地址
代码如下:
账户设置->API安全->下载证书,证书路径在第214行和217行修改
*2.默认的使用场景是抽奖(即scene_id参数为PRODUCT_2),额度是1-200元,所以测试时的最低金额是1元。如需修改在产品中心->产品大全->现金红包->产品设置中修改
*3.错误码参照:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3
*/
header('Content-type:text/html;Charset=utf-8');
$mchid='xxxxx';//微信支付商户号PartnerID通过微信支付商户资料审核后邮件发送
$appid='xxxxx';//微信支付申请对应的公众号的APPID
$appKey='xxxxx';//微信支付申请对应的公众号的APPKey
$apiKey='xxxxx';//https://pay.weixin.qq.com帐户设置-安全设置-API安全-API密钥-设置API密钥
//①、获取当前访问页面的用户openid(如果给指定用户发送红包,则填写指定用户的openid)
$wxPay=newWxpayService($mchid,$appid,$appKey,$apiKey);
$openId=$wxPay->GetOpenid();//获取openid
if(!$openId)exit('获取openid失败');
//②、发送红包
$outTradeNo=uniqid();//你自己的商品订单号
$payAmount=1;//红包金额,单位:元
$sendName='织梦猫';//红包发送者名称
$wishing='感谢您参加猜灯谜活动,祝您元宵节快乐!';//红包祝福语
$act_name='猜灯谜抢红包活动';//活动名称
$result=$wxPay->createJsBizPackage($openId,$payAmount,$outTradeNo,$sendName,$wishing,$act_name);
echo'success';
classWxpayService
{
protected$mchid;
protected$appid;
protected$appKey;
protected$apiKey;
public$data=null;
publicfunction__construct($mchid,$appid,$appKey,$key)
{
$this->mchid=$mchid;
$this->appid=$appid;
$this->appKey=$appKey;
$this->apiKey=$key;
}
/**
*通过跳转获取用户的openid,跳转流程如下:
*1、设置自己需要调回的url及其其他参数,跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize
*2、微信服务处理完成之后会跳转回用户redirect_uri地址,此时会带上一些参数,如:code
*@return用户的openid
*/
publicfunctionGetOpenid()
{
//通过code获得openid
if(!isset($_GET['code'])){
//触发微信返回code码
$scheme=$_SERVER['HTTPS']=='on'?'https://':'http://';
$baseUrl=urlencode($scheme.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']);
$url=$this->__CreateOauthUrlForCode($baseUrl);
Header("Location:$url");
exit();
}else{
//获取code码,以获取openid
$code=$_GET['code'];
$openid=$this->getOpenidFromMp($code);
return$openid;
}
}
/**
*通过code从工作平台获取openid机器access_token
*@paramstring$code微信跳转回来带上的code
*@returnopenid
*/
publicfunctionGetOpenidFromMp($code)
{
$url=$this->__CreateOauthUrlForOpenid($code);
$res=self::curlGet($url);
//取出openid
$data=json_decode($res,true);
$this->data=$data;
$openid=$data['openid'];
return$openid;
}
/**
*构造获取open和access_toke的url地址
*@paramstring$code,微信跳转带回的code
*@return请求的url
*/
privatefunction__CreateOauthUrlForOpenid($code)
{
$urlObj["appid"]=$this->appid;
$urlObj["secret"]=$this->appKey;
$urlObj["code"]=$code;
$urlObj["grant_type"]="authorization_code";
$bizString=$this->ToUrlParams($urlObj);
return"https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
}
/**
*构造获取code的url连接
*@paramstring$redirectUrl微信服务器回跳的url,需要url编码
*@return返回构造好的url
*/
privatefunction__CreateOauthUrlForCode($redirectUrl)
{
$urlObj["appid"]=$this->appid;
$urlObj["redirect_uri"]="$redirectUrl";
$urlObj["response_type"]="code";
$urlObj["scope"]="snsapi_base";
$urlObj["state"]="STATE"."#wechat_redirect";
$bizString=$this->ToUrlParams($urlObj);
return"https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
}
/**
*拼接签名字符串
*@paramarray$urlObj
*@return返回已经拼接好的字符串
*/
privatefunctionToUrlParams($urlObj)
{
$buff="";
foreach($urlObjas$k=>$v)
{
if($k!="sign")$buff.=$k."=".$v."&";
}
$buff=trim($buff,"&");
return$buff;
}
/**
*发送红包
*@paramstring$openid用户在该公众号下的Openid
*@paramfloat$totalFee红包金额单位元
*@paramstring$outTradeNo订单号
*@paramstring$orderName红包发送者名称
*@paramstring$wishing祝福语
*@paramstring$actName互动名称
*@returnstring
*/
publicfunctioncreateJsBizPackage($openid,$totalFee,$outTradeNo,$sendName,$wishing,$actName)
{
$config=array(
'mch_id'=>$this->mchid,
'appid'=>$this->appid,
'key'=>$this->apiKey,
);
$unified=array(
'wxappid'=>$config['appid'],
'send_name'=>$sendName,
'mch_id'=>$config['mch_id'],
'nonce_str'=>self::createNonceStr(),
're_openid'=>$openid,
'mch_billno'=>$outTradeNo,
'client_ip'=>'127.0.0.1',
'total_amount'=>intval($totalFee*100),//单位转为分
'total_num'=>1,//红包发放总人数
'wishing'=>$wishing,//红包祝福语
'act_name'=>$actName,//活动名称
'remark'=>'remark',//备注信息,如为中文注意转为UTF8编码
'scene_id'=>'PRODUCT_2',//发放红包使用场景,红包金额大于200时必传。https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3
);
$unified['sign']=self::getSign($unified,$config['key']);
$responseXml=$this->curlPost('https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack',self::arrayToXml($unified));
$unifiedOrder=simplexml_load_string($responseXml,'SimpleXMLElement',LIBXML_NOCDATA);
if($unifiedOrder===false){
die('parsexmlerror');
}
if($unifiedOrder->return_code!='SUCCESS'){
die($unifiedOrder->return_msg);
}
if($unifiedOrder->result_code!='SUCCESS'){
die($unifiedOrder->err_code);
}
returntrue;
}
publicstaticfunctioncurlGet($url='',$options=array())
{
$ch=curl_init($url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_TIMEOUT,30);
if(!empty($options)){
curl_setopt_array($ch,$options);
}
//https请求不验证证书和host
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
$data=curl_exec($ch);
curl_close($ch);
return$data;
}
publicfunctioncurlPost($url='',$postData='',$options=array())
{
if(is_array($postData)){
$postData=http_build_query($postData);
}
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$postData);
curl_setopt($ch,CURLOPT_TIMEOUT,30);//设置cURL允许执行的最长秒数
if(!empty($options)){
curl_setopt_array($ch,$options);
}
//https请求不验证证书和host
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
//第一种方法,cert与key分别属于两个.pem文件
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert/apiclient_cert.pem');
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/cert/apiclient_key.pem');
//第二种方式,两个文件合成一个.pem文件
//curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');
$data=curl_exec($ch);
curl_close($ch);
return$data;
}
publicstaticfunctioncreateNonceStr($length=16)
{
$chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$str='';
for($i=0;$i<$length;$i++){
$str.=substr($chars,mt_rand(0,strlen($chars)-1),1);
}
return$str;
}
publicstaticfunctionarrayToXml($arr)
{
$xml="";
foreach($arras$key=>$val){
if(is_numeric($val)){
$xml.="<".$key.">".$val."".$key.">";
}else
$xml.="<".$key.">".$key.">";
}
$xml.=" ";
return$xml;
}
publicstaticfunctiongetSign($params,$key)
{
ksort($params,SORT_STRING);
$unSignParaString=self::formatQueryParaMap($params,false);
$signStr=strtoupper(md5($unSignParaString."&key=".$key));
return$signStr;
}
protectedstaticfunctionformatQueryParaMap($paraMap,$urlEncode=false)
{
$buff="";
ksort($paraMap);
foreach($paraMapas$k=>$v){
if(null!=$v&&"null"!=$v){
if($urlEncode){
$v=urlencode($v);
}
$buff.=$k."=".$v."&";
}
}
$reqPar='';
if(strlen($buff)>0){
$reqPar=substr($buff,0,strlen($buff)-1);
}
return$reqPar;
}
}
?>
github下载地址:weixinPay
相关文章:
php实现微信原生支付(扫码支付)功能
php微信支付之公众号支付功能
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。