C#公众号开发之给用户发红包
红包功能简单介绍:
1、商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景
2、领取到红包后,用户的资金直接进入微信零钱,避免繁复的领奖流程,带给用户微信支付原生的流畅体验
现金红包官网文档地址
调用现金红包接口需要使用到证书,请前往商户平台下载证书
官网有关详细证书的介绍,点击查看
因为发送现金红包是从商户平台余额扣款,所以商户平台的账户余额必须有充足的余额
下面是调用红包接口详细代码:
1、签名的MD5加密类:
//////MD5UtilHelper的摘要说明。 /// publicclassMD5UtilHelper { publicMD5UtilHelper() { // //TODO:在此处添加构造函数逻辑 // } //////获取大写的MD5签名结果 /// ////// /// publicstaticstringGetMD5(stringencypStr,stringcharset) { stringretStr; MD5CryptoServiceProviderm5=newMD5CryptoServiceProvider(); //创建md5对象 byte[]inputBye; byte[]outputBye; //使用GB2312编码方式把字符串转化为字节数组. try { inputBye=Encoding.GetEncoding(charset).GetBytes(encypStr); } catch(Exceptionex) { inputBye=Encoding.GetEncoding("GB2312").GetBytes(encypStr); } outputBye=m5.ComputeHash(inputBye); retStr=System.BitConverter.ToString(outputBye); retStr=retStr.Replace("-","").ToUpper(); returnretStr; } }
2、处理参数的类:
publicclassRequestHandler
{
publicRequestHandler(HttpContexthttpContext)
{
Parameters=newHashtable();
this.HttpContext=httpContext??HttpContext.Current;
}
///
///密钥
///
privatestringKey;
protectedHttpContextHttpContext;
///
///请求的参数
///
protectedHashtableParameters;
///
///debug信息
///
privatestringDebugInfo;
///
///初始化函数
///
publicvirtualvoidInit()
{
}
///
///获取debug信息
///
///
publicStringGetDebugInfo()
{
returnDebugInfo;
}
///
///获取密钥
///
///
publicstringGetKey()
{
returnKey;
}
///
///设置密钥
///
///
publicvoidSetKey(stringkey)
{
this.Key=key;
}
///
///设置参数值
///
///
///
publicvoidSetParameter(stringparameter,stringparameterValue)
{
if(parameter!=null&¶meter!="")
{
if(Parameters.Contains(parameter))
{
Parameters.Remove(parameter);
}
Parameters.Add(parameter,parameterValue);
}
}
///
///创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名
///
///参数名
///参数值
///key和value通常用于填充最后一组参数
///
publicvirtualstringCreateMd5Sign(stringkey,stringvalue)
{
StringBuildersb=newStringBuilder();
ArrayListakeys=newArrayList(Parameters.Keys);
akeys.Sort();
foreach(stringkinakeys)
{
stringv=(string)Parameters[k];
if(null!=v&&"".CompareTo(v)!=0
&&"sign".CompareTo(k)!=0&&"key".CompareTo(k)!=0)
{
sb.Append(k+"="+v+"&");
}
}
sb.Append(key+"="+value);
stringsign=MD5UtilHelper.GetMD5(sb.ToString(),GetCharset()).ToUpper();
returnsign;
}
///
///输出XML
///
///
publicstringParseXML()
{
StringBuildersb=newStringBuilder();
sb.Append("");
foreach(stringkinParameters.Keys)
{
stringv=(string)Parameters[k];
if(Regex.IsMatch(v,@"^[0-9.]$"))
{
sb.Append("<"+k+">"+v+""+k+">");
}
else
{
sb.Append("<"+k+">"+k+">");
}
}
sb.Append(" ");
returnsb.ToString();
}
///
///设置debug信息
///
///
publicvoidSetDebugInfo(StringdebugInfo)
{
this.DebugInfo=debugInfo;
}
publicHashtableGetAllParameters()
{
returnthis.Parameters;
}
protectedvirtualstringGetCharset()
{
returnthis.HttpContext.Request.ContentEncoding.BodyName;
}
}
3、调用现金红包处理类:
//////企业号微信支付接口 /// publicstaticclassTenPay { #region企业向用户发红包 //////用于企业向微信用户个人发红包 ///目前支持向指定微信用户的openid个人发红包 /// ///apiclient_cert.p12证书密码即商户号 /// 微信支付需要post的xml数据 /// apiclient_cert.p12的证书物理位置(例如:E:\projects\文档\微信商户平台证书\商户平台API证书 /// /// publicstaticstringSendredpack(stringdata,stringcertPassword,stringcertPath,inttimeOut=Config.TIME_OUT) { varurlFormat="https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack"; stringcert=certPath; ServicePointManager.ServerCertificateValidationCallback=newRemoteCertificateValidationCallback(CheckValidationResult); X509Certificate2cer=newX509Certificate2(cert,certPassword,X509KeyStorageFlags.PersistKeySet|X509KeyStorageFlags.MachineKeySet); varformDataBytes=data==null?newbyte[0]:Encoding.UTF8.GetBytes(data); MemoryStreamms=newMemoryStream(); ms.Write(formDataBytes,0,formDataBytes.Length); ms.Seek(0,SeekOrigin.Begin);//设置指针读取位置 HttpWebRequestrequest=(HttpWebRequest)WebRequest.Create(urlFormat); request.ClientCertificates.Add(cer); request.Method="POST"; request.Timeout=timeOut; request.UserAgent="Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/31.0.1650.57Safari/537.36"; #region输入二进制流 if(ms!=null) { ms.Position=0; //直接写入流 StreamrequestStream=request.GetRequestStream(); byte[]buffer=newbyte[1024]; intbytesRead=0; while((bytesRead=ms.Read(buffer,0,buffer.Length))!=0) { requestStream.Write(buffer,0,bytesRead); } ms.Close();//关闭文件访问 } #endregion HttpWebResponseresponse=(HttpWebResponse)request.GetResponse(); using(StreamresponseStream=response.GetResponseStream()) { using(StreamReadermyStreamReader=newStreamReader(responseStream,Encoding.GetEncoding("utf-8"))) { stringretString=myStreamReader.ReadToEnd(); returnretString; } } } privatestaticboolCheckValidationResult(objectsender,X509Certificatecertificate,X509Chainchain,SslPolicyErrorserrors) { if(errors==SslPolicyErrors.None) returntrue; returnfalse; } #endregion }
4、调用现金红包接口
#region发送红包
boolfals=false;//记录发送红包是否成功
stringxmlResult=null;//现金红包接口返回的xml
stringcertPath=null;//证书在服务器的物理位置
stringdata=null;//调用现金红包接口需要的数据
try
{
//创建支付应答对象
RequestHandlerpackageReqHandler=newRequestHandler(null);
//初始化
packageReqHandler.Init();
stringnonceStr=TenPayV3Util.GetNoncestr();//时间戳
//设置package订单参数
packageReqHandler.SetParameter("nonce_str",nonceStr);//随机字符串,不长于32位
packageReqHandler.SetParameter("mch_billno",System.Configuration.ConfigurationManager.AppSettings["TenPayV3_MchId"]+model.JournalNumber);//商户订单号(每个订单号必须唯一)组成:mch_id+yyyymmdd+10位一天内不能重复的数字。接口根据商户订单号支持重入,如出现超时可再调用。
packageReqHandler.SetParameter("mch_id",System.Configuration.ConfigurationManager.AppSettings["TenPayV3_MchId"]);//微信支付分配的商户号
packageReqHandler.SetParameter("wxappid",System.Configuration.ConfigurationManager.AppSettings["TenPayV3_AppId"]);//微信分配的公众账号ID(企业号corpid即为此appId)。接口传入的所有appid应该为公众号的appid(在mp.weixin.qq.com申请的),不能为APP的appid(在open.weixin.qq.com申请的)。
packageReqHandler.SetParameter("send_name","测试");//商户名称
packageReqHandler.SetParameter("re_openid",model.BankCard);//用户openid接受红包的用户用户在wxappid下的openid
packageReqHandler.SetParameter("total_amount",Convert.ToInt32((decimal)(model.Amount*100M)).ToString(CultureInfo.InvariantCulture));//付款金额单位分
packageReqHandler.SetParameter("total_num","1");//红包发放总人数
packageReqHandler.SetParameter("wishing","测试红包");//红包祝福语
packageReqHandler.SetParameter("client_ip",HttpContext.Current.Request.UserHostAddress);//Ip地址
packageReqHandler.SetParameter("act_name","测试红包");//活动名称
packageReqHandler.SetParameter("remark","测试红包");//备注
stringsign=packageReqHandler.CreateMd5Sign("key",System.Configuration.ConfigurationManager.AppSettings["TenPayV3_Key"]);
packageReqHandler.SetParameter("sign",sign);//签名
data=packageReqHandler.ParseXML();
certPath=Server.MapPath("~/")+System.Configuration.ConfigurationManager.AppSettings["certPath"];
xmlResult=Sendredpack(data,System.Configuration.ConfigurationManager.AppSettings["TenPayV3_MchId"],certPath);
varres=XDocument.Parse(xmlResult);
stringreturn_code=res.Element("xml").Element("return_code").Value;
if("SUCCESS".Equals(return_code))
{
stringresult_code=res.Element("xml").Element("result_code").Value;
if("SUCCESS".Equals(result_code))
{
fals=true;
}
}
}
catch(Exceptionexception)
{
}
#endregion
注意:证书所在文件夹权限,IIS必须有权限对该文件夹操作的权限。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。