1、首先。我们清楚既然是API,那必然有文档。在这里我会贴出我与alipayCoder一遍联调一边写的文档(在原著上进行修改的)。这里我先把文档贴出。请大家仔细看。
文档下载地址:http://download.csdn.net/download/x15928666119/4199991
总结:
1、生成二维码的步骤(根据你的ID和key(支付宝的授权) + 生成二维码的参数列表拼接字符串)(字符串的拼接说明:拼接成URL。1、key (参数名)+ “=” + value(参数值)按照key.a-z的排序2、拼接排序后的结果例如:bizname="黄翔"&return_url="returnUrl.asxp"(我这里只举例2个参数.详情看API文档)进行编码例如:utf-8获得URL地址。3、将生成的URL地址 + key = “keyvalue”(你的key)进行MD5加密获得sign。4、将完整的url连接:带http://进行模拟请求。5、获得模拟请求结果(在当前页面、会返回xml数据。这里对xml数据解析保存至服务器或你的txt文本。方便以后调用。)6、根据返回的二维码进行图片生成(网上很多的二维码生成DLL。如果需要可以联系我QQ:1434197610.))7、就是你们运营的使用了。大致讲完。有什么不明白的留言吧。这里我还是将我的代码贴出.草稿代码哈。别批我。呵呵呵
新增二维码操作代码部分:
<p>
<pre name="code" class="csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using System.Collections;
using System.Data;
using System.Xml;
using System.Security.Cryptography;
using ThoughtWorks.QRCode.Codec;
using System.IO;
namespace TopAPIDemo
{
/// <summary>
/// 新增二维码产品
/// </summary>
public partial class WebForm1 : System.Web.UI.Page
{
//string tmp = "https://mapi.alipay.com/gateway.do?sign_type=MD5&partner=2088101103495019&sign=ffa3e1a9708f07ad20c5229cf9815877&_input_charset=UTF-8&qrcode=%5BAlipay%5D%3A7435301335625758&service=alipay.mobile.qrcode.create&method=stop";
//API入口
string url = "https://mapi.alipay.com/gateway.do?";
//加密类型
string sign_type = "sign_type=MD5";
//联测key
//自我开发测试key
//正式key
string key = "";
//合作商户ID。授权标识
string partnerKey = "partner"; string partnerValue = ""; //正式PID //string partnerValue = "";test PID:
//编码格式
string _input_charsetKey = "_input_charset"; string _input_charsetValue = "UTF-8";
//二维码。这里保存二维码地址
string qrcodeKey = null; string qrcodeValue = null;
//API输入参数签名结果
string sign = null;
//指示调用函数
string serviceMethodKey = "service"; string serviceMethodValue = "alipay.mobile.qrcode.create";
//二维码操作方式
string methodKey = "method"; string methodValue = MethodType.MethodType_add;
//收款方支付宝账号(手机号码或者邮箱地址)。当method=add时不可空
string recevie_accountKey = "recevie_account"; string recevie_accountValue = "alipay-test12@alipay.com"; //正式账号:
//收款方名称(收款方在手机上显示的名称)。当method=add时不可空
string recevie_account_nameKey = "recevie_account_name"; string recevie_account_nameValue = "通吃网";
//订单名称编号(商品名称).获得平台自身数据进行数据赋值接入当method=add时不可空。
string biz_nameKey = "biz_name"; //string biz_nameValue = "重庆特产奉节脐橙10公斤包邮 纯绿色脐橙(公益项目,请单独购买)23号发货";//值从文本狂获取
//交易默认金额,交易默认金额,以元为单位。格式为:xx.xx,小数点后保留两位小数,如19.71。当method=add时不可空。
string biz_amountKey = "biz_amount"; //string biz_amountValue = "0.10";//对应键的值根据业务规则从数据查询获取
//交易金额列表。格式必须为:{title}|{name1,name2..}|{value1,value2..}当method=add时不可空。通过具体的商品来进行操作
string biz_amount_listKey = "biz_amount_list"; string biz_amount_listValue = "{优惠}|{特惠价}|{00.10}";
//商户生成二维码且用户使用了二维码,创建了一笔交易,支付宝通过该路径通知商户系统下订单。如果为空则不通知商户系统。
string return_urlKey = "return_url"; string return_urlValue = "http://" + HttpContext.Current.Request.Url.Host.ToString() + "/return_url.aspx";//return_url.aspx
//支付成功后,支付宝通过该路径通知商户支付成功,同时获取商户商品信息。如果为空则不通知商户系统。
string notify_urlKey = "notify_url"; string notify_urlValue = "http://" + HttpContext.Current.Request.Url.Host.ToString() + "/notify_url.aspx";
//业务类型。值为:1:商品购买 2:我要付款
//商品购买是指用户通过拍摄二维码购买某种商品,如购买游戏点卡;
//我要付款是指用户拍摄二维码直接向另一用户付款。
string biz_typeKey = "biz_type"; string biz_typeValue = "";
//用户拍摄二维码后在支付宝客户端显示的商品的可选数量列表,格式为:{count1,count2..}.例:{1,2,3,4,5}.该列表通过数据库获得商品库存来进行填充
string biz_count_listKey = "biz_count_list"; string biz_count_listValue = "{1,2,3,4,5}";
//交易类型1:即时到账我要收款交易2:即时到账我要付款交易3:担保交易。默认值为1
string trade_typeKey = "trade_type"; string trade_typeValue = "1";
//是否需要收获地址
string need_addressKey = "need_address"; string need_addressValue = "T";
//如果用户超过该时间不支付,则该交易关闭。单位为分钟,取值范围为5~60。默认为5分钟。
string pay_timeoutKey = "pay_timeout"; string pay_timeoutValue = "5";
//1:不带订单名称(对应于biz_name属性)的二维码2:带订单名称(对应于biz_name属性)的二维码默认为1。
string qrcode_styleKey = "qrcode_style"; string qrcode_styleValue = "2";
string memoKey = "memo"; string memoValue = "通吃网零食真好吃";
protected void Page_Load(object sender, EventArgs e)
{
}
/// <summary>
/// 新增二维码产品
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void BtnCreate_Click(object sender, EventArgs e)
{
mt.Model.Products pro = null;
string tmptxt = TextBox1.Text;
if (tmptxt.Trim() != "")
{
pro = new mt.BLL.Products().GetModel(TextBox1.Text); //获得产品信息
if (pro != null) //对输入的产品名进行非null验证
{
QREnty enty = new QREnty();
enty.ProductID = pro.ProductID;
enty.ProductName = pro.ProductName;
//验证需要生产二维码的商品是否曾经已经生成
if (this.GetQRCodeByProductName(enty))//
{
//向支付宝请求创建二维码并获得二维码条根据它创建二维码图片和数据信息(XML)保存至本地服务器
if (CreateQrcodeImgByAplieQrcode(enty, pro))
{
enty.ImgUrl = ViewState["imgUrl"] != null ? ViewState["imgUrl"].ToString() : "";
enty.QRCode = ViewState["QrCode"] != null ? ViewState["QrCode"].ToString() : "";
if (this.SaveQRCodeByXML(enty))
{
Image1.ImageUrl = enty.ImgUrl;
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "yes", "alert('恭喜,新增二维码产品成功');", true);
}
else { ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "errosql", "alert('二维码产品保存至数据库失败');", true); }
}
else
{
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "erroQR", "alert('生成二维码产品失败');", true);
}
}
else
{
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "erroExits", "alert('当前产品已经是二维码产品')", true);
}
}
else
{
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "erroNothingPro", "alert('没有该产品,请重新输入')", true);
}
}
else { ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "erroNothing", "alert('产品名不能为空')", true); }
}
/// <summary>
/// 根据产品名模糊搜索二维码产品信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void BtnSeeImage_Click(object sender, EventArgs e)
{
string tmp = TextBox1.Text.Trim();
if (tmp != "")
{
QREnty enty = new QREnty();
enty.ProductName = tmp;
QREntyDAL dal = new QREntyDAL();
enty = dal.GetModel(enty, 2);
if (enty != null)
{
Image1.ImageUrl = enty.ImgUrl;
}
else { ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "errosqlnodataSourseObj", "alert('没有该信息,请重新输入检索')", true); }
}
else
{
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "errosqlnodataSourse", "alert('文本框为空,请重新输入检索')", true);
}
}
#region 本地数据库操作 新增二维码产品,验证产品是否已经是二维码产品 处理步骤五
/// <summary>
/// 将请求的来的数据信息保存
/// </summary>
bool SaveQRCodeByXML(QREnty enty)
{
QREntyDAL dal = new QREntyDAL();
if (dal.Add(enty) > 0)
{
return true;
}
this.WrtieLogSign("ADDSQLErro", "将生成的二维码信息保存至服务器数据库失败");
return false;
}
/// <summary>
/// 通过要生成的产品名称去检查当前生成商品是否已经存在
/// </summary>
/// <returns>true为不存在</returns>
bool GetQRCodeByProductName(QREnty entytmp)
{
QREntyDAL dal = new QREntyDAL();
if (dal.GetModel(entytmp, 2) == null)
{
return true;
}
return false;
}
#endregion
#region 根据支付宝回传的二维码ID生成相关产品图片 处理步骤四
/// <summary>
/// 根据支付宝回传的二维码ID生成相关产品图片并向数据库进行信息添加
/// </summary>
/// <param name="enty">实体信息</param>
/// <returns>bool。为true成功</returns>
bool CreateQrcodeImgByAplieQrcode(QREnty enty, mt.Model.Products pro)
{
enty.QRCode = this.xmlGetQrcodeImgByAplieQrcode(this.GetRequestUrl(pro));
if (enty.QRCode != null)
{
ViewState.Add("QrCode", enty.QRCode);
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
try
{
//int scale = Convert.ToInt16(Request["Txtsize"].ToString());
//指定生成二维码图片大小
qrCodeEncoder.QRCodeScale = 4;
//指定生成方式
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
#region 本版号指定,二维码纠错能力指定 其他的二维码图片生成模式
//try 指定版本号
//{
// int version = Convert.ToInt16(Request["DDLVer"].ToString());
// qrCodeEncoder.QRCodeVersion = version;
//}
//catch (Exception ex)
//{
// return false;
//}
//string errorCorrect = Request["DDLJC"].ToString();
//if (errorCorrect == "L")
// qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;
//else if (errorCorrect == "M")
// qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
//else if (errorCorrect == "Q")
// qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q;
//else if (errorCorrect == "H")暂定为最高级的纠错能力
//String encoding = Request["DDLEncode"].ToString();
//if (encoding == "Byte")
//{
// qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
//}
//else if (encoding == "AlphaNumeric")
//{
// qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC;
//}
//else if (encoding == "Numeric")
//{
// qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC;
//}
#endregion
#region 开始生成二维码
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;
String data = enty.QRCode;
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.Drawing.Image myimg = qrCodeEncoder.Encode(data);
myimg.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
myimg = System.Drawing.Image.FromStream(ms);
string address = Server.MapPath("QRImage") + "\\" + enty.QRCode.Replace(":", "").Replace("[", "").Replace("]", "") + ".gif";
myimg.Save(address);
ViewState.Add("imgUrl", "QRImage/" + enty.QRCode.Replace(":", "").Replace("[", "").Replace("]", "") + ".gif");
//进行数据库操作
return true;
//将生成的图片输出
//Response.ClearContent();
//Response.ContentType = "image/Gif";
//Response.BinaryWrite(ms.ToArray());
//Response.End();
#endregion
}
catch (Exception ex)
{
this.WrtieLogSign("CreateImgByQRCode", "根据二维码字符串创建二维码图片失败");
return false;
}
}
this.WrtieLogSign("NoQRCodeByParamerters", "根据二维码字符串创建二维码图片失败");
return false;
}
#endregion
#region 模拟请求,获得二维码数据 处理步骤三
/// <summary>
/// 通过请求拼接的URL地址获取相关XML数据
/// </summary>
/// <param name="httpUrl">请求地址</param>
/// <returns>二维码号码</returns>
public string xmlGetQrcodeImgByAplieQrcode(string httpUrl)
{
string xmlPath = httpUrl; // 该地址不能包含中文
DataSet ds = new DataSet();
WebClient wc = new WebClient();
//对请求地址的数据开始进行下载
byte[] bt = wc.DownloadData(xmlPath);
string source = Byte2String(bt);
//加载请求xml中的相关产品信息数据
XmlControl xd = new XmlControl(xmlPath, XmlControl.enumXmlPathType.AbsolutePath);
string boolIs_success = xd.GetXmlNodeValue("alipay/is_success");
if (boolIs_success.ToLower() == "t")
{
string tmpCode = xd.GetXmlNodeValue("alipay/response/createQrcode/qrcode");
return tmpCode;
}
this.WrtieLogSign("QRCodeCreateErro","请求获得二维码字符串失败");
return null;
}
/// <summary>
/// 进行字符串编码
/// </summary>
/// <param name="bt"></param>
/// <returns></returns>
public static string Byte2String(byte[] bt)
{
System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("UTF-8");
string str = encoding.GetString(bt);
return str;
}
//交易安全验证码zpdjh9ywq433ejjnkrbc5pys7ipkosnz
#endregion
#region 新增二维码URL地址处理 处理步骤二
/// <summary>
/// 新增二维码URL地址处理
/// </summary>
/// <param name="pro">产品实体</param>
/// <returns>发起请求的URL</returns>
public string GetRequestUrl(mt.Model.Products pro)
{
if (pro != null)
{
Dictionary<string, string> dicArray = new System.Collections.Generic.Dictionary<string, string>();
dicArray.Add(partnerKey, partnerValue);
dicArray.Add(_input_charsetKey, _input_charsetValue);
dicArray.Add(serviceMethodKey, serviceMethodValue);
dicArray.Add(methodKey, methodValue);
dicArray.Add(recevie_account_nameKey, recevie_account_nameValue);
dicArray.Add(recevie_accountKey, recevie_accountValue);
dicArray.Add(biz_nameKey, pro.ProductName);
dicArray.Add(biz_amountKey, (pro.ProductType == 4 ? pro.PriceOriginal : pro.Price).ToString());
dicArray.Add(biz_amount_listKey, (pro.ProductType == 4 ? "{优惠}|{特惠价}|{" + pro.PriceOriginal + "}" : "{零售价}|{最低零售价}|{" + pro.Price + "}"));
dicArray.Add(return_urlKey, return_urlValue);
dicArray.Add(notify_urlKey, notify_urlValue);
dicArray.Add(need_addressKey, need_addressValue);
//dicArray.Add(qrcode_styleKey,qrcode_styleValue);
//dicArray.Add(memoKey,memoValue);
//开始进行排序
//dicArray = AlipayClass.AlipayFunction.Para_filter(dicArray);
//获得参数请求地址
string urlTmpLink = AlipayClass.AlipayFunction.Create_linkstring_urlencode(dicArray);
//生成签名
sign = "sign=" + this.GetMySign(pro);
//拼接请求地址
string tmpppp = url + urlTmpLink + sign + "&" + sign_type;
this.WrtieLogSign("postUrl", tmpppp);
//将请求地址返回
return tmpppp;
}
//产生产品信息实体为空的日志
this.WrtieLogSign("ProductIsNull", "‘新增二维码URL地址处理’方法内产品实体信息为空");
return null;
}
#endregion
#region 获得签名证书 处理步骤一
public string GetMySign(mt.Model.Products pro)
{
int i;
string[] Oristr ={
partnerKey + "="+ partnerValue,
_input_charsetKey + "=" + _input_charsetValue,
serviceMethodKey + "=" + serviceMethodValue,
methodKey + "=" + methodValue,
recevie_account_nameKey + "=" + recevie_account_nameValue,
recevie_accountKey + "=" + recevie_accountValue,
biz_nameKey + "=" + pro.ProductName,
biz_amountKey + "=" + (pro.ProductType == 4 ? pro.PriceOriginal : pro.Price).ToString(),
biz_amount_listKey + "=" + (pro.ProductType == 4 ? "{优惠}|{特惠价}|{" + pro.PriceOriginal + "}" : "{零售价}|{最低零售价}|{" + pro.Price + "}"),
return_urlKey + "=" + return_urlValue,
notify_urlKey + "=" + notify_urlValue,
need_add