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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。