天天看點

app支付內建開發者指南一、文檔位址二、開發前準備工作三、接口內建代碼示例四、用戶端內建五、注意事項六、顯示效果

鑒于很多對接app支付的童鞋經常出現app支付系統繁忙,ali40247,訂單資訊異常在等等的錯誤,其實那些錯誤都是大同小異的,無非就是沒權限,密鑰不對,參數傳值錯誤,請求資訊拼接有問題等等,是以這邊寫app支付開發指南分享帖,希望能夠幫到大家!!!

一、文檔位址

app支付官方文檔位址:[url]https://docs.open.alipay.com/204[/url] 

二、開發前準備工作

1、簽約:[url]https://openclub.alipay.com/read.php?tid=276&fid=72[/url]

2、建立應用:[url]https://openclub.alipay.com/read.php?tid=1606&fid=72[/url]

3、生成密鑰:[url]https://openclub.alipay.com/read.php?tid=1833&fid=69[/url]

4、下載下傳服務端sdk:[url]https://docs.open.alipay.com/54/106370/[/url]

5、下載下傳用戶端demo:[url]https://docs.open.alipay.com/54/104509/[/url]

注意事項:1、支援沙箱測試;2、需簽約并需要添加功能;3、不支援第三方調用。

檢查調用appid的應用功能清單中是否添加“app支付”。

app支付內建開發者指南一、文檔位址二、開發前準備工作三、接口內建代碼示例四、用戶端內建五、注意事項六、顯示效果

注意:還有一個比較坑的點就是如果你添加app支付功能的時間早于你簽約的時間,也是需要先将功能包删除後再重新添加才能正常使用的,否則也會報錯

三、接口內建代碼示例

1、參數說明

(1)out_trade_no:商戶訂單号,由商戶自定義設定;

(2)subject:商品标題;

(3)product_code:固定産品碼值:QUICK_MSECURITY_PAY;

(4)total_amount:交易訂單金額,精确到小數點後2位,最小設定為0.01;

2、JAVA版請求示例

