实现流程:

后台创建订单>调用支付宝生成支付宝参数 >拼接组合头条需要参数>返回前端调用requestPayment>支付成功 

1.后台业务处理,生成订单号和金额

2.调用支付宝app支付接口 https://docs.open.alipay.com/204/105465/

支付宝sdk下载地址 https://docs.open.alipay.com/54/106370/

c#代码示例:

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);
request.SetNotifyUrl("外网商户可以访问的异步地址");
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = client.SdkExecute(request);
//HttpUtility.HtmlEncode是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
Response.Write(HttpUtility.HtmlEncode(response.Body));
//页面输出的response.Body就是orderString 可以直接给客户端请求,无需再做处理。

3.拼接组合头条需要参数

采用排序的Dictionary的好处是方便对数据包进行签名,不用再签名之前再做一次排序
                                Dictionary<string, string> data = new Dictionary<string, string>();
                                data["app_id"] = app_id;
                                data["sign_type"] = "MD5";
                                data["timestamp"] = timestamp;
                                data["trade_no"] = 订单号;
                                data["merchant_id"] = merchant_id;
                                data["uid"] = uid;
                                data["total_amount"] = 金额;
                                data["params"] = "{\"url\":\"" + response.Body + "\"}";
                                //排序
                                string PrepareSign = getParamSrc(data, false);
                                //md5签名
                                data["sign"] = MakeSign(PrepareSign, ttSecret);
                                data["method"] = "tp.trade.confirm";
                                data["pay_channel"] = "ALIPAY_NO_SIGN";
                                data["pay_type"] = "ALIPAY_APP";
                                data["risk_info"] = "{\"ip\":" + 获取Ip地址+ "}";
                  //data返回给前端调用

4.前端调用   http://developer.toutiao.com/docs/open/requestPayment.html

requestPayment  发起头条支付的方法,根据后端返回参数调用支付宝支付

5.用户支付完成,回调可以加支付处理记得去支付宝验证支付状态,支付宝回调记得处理

注意事项:

ALIN10146 
1、请求appid应用未上线,联调时请确保自己的应用是上线状态; 
2、签约权限问题,请确保自己已经签约并审核通过; 
3、签名类型使用错,2018年1月5号之后创建的应用类型请使用RSA2,sign_type=RSA2; 
4、请求参数问题,请检查自己的请求参数格式是否按照文档要求传输的。

ALI38173

报错描述:报错ALI 38173 
报错原因:

1、请求参数问题 
2、密钥问题 
3、乱码问题 
4、没有签约该接口 
解决方案: 
1、检查请求参数中是否多了 “amp;”,将其去掉重新测试; 
2、检查参数是否与文档不符之处,是否有传自定义参数,或者必传参数未传; 
3.检查密钥格式是否正确:java使用pkcs8格式密钥,非java语言,必须使用pkcs1格式密钥; 
4、检查公私钥是否匹配; 
5、编码格式是否有误,是否有乱码; 
6、检查是否签约,并且添加功能; 

调起支付宝过程中的相应错误可以去支付宝找解决方案