ASP.NET Core 2.0 알 리 페 이 결제 실현 코드

머리말
마이크로소프트 가 CEO 를 바 꾼 후부 터 마이크로소프트 의 전략 방향 은 상당히 큰 변화 가 생 겼 다.더 이상 폐쇄 적 이지 않 고 많은 것 을 개 원 했 으 며 오픈 소스 커 뮤 니 티,.NET 은 크로스 플랫폼 을 실현 하고 xamarin 을 인수 하여 개발 자 에 게 무료 로 제공 하 는 등 이다.저 는.net 을 매우 좋아 합 니 다.그리고.net core 가 굴기 하 기 를 바 랍 니 다.저 는.net core 1.1 때 부터 사 용 했 습 니 다.지금까지.net core 2.0...net core 2.0 은 1.1 보다 약간 바 뀌 었 고 api 도 많이 증가 하여 사용 하기에 더욱 편리 해 졌 습 니 다.최근 에 asp.net core 도 킹 알 리 페 이 를 만 들 고 있 습 니 다.바 이 두 는 core 에 관 한 알 리 페 이 결제 관련 자 료 를 찾 지 못 해서 자체 적 으로 연 구 했 습 니 다.공식 서버 sdk 를.net standard 2.0https://github.com/stulzq/Alipay.AopSdk.Core으로 바 꾸 었 습 니 다.또한 공식 데모 에 따 르 면 asp.net core 2.0 의 PC 사이트 결제 데 모 를 성공 적 으로 만 들 었 다.앞 에는 ASP.NET Core 2.0 이 알 리 페 이 PC 사이트 로 결제 하 는 것 을 소개 했다.오늘 은 알 리 페 이 가 직접 지불 하 는 스 캔 결제 입 니 다.
스 캔 결제 안내
스 캔 결 제 는 알 리 페 이 가 직접 지불 하 는 중의 한 지불 방식 으로 직접 지불 하 는 것 은 바코드 지불,스 캔 지불,음파 지불 을 포함한다.
스 캔 결 제 는 사용자 가 알 리 페 이 지갑 의'스 캔'기능 을 열 고 스 캔 업 체 가 특정한 수금 장면 에서 QR 코드 를 보 여 주 며 결제 하 는 모델 을 말한다.이 모델 은 오프라인 매장 결제,대면 결제 등 장면 에 적용 된다.
사용 예시:
1.모 생방송 플랫폼 충전

2.모 동 영상 사이트 에서 VIP 개통

스 캔 결 제 는 전통 적 인 웹 페이지 결제 보다 편리 하고 빠르다.
업무 절차:

사용 절차:
  • 수금 원 은 업 체 의 수금 시스템 에서 알 리 페 이 주문 서 를 생 성하 고 QR 코드 를 생 성 한다.
  • 사용자 가 알 리 페 이 지갑 에 로그 인하 여 첫 페이지 의'지불-스 캔 지불'을 클릭 하거나'스 캔'을 직접 클릭 하여 스 캔 인터페이스 에 들 어 갑 니 다.
  • 사용자 가 수금 원 이 제공 한 QR 코드 를 스 캔 하고 금액 을 확인 하 며 지불 을 확인한다.
  • 사용자 가 지불 한 후에 업 체 의 수금 시스템 은 지불 에 성공 하거나 실패 한 결 과 를 얻 을 수 있다.
  • 상세 한 소 개 는 공식 문 서 를 찾 아 보 세 요.https://docs.open.alipay.com/194
    배치 하 다.
    ASP.NET Core 2.0 MVC 프로젝트 만 들 기

    새 설정 클래스 Config
    
    public class Config
    {
     //   ID,  APPID
     public static string AppId = "";
     /// <summary>
     ///     uid
     /// </summary>
     public static string Uid = "";
     //      
     public static string Gatewayurl = "https://openapi.alipaydev.com/gateway.do";
     //     ,      RSA  
     public static string PrivateKey = "";
     //      ,    :https://openhome.alipay.com/platform/keyManage.htm   APPID       。
     public static string AlipayPublicKey = "";
     //     
     public static string SignType = "RSA2";
     //     
     public static string CharSet = "UTF-8";
    }
    다음 프레젠테이션 은 모두 사용 하 는 알 리 페 이 샌 드 박스 환경 으로 알 리 페 이 샌 드 박스 환경 은 개발 자 를 도와 인터페이스 기능 개발 과 주요 기능 연결 을 하 는 보조 환경 을 말한다.샌 드 박스 환경 은 개방 플랫폼 의 일부 제품 의 주요 기능 과 주요 논 리 를 모 의 했다.개발 자가 온라인 심 사 를 응용 하기 전에 개발 자 는 자신의 수요 에 따라 샌 드 박스 환경 에서 각종 개방 인 터 페 이 스 를 파악 하고 조합 하 며 디 버 깅 하여 개발 자 들 이 온라인 심 사 를 완성 한 후에 더욱 빠 르 고온라인 디 버 깅 과 검수 작업 을 더욱 순조롭게 진행 하 다.
    계약 이나 애플 리 케 이 션 을 만 들 기 전에 통합 테스트 를 하려 면 샌 드 박스 환경 을 사용 할 수 있다.
    설정 에 대한 상세 한 설명 은 제 전 글 을 보십시오.ASP.NET Core 2.0 알 리 페 이 PC 사이트 로 결제
    ASP.NET Core 2.0 스 캔 결제 실현
    QR 코드 를 만 드 는 구성 요 소 는 QRcoder 라 고 합 니 다.이 구성 요 소 는 제3자 가 실현 하 는 System.Drawing 라 이브 러 리 를 참조 하여 직접 SDK 를 Alipay.aopsdk.F2FPay 로 github 과 nuget 으로 업데이트 되 었 습 니 다.Nuget: https://www.nuget.org/packages/Alipay.AopSdk.F2FPay/ ,github: https://github.com/stulzq/Alipay.AopSdk.Core
    새 컨트롤 러 FTFPayController
    1.QR 코드 생 성 액 션
    
    /// <summary>
    ///        
    /// </summary>
    /// <param name="orderName">    </param>
    /// <param name="orderAmount">    </param>
    /// <param name="outTradeNo">   </param>
    /// <returns></returns>
    [HttpGet]
    public IActionResult ScanCodeGen(string orderName, string orderAmount, string outTradeNo)
    {
     AlipayTradePrecreateContentBuilder builder = BuildPrecreateContent(orderName,orderAmount,outTradeNo);
     //              ,              。
     //          ,         ,         。
     AlipayF2FPrecreateResult precreateResult = _serviceClient.tradePrecreate(builder);
     //string notify_url = "http://10.5.21.14/Pay/Notify"; //           
     //AlipayF2FPrecreateResult precreateResult = serviceClient.tradePrecreate(builder, notify_url);
     //            。
     //payResponse.QrCode         
     //                  ,              。
     var bitmap = new Bitmap(Path.Combine(_hostingEnvironment.WebRootPath, "images/error.png"));
     switch (precreateResult.Status)
     {
     case ResultEnum.SUCCESS:
      bitmap.Dispose();
      bitmap=RenderQrCode(precreateResult.response.QrCode);
      //      
      //      ,            
      ParameterizedThreadStart parStart = new ParameterizedThreadStart(LoopQuery);
      Thread myThread = new Thread(parStart);
      object o = precreateResult.response.OutTradeNo;
      myThread.Start(o);
      break;
     case ResultEnum.FAILED:
      Console.WriteLine("       :"+ precreateResult.response.Body);
      break;
     case ResultEnum.UNKNOWN:
      Console.WriteLine("       :" + (precreateResult.response == null ? "       ,      " : "    ,              "));
      break;
     }
     MemoryStream ms = new MemoryStream();
     bitmap.Save(ms, ImageFormat.Png);
     byte[] bytes = ms.GetBuffer();
     return File(bytes, "image/png");
    }
    2.구조 결제 요청 데이터
    
    /// <summary>
    ///         
    /// </summary>
    /// <param name="orderName">    </param>
    /// <param name="orderAmount">    </param>
    /// <param name="outTradeNo">    </param>
    /// <returns>     </returns>
    private AlipayTradePrecreateContentBuilder BuildPrecreateContent(string orderName,string orderAmount,string outTradeNo)
    {
     //     ,           。
     if (string.IsNullOrEmpty(outTradeNo))
     {
     outTradeNo = System.DateTime.Now.ToString("yyyyMMddHHmmss") + "0000" + (new Random()).Next(1, 10000).ToString();
     }
     AlipayTradePrecreateContentBuilder builder = new AlipayTradePrecreateContentBuilder();
     //    
     builder.seller_id = Config.Uid;
     //    
     builder.out_trade_no = outTradeNo;
     //     
     builder.total_amount = orderAmount;
     //         
     //builder.discountable_amount = "";
     //          
     //builder.undiscountable_amount = "";
     //    
     builder.subject = orderName;
     //       
     builder.timeout_express = "5m";
     //    
     builder.body = "";
     //    ,      ,         
     builder.store_id = "test store id";
     //     ,      ,         
     builder.operator_id = "test";
     //        
     List<GoodsInfo> gList = new List<GoodsInfo>();
     GoodsInfo goods = new GoodsInfo();
     goods.goods_id = "goods id";
     goods.goods_name = "goods name";
     goods.price = "0.01";
     goods.quantity = "1";
     gList.Add(goods);
     builder.goods_detail = gList;
     //               
     //ExtendParams exParam = new ExtendParams();
     //exParam.sysServiceProviderId = "20880000000000";
     //builder.extendParams = exParam;
     return builder;
    }
    3.렌 더 링 QR 코드
    
    /// <summary>
    ///      
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    private Bitmap RenderQrCode(string str)
    {
     QRCodeGenerator.ECCLevel eccLevel = QRCodeGenerator.ECCLevel.L;
     using (QRCodeGenerator qrGenerator = new QRCodeGenerator())
     {
     using (QRCodeData qrCodeData = qrGenerator.CreateQrCode(str, eccLevel))
     {
      using (QRCode qrCode = new QRCode(qrCodeData))
      {
      Bitmap bp= qrCode.GetGraphic(20, Color.Black, Color.White,
       new Bitmap(Path.Combine(_hostingEnvironment.WebRootPath, "images/alipay.png")), 15);
      return bp;
      }
     }
     }
    }
    4.폴 링 결제 결과
    
    /// <summary>
    ///       
    /// </summary>
    /// <param name="o">   </param>
    public void LoopQuery(object o)
    {
     AlipayF2FQueryResult queryResult = new AlipayF2FQueryResult();
     int count = 100;
     int interval = 10000;
     string outTradeNo = o.ToString();
     for (int i = 1; i <= count; i++)
     {
     Thread.Sleep(interval);
     queryResult = _serviceClient.tradeQuery(outTradeNo);
     if (queryResult?.Status == ResultEnum.SUCCESS)
     {
      DoSuccessProcess(queryResult);
      return;
     }
     }
     DoFailedProcess(queryResult);
    }
    /// <summary>
    ///            
    /// </summary>
    private void DoSuccessProcess(AlipayF2FQueryResult queryResult)
    {
     //    ,       
     Console.WriteLine("      :      " + queryResult.response.OutTradeNo);
    }
    /// <summary>
    ///            
    /// </summary>
    private void DoFailedProcess(AlipayF2FQueryResult queryResult)
    {
     //    ,       
     Console.WriteLine("      :      " + queryResult.response.OutTradeNo);
    }
    상기 코드 는 프 리 젠 테 이 션 일 뿐 실제 적 으로 사용 할 때 자신의 수요 에 따라 수정 하 십시오.예 를 들 어 폴 링 은 모든 주문 에 하나의 스 레 드 를 여 는 것 이 아니 라 하나의 백 스테이지 작업 스 레 드 로 문의 해 야 합 니 다.주의 하 십시오.
    데모 데모
    1.QR 코드 생 성
    QR 코드 를 생 성 하려 면 반드시 업 체 의 주문 번호,주문 금액,주문 명칭 세 개의 인 자 를 제공 해 야 한다.그렇지 않 으 면 오류 가 발생 할 수 있다.

    2.스 캔 결제
    핸드폰 알 리 페 이 를 켜 고 스 캔 을 눌 러 QR 코드 를 스 캔 하여 지불 을 완성 합 니 다.
    샌 드 박스 환경 을 사용한다 면 샌 드 박스 버 전 알 리 페 이 를 다운로드 해 야 합 니 다.정식 버 전 알 리 페 이 를 사용 하여 샌 드 박스 환경 api 에서 생 성 된 QR 코드 를 스 캔 하면 QR 코드 가 효력 을 잃 고 샌 드 박스 환경 배경 에서 다운로드 할 수 있 습 니 다.샌 드 박스 환경 은 반드시 샌 드 박스 환경 계 정 을 사용 해 야 한다.
    (1)스 캔 후:

    (2)지불 성공:


    3.지급 결과
    폴 링 을 통 해 얻 은 결과:


    주소 집합
    앞의 글:ASP.NET Core 2.0 알 리 페 이 PC 사이트 로 결제
    직접 지불 공식 문서:https://docs.open.alipay.com/194
    Nuget 구성 요소:
    QRcoder(2 차원 코드 생 성):https://www.nuget.org/packages/QRCoder/
    Alipay.aopsdk.F2FPay(직접 SDK 지불):https://www.nuget.org/packages/Alipay.AopSdk.F2FPay/
    알 리 페 이 가 서비스 측 SDK 에 직접 지불:https://github.com/stulzq/Alipay.AopSdk.Core
    본문 데모:https://github.com/stulzq/Alipay.Demo.PCPayment
    총결산
    위 에서 말 한 것 은 편집장 님 께 서 소개 해 주신 ASP.NET Core 2.0 알 리 페 이 결제 의 실현 코드 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기