public static void main(String[] args) throws AlipayApiException, UnsupportedEncodingException {		//獲得初始化的AlipayClient	    AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key,AlipayConfig.sign_type);	    AlipayTradeAppPayRequest alipayRequest=new AlipayTradeAppPayRequest();	    //設定同步回調位址				alipayRequest.setReturnUrl(AlipayConfig.return_url);		//設定異步回調位址		alipayRequest.setNotifyUrl(AlipayConfig.notify_url);		//公共回傳參數,用于傳值自定義資訊,必須encode,不能帶單雙引号之類的之定義參數,否則會報錯		String passback_params	 = "公用回傳參數測試123#34!";		String passback_params2 =URLEncoder.encode(passback_params,"UTF-8");		//		alipayRequest.setBizContent("{\"out_trade_no\":\"201809251015343222843\"," //				+ "\"total_amount\":\"0.01\"," //				+ "\"subject\":\"app支付測試\"," //				+ "\"passback_params\":\""+ passback_params2 +"\"," //				+ "\"product_code\":\"QUICK_MSECURITY_PAY\"}");		 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();		 model.setOutTradeNo("20181012015343222843");		 model.setTotalAmount("0.01");		 model.setSubject("app支付subject測試");		 model.setPassbackParams(passback_params2);		 model.setProductCode("QUICK_MSECURITY_PAY");		 alipayRequest.setBizModel(model);		AlipayTradeAppPayResponse response = alipayClient.sdkExecute(alipayRequest);				if(response.isSuccess()){			System.out.println("調用成功");		} else {			System.out.println("調用失敗");		}		System.out.println(response.getBody());	}           

傳回資訊

alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=2016101800718925&biz_content=%7B%22out_trade_no%22%3A%22201809251015343222843%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%22app%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF%95%22%2C%22passback_params%22%3A%22%25E5%2585%25AC%25E7%2594%25A8%25E5%259B%259E%25E4%25BC%25A0%25E5%258F%2582%25E6%2595%25B0%25E6%25B5%258B%25E8%25AF%259512334%25EF%25BC%2581%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%7D&charset=utf-8&format=JSON&method=alipay.trade.app.pay&notify_url=http%3A%2F%2F106.14.187.178%2Fopendevtools%2Fnotify%2Fdo%2Fa9bed896-0fc0-4b05-ba55-6a2550cacd36&return_url=https%3A%2F%2Fwww.baidu.com%2F&sign=qiOEfMcQoObzuPdZNkMOzavHfJLskTUWJxb08YObj8D0SexDStOw%2BHEwOs7x1hGih8Zs3rsT%2BA3aYVnmwp0FTnTYHx2cTbvz1tkNTzoguOG%2BdNR4b5dsJ%2BvUU4UbHV2KDOxg%2FASUcjcbhqitYraWjBgL02QWgTa%2FpA7dpZnxaOKyksZ1tvp7dR3zYvfDdVnfo3vpXlJxc8QTXsYvZdpODvmKG9odw%2FTsP2fZdt3Up7aiq7Ae8rby%2FNg%2BIMcGJjH%2F5MnUC99%2FU9%2Bjwt%2Biqt7jwU4PVfGimDY6ifIYs3PosGwfwrMTSZkI8AzdcsmwHRcqGJJNzlzegl9jQHw9mBzSAw%3D%3D&sign_type=RSA2&timestamp=2018-09-25+13%3A09%3A52&version=1.0           

注意:php跟.net 要使用pkcs1的私鑰

3、PHP版請求示例

<?phprequire_once 'AopSdk.php';$aop = new AopClient ();$aop->appId = '填寫您的appid';$aop->rsaPrivateKey = '填寫您的私鑰';$aop->alipayrsaPublicKey='填寫您的支付寶公鑰';$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';$aop->apiVersion = '1.0';$aop->postCharset='utf-8';$aop->format='json';$aop->signType = 'RSA2';//生成随機訂單号$date=date("YmdHis");$arr=range(1000,9999);shuffle($arr);$request = new AlipayTradeAppPayRequest();//異步位址傳值方式$request->setNotifyUrl("https://www.alipay.com");$request->setBizContent("{\"out_trade_no\":\"".$date.$arr[0]."\",\"total_amount\":0.01,\"product_code\":\"QUICK_MSECURITY_PAY\",\"subject\":\"app測試\"}");$result = $aop->sdkExecute($request);print_r(htmlspecialchars($result));?>           

傳回結果

alipay_sdk=alipay-sdk-php-20161101&app_id=2017121300675523&biz_content=%7B%22out_trade_no%22%3A%22201809250359474566%22%2C%22total_amount%22%3A0.01%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22subject%22%3A%22app%E6%B5%8B%E8%AF%95%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=https%3A%2F%2Fwww.alipay.com&sign_type=RSA2&timestamp=2018-09-25+03%3A59%3A47&version=1.0&sign=ueXycfafCqB2Uc31pyAjiRF4rDW5nn8MCT8Hy0lB8jukbgLyhn76hVKuw7mOgqGQwxVdYWq7Rm2A%2FpXBPwjWBcifuowtoiyB2hhw2FHR6yje8xKNNe3jGfVPrMxyze0HmOD3BQwzz53U4VcpQACRHbAZU8ZOT3U8MzJnJqMCsdD8IGZU1b8meig1gn6DANvMfmKuubUNod5DFMJlEpHZENMzSw5F546TW%2Bz6VhyxC6Hzp0%2FFd%2BF8zHK9THbyK6sR4EJQfvm7hmdOR%2FRKaS3RxHbBZ%2BZha%2FFjwA0hFYXTI6D7xB5cGiVtQCfrDmPZaQvwY7jdNDuav1dHj1is5nsjWw%3D%3D           

4、.NET版請求示例

static void Main(string[] args)        {             IAopClient client = new DefaultAopClient("https://openapi.alipaydev.com/gateway.do", Com.Alipay.Config.appId, Com.Alipay.Config.merchant_private_key, "json", "1.0", "RSA2", Com.Alipay.Config.alipay_public_key, "GBK", false);             AlipayTradeAppPayRequest alipayRequest = new AlipayTradeAppPayRequest();//建立API對應的request             AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();             model.OutTradeNo = "201809251315181234561223434123";             model.Subject = "手機網站支付測試";             model.TotalAmount = "0.01";             model.ProductCode = "QUICK_MSECURITY_PAY";             alipayRequest.SetBizModel(model);             AlipayTradeAppPayResponse response = client.SdkExecute(alipayRequest);             Console.WriteLine("接口調用傳回資訊:" + response.Body);        }           

.net傳回結果

接口調用傳回資訊:app_id=2016101800718925&biz_content=%7b%22out_trade_no%22%3a%22201809251315181234561223434123%22%2c%22product_code%22%3a%22QUICK_MSECURITY_PAY%22%2c%22subject%22%3a%22%ca%d6%bb%fa%cd%f8%d5%be%d6%a7%b8%b6%b2%e2%ca%d4%22%2c%22total_amount%22%3a%220.01%22%7d&charset=GBK&format=json&method=alipay.trade.app.pay&sign_type=RSA2&timestamp=2018-09-25+12%3a06%3a52&version=1.0&sign=HIatgoFqis%2bgwCPw%2bnDGQhbBR3i7X4P%2fnagTXO6DkLVLi7kPjx233skwjtpwnFzmSHIp84%2foaBpUHkPXMAkX%2b7rBJdYxW5FLqNXz9DYZh5NBtzmoNfpD%2baPUaIO%2fKylESh3r0Twgz4BQcmdJ6HkS4Erq5blTFHNK8OUB9ISI9absu30fS5teYBkkBkM2QDaMIpIxAzjvIBPZzUZU7%2fgXIq%2f3A9B5f7E70QH1hycktjjk8RgC%2fsTjMWx%2f8q2WN5T0fj9053WM%2b34CFhzXK9kNkI2Hf2Sd6e%2fBlToS%2bYt1%2bByvtiYifrWIxc1ldBbWtH5NqcXpgYzwk1JHjieSeTqn%2fw%3d%3d           

如果不是使用sdk簽名方式,使用的是自己的簽名方法,參數排序請嚴格按照我們文檔的排查方式,不要随意排序拼接,詳情請參考文檔:[url]https://docs.open.alipay.com/204/105465/[/url]

四、用戶端內建

android版用戶端內建方案:

[url]https://docs.open.alipay.com/204/105296[/url]

IOS版用戶端內建方案:

[url]https://docs.open.alipay.com/204/105295[/url]

生成請求示例之後,我們再将示例中的資訊傳值到用戶端,無需做任何處理,直接傳值

//将服務端生成的請求資訊不做任何處理直接傳入用戶端,調用收銀台final String orderInfo ="alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=2014100900013222&biz_content=%7B%22out_trade_no%22%3A%2220180823101534222843%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%22app%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF%95%22%2C%22passback_params%22%3A%22%25E5%2585%25AC%25E7%2594%25A8%25E5%259B%259E%25E4%25BC%25A0%25E5%258F%2582%25E6%2595%25B0%25E6%25B5%258B%25E8%25AF%2595123%252334%25EF%25BC%2581%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%7D&charset=utf-8&format=JSON&method=alipay.trade.app.pay&notify_url=http%3A%2F%2F106.14.187.178%2Fopendevtools%2Fnotify%2Fdo%2Fa9bed896-0fc0-4b05-ba55-6a2550cacd36&return_url=https%3A%2F%2Fwww.baidu.com%2F&sign=RyGvj%2FyEFCBDNbFjMKJGToD13kSO12LzEqd%2FXTKiMADlILQwvWM7ec4gIT6tf6EcnTry%2Fe325EHfFIjUjQSqpOmqftssyZF0jQpMX8Nd7Km%2F%2FE4H9BEP6QgdPE7lgPItE5mwFYmkUVKJmO6Bf1Zodn3sQcEQp%2FanTmK0tivX9ZpFup%2BLJKexIOgrGb3baAfWJdp1KX4CTPB3JlUHG2FuAFdblsjjZvzI8mv6A6PBjt72C%2B2vTAAMFhakAvY7j6ql23dVMxlKCA19ar11cBrEY6hH5uxhVhAb%2BcCzBm07RqiqXwMFBXVnUpTcE%2FIcG1Gx4zPE9WW3BxmCCI2RavZ0yQ%3D%3D&sign_type=RSA2&timestamp=2018-09-25+11%3A48%3A38&version=1.0";					Runnable payRunnable = new Runnable() {			@Override			public void run() {				PayTask alipay = new PayTask(PayDemoActivity.this);				Map result = alipay.payV2(orderInfo, true);				Log.e("msp", result.toString());								Message msg = new Message();				msg.what = SDK_PAY_FLAG;				msg.obj = result;				mHandler.sendMessage(msg);			}		};		Thread payThread = new Thread(payRunnable);		payThread.start();           

五、注意事項

1、app支付內建流程

app支付需服務端與用戶端內建調用,服務端生成請求參數字元串,将該請求參數字元串交由用戶端發起請求進行支付。

注:響應參數是在用戶端發起請求調用後傳回,不是在服務端調用接口直接傳回。

2、app支付成功後回調商戶頁面

android版app支付支援支付後自動回調;

IOS版app支付無法自動回調,需點選完成按鈕,手動切換。

注:IOS版需配置scheme,使調用接口傳回資訊傳回商戶app。

3、沙箱用戶端內建方式

沙箱賬号檢視位址:[url]https://openhome.alipay.com/platform/appDaily.htm?tab=info[/url]

沙箱環境測試隻支援安卓版,使用官方sdk,需要在支付接口前調用如下方法;

詳情請參考文檔:[url]https://docs.open.alipay.com/204/106450/[/url]

EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);           

4、用戶端調試工具

測試服務端生成的請求參數是否正常,可使用用戶端調試工具。

用戶端調試工具:[url]https://openclub.alipay.com/read.php?tid=7695&fid=60[/url]

5、輔助接口

alipay.trade.query(統一收單線下交易查詢)內建流程:[url]https://openclub.alipay.com/read.php?tid=13842&fid=56[/url]

alipay.trade.refund(統一收單交易退款接口) 內建流程:[url]https://openclub.alipay.com/read.php?tid=13853&fid=56[/url]

alipay.trade.fastpay.refund.query(統一收單交易退款查詢) :[url]https://openclub.alipay.com/read.php?tid=13962&fid=56[/url]

alipay.trade.close(統收單交易關閉接口)內建流程:[url]https://openclub.alipay.com/read.php?tid=13963&fid=56[/url]

alipay.data.dataservice.bill.downloadurl.query(查詢對賬單下載下傳位址):[url]https://openclub.alipay.com/read.php?tid=14016&fid=56[/url]

六、顯示效果

登入沙箱賬号點選【下一步】,進入賬單詳情,點選【确認付款】,進入輸入密碼頁面

app支付內建開發者指南一、文檔位址二、開發前準備工作三、接口內建代碼示例四、用戶端內建五、注意事項六、顯示效果
app支付內建開發者指南一、文檔位址二、開發前準備工作三、接口內建代碼示例四、用戶端內建五、注意事項六、顯示效果
app支付內建開發者指南一、文檔位址二、開發前準備工作三、接口內建代碼示例四、用戶端內建五、注意事項六、顯示效果

注意:未輸入密碼之前,支付寶訂單還是為建立狀态,隻有輸入密碼之後,才會生成支付寶訂單,是以這個時候用查詢接口查詢會報錯“訂單不存在”

如有疑問,歡迎大家留言提問或者吐槽,謝謝大家!!!!