>  기사  >  위챗 애플릿  >  WeChat Pay 환불 단계에 대한 자세한 설명

WeChat Pay 환불 단계에 대한 자세한 설명

Y2J
Y2J원래의
2017-04-27 13:44:198456검색

우선, WeChat의 문서와 데모에 대해 불만을 토로합시다. 중요한 단계 정보가 명확하게 강조되지 않았고, .net 데모가 성공적으로 실행되지 않았습니다.

1. WeChat QR 코드를 스캔하여 로그인하세요

2. WeChat PC 결제

이 환불 기능을 통과하는 데 여러 번 시도했습니다. 다음은 WeChat 결제 환불 기능의 개발 단계를 소개합니다.

1. 인증서를 다운로드하여 시스템으로 가져옵니다.

WeChat 환불에는 인증서가 필요하지 않습니다. 공식 데모에는 인증서가 있지만, 위챗 가맹점 플랫폼의 api 보안 칼럼에서 다운받아야 하는 인증서입니다. 공식 인증서 사용 예를 워드 문서로 보면 C#이라는 문구가 있습니다. 코드에서 apiclient_cert.p12 외에도 인증서를 사용하려면 운영 체제로 가져와야 합니다. 1. 코드에 사용됩니다. 2. 운영 체제로 가져옵니다. 두 가지 모두 필수입니다. .NET 버전은 2.0 이상이어야 합니다. 이전에는 이 두 단계를 모르고 너무 많은 시간을 낭비했습니다. 따라서 인증서를 먼저 다운로드하세요.

다운로드 시 휴대폰 인증과 로그인 비밀번호가 필요합니다. 다운로드 후 인증서

apiclient_cert.p12를 찾아 두 번 클릭하여 가져올 때 비밀번호를 입력하라는 메시지가 표시됩니다. 이 비밀번호는 가맹점 ID이며 다운로드한 인증서여야 합니다. 나만의 판매자 플랫폼. 그렇지 않으면 비밀번호 오류 메시지가 나타납니다.

올바른 메시지 가져오기:

2. 코드 환불

여기에서 공식 데모의 코드를 직접 사용할 수 있습니다. 데모를 다운로드하세요

WxPayConfig에서 여러 매개변수를 수정해야 합니다:

      public const string APPID = "wxf6dd794bcexxxx";        public const string MCHID = "xxxx";        public const string KEY = "xxxxx849ba56abbe56e05xxxxx";        public const string APPSECRET = "---";        //=======【证书路径设置】===================================== 
        /* 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要)        */
        public const string SSLCERT_PATH = "/WxPayAPI/cert/apiclient_cert.p12";        public const string SSLCERT_PASSWORD = "131xxxx";
위 SSLCERT_PASSWORD는 MCHID입니다. SSLCERT_PASSWORD 오류는 지정된 네트워크 비밀번호가 올바르지 않다는 메시지를 표시합니다.

그런 다음 컨트롤러에 WeChat 주문 번호, 판매자 주문 번호, 총액을 포함한 환불 방법을 추가합니다. 번호 금액 및 환불 금액. 판매자 주문 번호와 WeChat 주문 번호 중 하나를 선택하세요. 세부 매개변수


  public ActionResult DoRefund()
        {            string result = Refund.Run("","131667780120trade_no", "1", "1");            return Content(result);
        }
Refund 클래스 실행 방법:


 /***
        * 申请退款完整业务流程逻辑
        * @param transaction_id 微信订单号(优先使用)
        * @param out_trade_no 商户订单号
        * @param total_fee 订单总金额
        * @param refund_fee 退款金额
        * @return 退款结果(xml格式)        */
        public static string Run(string transaction_id, string out_trade_no, string total_fee, string refund_fee)
        {
            Logger.Info("Refund is processing...");

            WxPayData data = new WxPayData();            if (!string.IsNullOrEmpty(transaction_id))//微信订单号存在的条件下,则已微信订单号为准            {
                data.SetValue("transaction_id", transaction_id);
            }            else//微信订单号不存在,才根据商户订单号去退款            {
                data.SetValue("out_trade_no", out_trade_no);
            }

            data.SetValue("total_fee", int.Parse(total_fee));//订单总金额
            data.SetValue("refund_fee", int.Parse(refund_fee));//退款金额
            data.SetValue("out_refund_no", out_trade_no);//随机生成商户退款单号
            data.SetValue("op_user_id", WxPayConfig.MCHID);//操作员,默认为商户号
            WxPayData result = WxPayApi.Refund(data);//提交退款申请给API,接收返回数据
            Logger.Info("Refund process complete, result : " + result.ToXml());            return result.ToPrintStr();
        }
Refund: 방법

 /**
        * 
        * 申请退款
        * @param WxPayData inputObj 提交给申请退款API的参数
        * @param int timeOut 超时时间
        * @throws WxPayException
        * @return 成功时返回接口调用结果,其他抛异常        */
        public static WxPayData Refund(WxPayData inputObj, int timeOut = 6)
        {            string url = "https://api.mch.weixin.qq.com/secapi/pay/refund";            //检测必填参数
            if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
            {                throw new WxPayException("退款申请接口中,out_trade_no、transaction_id至少填一个!");
            }            else if (!inputObj.IsSet("out_refund_no"))
            {                throw new WxPayException("退款申请接口中,缺少必填参数out_refund_no!");
            }            else if (!inputObj.IsSet("total_fee"))
            {                throw new WxPayException("退款申请接口中,缺少必填参数total_fee!");
            }            else if (!inputObj.IsSet("refund_fee"))
            {                throw new WxPayException("退款申请接口中,缺少必填参数refund_fee!");
            }            else if (!inputObj.IsSet("op_user_id"))
            {                throw new WxPayException("退款申请接口中,缺少必填参数op_user_id!");
            }

            inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
            inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
            inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", ""));//随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign());//签名
            
            string xml = inputObj.ToXml();            var start = DateTime.Now;

            Log.Debug("WxPayApi", "Refund request : " + xml);            string response = HttpService.Post(xml, url, true, timeOut);//调用HTTP通信接口提交数据到API
            Log.Debug("WxPayApi", "Refund response : " + response);            var end = DateTime.Now;            int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时            //将xml格式的结果转换为对象以返回
            WxPayData result = new WxPayData();
            result.FromXml(response);

            ReportCostTime(url, timeCost, result);//测速上报
            return result;
        }
프로덕션 환경에서 고유한 매개변수로 수정하는 것을 잊지 마세요. 매개변수가 정확하면 다음이 반환됩니다:

또한 WeChat은 즉시 환불 알림을 받습니다:

요약: 이 시점에서 환불 기능이 구현되었습니다. 실제로 매개변수와 프로세스가 정확하다면 이곳은 여전히 ​​매우 간단합니다. 위챗 규정에 따르면 1년 이내에 거래에 대한 환불을 신청할 수 있습니다. 그런데 또 다른 질문이 있습니다. 인증서를 가상 공간으로 가져오는 방법, 아니면 클라우드를 변경해야 합니까?

위 내용은 WeChat Pay 환불 단계에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.