当前位置: 移动技术网 > IT编程>开发语言>.net > .NET C#支付宝条码支付接口详解

.NET C#支付宝条码支付接口详解

2019年05月28日  | 移动技术网IT编程  | 我要评论

王瑞儿夜火全套种子,梅县二手房出售,猥琐猫qq表情包下载

支付宝条码支付接口使用,供大家参考,具体内容如下

应用场景实例

收银员使用扫码设备读取用户支付宝钱包“付款码”后,将二维码或条码信息通过本接口上送至支付宝发起支付。

sdk下载

支付宝提供3种开发语言的sdk,选择自己的开发语言下载,项目中会有很多示例。本文选择.net2010版本。

将sdk项目中的aopsdk.dll文件引用到自己的项目中。

支付类代码

简略版 数据需自行获取 

public class toalipaybll
 {
 private static readonly toalipaydal dal = new toalipaydal();

 static iaopclient client = null;


 public static bool checkvalidationresult(object sender, x509certificate certificate, x509chain chain, sslpolicyerrors errors)
 {
  //直接确认,否则打不开 
  return true;
 }


 /// <summary>
 /// 支付宝条码支付
 /// </summary>
 /// <param name="osaleh_osalehid"></param>
 /// <param name="txtpaymentcode">付款码</param>
 /// <param name="ordertype"></param>
 /// <param name="user"></param>
 /// <returns></returns>
 public static responsedto getalipayrequestexecute(string osaleh_osalehid, string str_osaled_osaledid, string txtpaymentcode, string ordertype, usersentity user)
 {
  responsedto resp = new responsedto();
  try
  {

   //请根据实际请求需要biz_content参数
   #region biz_content参数

   orderlistmodel orderlist = new orderlistmodel();
   list<productdetailmodel> goodslist = new list<productdetailmodel>();
   stringbuilder param = new stringbuilder();

   //商户订单号
   string out_trade_no = system.datetime.now.tostring("yyyymmddhhmmss") + "0000" + osaleh_osalehid; //商户唯一订单号
   orderlist.out_trade_no = out_trade_no;
   //支付场景
   orderlist.scene = "bar_code";
   //支付授权码
   orderlist.auth_code = txtpaymentcode;
   //卖家支付宝用户id
   orderlist.seller_id = "";
   //订单总金额
   //orderlist.total_amount = osaled_amount.tostring("#0.00");


   //商品明细
   string goodsname = string.empty;
   bool isflag = true;

   foreach (var item in osaledlist)
   {

   productdetailmodel detailmodel = new productdetailmodel();
   detailmodel.goods_id = "0";
   detailmodel.goods_name = "default";
   detailmodel.quantity = ((int)item.osaled_qty).tostring();
   detailmodel.price = item.osaled_amount.tostring("#0.00");
   detailmodel.goods_category = "";
   goodslist.add(detailmodel);
   }
   orderlist.goods_detail = goodslist;

   //订单标题
   orderlist.subject = goodsname;
   //订单描述
   orderlist.body = "";
   //商户操作员编号
   orderlist.operator_id = user.user_employeeno;
   //商户门店编号
   orderlist.store_id = "";
   //支付宝店铺编号
   orderlist.alipay_store_id = "";
   //机具终端编号
   orderlist.terminal_id = "";
   //支付超时时间
   string expire_time = system.datetime.now.addminutes(30).tostring("yyyy-mm-dd hh:mm:ss");
   orderlist.time_expire = expire_time;

   #endregion biz_content参数

   string biz_content = formattojson.serialize(orderlist);

   storeentity store = storebll.getstoreentitybystore_code(user.user_company);
   //开发者的appid
   string alipay_appid = "";
   confighelper.alipay_merchant_private_key = string.format(confighelper.alipay_merchant_private_key, store.area_code);
   confighelper.alipay_public_key = string.format(confighelper.alipay_public_key, store.area_code);


   servicepointmanager.servercertificatevalidationcallback = new system.net.security.remotecertificatevalidationcallback(checkvalidationresult);

   client = new defaultaopclient(confighelper.alipay_serverurl, alipay_appid, confighelper.alipay_merchant_private_key, "json", confighelper.alipay_version,
       confighelper.alipay_sign_type, confighelper.alipay_public_key, confighelper.alipay_charset);

   alipaytradepayresponse payresponse = pay(biz_content);

   string result = payresponse.body;

   if (payresponse != null)
   {

   switch (payresponse.code)
   {
    case toalipayresultcode.success://支付成功
    //业务处理
    resp.message = "支付成功";
    resp.status = true;

    break;
    case toalipayresultcode.inrrocess://业务处理中

    stringbuilder sb1 = new stringbuilder();
    sb1.append("{\"out_trade_no\":\"" + out_trade_no + "\"}");

    //调用查询接口需要进行轮询订单支付结果
    alipaytradequeryresponse queryresponse = loopquery(sb1.tostring()); //用订单号trade_no进行轮询也是可以的。
    if (queryresponse != null)
    {
     if (queryresponse.code == toalipayresultcode.success)
     {
     //支付成功或交易结束
     if (queryresponse.tradestatus == "trade_success" || queryresponse.tradestatus == "trade_finished")
     {
      //业务处理

      resp.message = "支付成功";
      resp.status = true;
     }
     else
     {
      //支付超时
      resp.message = "支付超时";
      resp.status = false;
     }
     }
     else
     {
     //支付失败
     resp.message = "支付失败,错误代码:" + queryresponse.subcode + "。描述:" + queryresponse.submsg;
     resp.status = false;
     }
    }

    break;
    case toalipayresultcode.fail:
    stringbuilder sb2 = new stringbuilder();
    sb2.append("{\"out_trade_no\":\"" + out_trade_no + "\"}");
    alipaytradecancelresponse cancelresponse = cancel(sb2.tostring());

    if (!string.isnullorempty(cancelresponse.subcode))
    {
     resp.message = "支付失败,错误代码:" + cancelresponse.subcode + "。描述:" + cancelresponse.submsg;
    }
    else
    {
     resp.message = "支付失败,错误代码:" + payresponse.subcode + "。描述:" + payresponse.submsg;
    }
    //支付失败
    resp.status = false;

    break;
   }
   }
  }
  else
  {
   resp.message = "操作失败,未查询到订单信息,请联系管理员!";
   resp.status = false;
  }
  }
  catch (exception ex)
  {
  exceptionlog.toalipaylog(ex.message);//记录日志
  resp.message = ex.message;
  resp.status = false;
  }
  return resp;
 }

 private static alipaytradepayresponse pay(string biz_content)
 {
  alipaytradepayrequest payrequst = new alipaytradepayrequest();
  payrequst.bizcontent = biz_content;


  alipaytradepayresponse payresponse = client.execute(payrequst);
  return payresponse;
 }

 private static alipaytradecancelresponse cancel(string biz_content)
 {
  alipaytradecancelrequest cancelrequest = new alipaytradecancelrequest();
  cancelrequest.bizcontent = biz_content;
  alipaytradecancelresponse cancelresponse = client.execute(cancelrequest);


  if (null != cancelresponse)
  {
  if (cancelresponse.code == toalipayresultcode.fail && cancelresponse.retryflag == "y")
  {
   // 新开一个线程重试撤销
   parameterizedthreadstart parstart = new parameterizedthreadstart(cancelorderretry);
   thread mythread = new thread(parstart);
   object o = biz_content;
   mythread.start(o);
  }
  }

  return cancelresponse;

 }


 private static void cancelorderretry(object o)
 {
  int retrycount = 10;

  for (int i = 0; i < retrycount; ++i)
  {

  thread.sleep(5000);
  alipaytradecancelrequest cancelrequest = new alipaytradecancelrequest();
  cancelrequest.bizcontent = o.tostring();

  alipaytradecancelresponse cancelresponse = client.execute(cancelrequest);

  if (null != cancelresponse)
  {
   if (cancelresponse.code == toalipayresultcode.fail)
   {
   if (cancelresponse.retryflag == "n")
   {
    break;
   }
   }
   if ((cancelresponse.code == toalipayresultcode.success))
   {
   break;
   }
  }

  }
 }

 private static alipaytradequeryresponse loopquery(string biz_content)
 {

  alipaytradequeryrequest payrequst = new alipaytradequeryrequest();
  payrequst.bizcontent = biz_content;

  dictionary<string, string> paramsdict = (dictionary<string, string>)payrequst.getparameters();
  alipaytradequeryresponse payresponse = null;

  for (int i = 1; i <= 6; i++)
  {
  thread.sleep(5000);

  payresponse = client.execute(payrequst);
  if (string.compare(payresponse.code, toalipayresultcode.success, false) == 0)
  {
   if (payresponse.tradestatus == "trade_finished"
   || payresponse.tradestatus == "trade_success"
   || payresponse.tradestatus == "trade_closed")
   // return payresponse;
   break;
  }

  }

  //未付款交易超时或等待超时。
  if (payresponse.code == toalipayresultcode.fail || payresponse.tradestatus == "trade_closed" || payresponse.tradestatus == "wait_buyer_pay")
  {
  //撤销订单
  stringbuilder param = new stringbuilder();
  param.append("{\"out_trade_no\":\"" + payresponse.outtradeno + "\"}");
  biz_content = param.tostring();
  cancel(biz_content);
  }

  return payresponse;

 }
}

前端效果图

扫描枪自动提交,input输入框内“onkeyup=()”方法即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网