支付宝回调接口

参考 https://www.cnblogs.com/zxtceq/p/6524639.html

https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.hKuHU3&treeId=54&articleId=106370&docType=1#s7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//实例化客户端
AlipayClient alipayClient = new  DefaultAlipayClient( "https://openapi.alipay.com/gateway.do" , APP_ID, APP_PRIVATE_KEY, "json" , CHARSET, ALIPAY_PUBLIC_KEY, "RSA2" );
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new  AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new  AlipayTradeAppPayModel();
model.setBody( "我是测试数据" );
model.setSubject( "App支付测试Java" );
model.setOutTradeNo(outtradeno);
model.setTimeoutExpress( "30m" );
model.setTotalAmount( "0.01" );
model.setProductCode( "QUICK_MSECURITY_PAY" );
request.setBizModel(model);
request.setNotifyUrl( "商户外网可以访问的异步地址" );
try  {
         //这里和普通的接口调用不同,使用的是sdkExecute
         AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
         System.out.println(response.getBody()); //就是orderString 可以直接给客户端请求,无需再做处理。
     } catch  (AlipayApiException e) {
         e.printStackTrace();
}

JAVA服务端SDK生成APP支付订单信息示例

JAVA服务端验证异步通知信息参数示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//获取支付宝POST过来反馈信息
Map<String,String> params = new  HashMap<String,String>();
Map requestParams = request.getParameterMap();
for  (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
     String name = (String) iter.next();
     String[] values = (String[]) requestParams.get(name);
     String valueStr = "" ;
     for  ( int  i = 0 ; i < values.length; i++) {
         valueStr = (i == values.length - 1 ) ? valueStr + values[i]
                     : valueStr + values[i] + "," ;
   }
   //乱码解决,这段代码在出现乱码时使用。
   //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
   params.put(name, valueStr);
  }
//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
boolean  flag = AlipaySignature.rsaCheckV1(params, alipaypublicKey, charset, "RSA2" )

PHP服务端SDK生成APP支付订单信息示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$aop = new  AopClient;
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do" ;
$aop->appId = "app_id" ;
$aop->rsaPrivateKey = '请填写开发者私钥去头去尾去回车,一行字符串'  ;
$aop->format = "json" ;
$aop->charset = "UTF-8" ;
$aop->signType = "RSA2" ;
$aop->alipayrsaPublicKey = '请填写支付宝公钥,一行字符串' ;
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
$request = new  AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数
$bizcontent = "{\"body\":\"我是测试数据\","
                 . "\"subject\": \"App支付测试\","
                 . "\"out_trade_no\": \"20170125test01\","
                 . "\"timeout_express\": \"30m\","
                 . "\"total_amount\": \"0.01\","
                 . "\"product_code\":\"QUICK_MSECURITY_PAY\""
                 . "}" ;
$request->setNotifyUrl( "商户外网可以访问的异步地址" );
$request->setBizContent($bizcontent);
//这里和普通的接口调用不同,使用的是sdkExecute
$response = $aop->sdkExecute($request);
//htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
echo htmlspecialchars($response); //就是orderString 可以直接给客户端请求,无需再做处理。

PHP服务端验证异步通知信息参数示例

1
2
3
$aop = new  AopClient;
$aop->alipayrsaPublicKey = '请填写支付宝公钥,一行字符串' ;
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA" );

.NET服务端SDK生成APP支付订单信息示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
IAopClient client = new  DefaultAopClient( "https://openapi.alipay.com/gateway.do" , APPID, APP_PRIVATE_KEY, "json" , "1.0" , "RSA2" , ALIPAY_PUBLIC_KEY, CHARSET, false );
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称如:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new  AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new  AlipayTradeAppPayModel();
model.Body = "我是测试数据" ;
model.Subject = "App支付测试DoNet" ;
model.TotalAmount = "0.01" ;
model.ProductCode = "QUICK_MSECURITY_PAY" ;
model.OutTradeNo = "20170216test01" ;
model.TimeoutExpress = "30m" ;
request.SetBizModel(model);
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = client.SdkExecute(request);
//HttpUtility.HtmlEncode是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
Response.Write(HttpUtility.HtmlEncode(response.Body));
//页面输出的response.Body就是orderString 可以直接给客户端请求,无需再做处理。

.NET服务端验证异步通知信息参数示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/// 获取支付宝POST过来通知消息,并以“参数名=参数值”的形式组成数组
/// request回来的信息组成的数组
public  Dictionary<string, string> GetRequestPost()
{
     int  i = 0 ;
     IDictionary<string, string> sArray = new  IDictionary<string, string>();
     NameValueCollection coll;
     //Load Form variables into NameValueCollection variable.
     coll = Request.Form;
 
     // Get names of all forms into a string array.
     String[] requestItem = coll.AllKeys;
 
     for  (i = 0 ; i < requestItem.Length; i++)
     {
         sArray.Add(requestItem[i], Request.Form[requestItem[i]]);
      }
 
      return  sArray;
}
//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
//bool RSACheckV1(IDictionary<string, string> parameters, string alipaypublicKey, string charset, string signType, bool keyFromFile)
bool flag = AlipaySignature.RSACheckV1(GetRequestPost(), alipaypublicKey, charset, "RSA2" , false );


以下是一个简单的Java支付宝回调接口案例: ```java import com.alipay.api.AlipayApiException; import com.alipay.api.internal.util.AlipaySignature; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @Controller public class AlipayController { // 支付宝异步通知接口 @RequestMapping("/alipay/notify") public void notify(HttpServletRequest request) throws AlipayApiException { // 获取支付宝POST过来反馈信息 Map<String,String> params = new HashMap<>(); Map<String,String[]> requestParams = request.getParameterMap(); for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = iter.next(); String[] values = requestParams.get(name); StringBuilder valueStr = new StringBuilder(); for (int i = 0; i < values.length; i++) { valueStr.append((i == values.length - 1) ? values[i]: values[i] + ","); } // 乱码解决,这段代码在出现乱码时使用 // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name, valueStr.toString()); } // 调用SDK验证签名 boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.publicKey, AlipayConfig.charset, AlipayConfig.signType); if(signVerified) { // TODO: 处理业务逻辑 } else { // TODO: 验签失败则记录异常日志,并在response中返回failure. } } } ``` 在上面的代码中,我们通过Spring MVC框架提供的`@Controller`注解标记该类作为一个控制器。然后,我们定义了一个处理支付宝异步通知的方法`notify()`,并将该方法标记为处理`/alipay/notify`请求的方法。 在方法中,我们首先获取支付宝POST过来的反馈信息,并将其转化为一个`Map`对象。接着,我们通过支付宝提供的SDK来验证签名,如果签名验证成功,则说明该回调是真实有效的,可以进行业务逻辑处理。否则,我们需要记录异常日志,并在response中返回`failure`。 需要注意的是,上面的代码中的`AlipayConfig.publicKey`和`AlipayConfig.charset`等参数需要根据你自己的支付宝账号和应用进行相应的配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值