支付寶APP支付整合+.net(沙箱除錯)
阿新 • • 發佈:2018-11-01
1.服務端整合程式碼
private const string APPID = "發起請求的應用ID"; private const string APP_PRIVATE_KEY = "私鑰"; private const string ALIPAY_PUBLIC_KEY = "公鑰"; private const string CHARSET = "utf-8"; static void Main(string[] args) { //沙箱地址“https://openapi.alipaydev.com/gateway.do”,和上線的不同 IAopClient client = new DefaultAopClient("https://openapi.alipaydev.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 = "20170216test02"; model.TimeoutExpress = "30m"; request.SetBizModel(model); //這裡和普通的介面呼叫不同,使用的是sdkExecute AlipayTradeAppPayResponse response = client.SdkExecute(request); string result=response.Body; //頁面輸出的response.Body就是orderString 可以直接給客戶端請求,無需再做處理。 }
返回的最終結果"result"即為最終的訂單資訊,可以返回給客戶端進行操作。程式碼中需要引入AopSdk.dll,服務端程式碼包:https://openhome.alipay.com/doc/sdkDownload.resource?sdkType=NET (bin中可找到dll)
除錯過程中遇到問題:私鑰打死配置錯誤,只能重新生成了
由於是除錯,我最終使用的是C#控制檯除錯,取到最終結果result即可,然後複製訂單資訊(即result)在APP端程式碼中去設定訂單資訊,然後請求支付。
2.APP端整合程式碼
private static final int SDK_PAY_FLAG = 1; private static final int SDK_AUTH_FLAG = 2; //orderInfo即為服務端取到的result(測試使用而已) //通過執行緒請求APP支付服務 final String orderInfo = "app_id=2016092100565607&biz_content=%7b%22body%22%3a%22%e6%88%91%e6%98%af%e6%b5%8b%e8%af%95%e6%95%b0%e6%8d%ae%22%2c%22out_trade_no%22%3a%2220170216test02%22%2c%22product_code%22%3a%22QUICK_MSECURITY_PAY%22%2c%22subject%22%3a%22App%e6%94%af%e4%bb%98%e6%b5%8b%e8%af%95DoNet%22%2c%22timeout_express%22%3a%2230m%22%2c%22total_amount%22%3a%220.01%22%7d&charset=utf-8&format=json&method=alipay.trade.app.pay&sign_type=RSA2×tamp=2018-09-29+17%3a40%3a28&version=1.0&sign=3tmlOGDyTtRFjxHORSktnUQDHwOE7LqnPsJrpd6ifMoqxRazM2PwjUAp3NomxZXzQOEz2Nmrt%2fcWmM8uQndQikSXU6sXmXEP9zCMYZxZDmwiU2d92N2SigcUExi8cNVfjGURzCo5sepRlSjiui0Ckqd3C7u6CFMf7lwnvosKQhYodsom6%2fl2AXgtSdKJSleg43QBbQSvNgF0SATGpsb36vOo6VhSPBgfhEO%2bdcbWg99FoynLZzGE2d3VNjPZG1sdcitH7M8if85JY2V9H7Y9XxzwIA6t9SY%2b1WHe0tuFsSTPlSEa08Q8jVtGtKHww6mF0%2fri28h%2b1tVrul5SZRhhmw%3d%3d"; Runnable payRunnable = new Runnable() { @Override public void run() { PayTask alipay = new PayTask(PayDemoActivity.this); Map<String, String> result = alipay.payV2(orderInfo, true); Log.i("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(); //然後通過非同步處理機制處理支付結果是否成功 @SuppressLint("HandlerLeak") private Handler mHandler = new Handler() { @SuppressWarnings("unused") public void handleMessage(Message msg) { switch (msg.what) { case SDK_PAY_FLAG: { @SuppressWarnings("unchecked") PayResult payResult = new PayResult((Map<String, String>) msg.obj); /** 對於支付結果,請商戶依賴服務端的非同步通知結果。同步通知結果,僅作為支付結束的通知。 */ String resultInfo = payResult.getResult();// 同步返回需要驗證的資訊 String resultStatus = payResult.getResultStatus(); Toast.makeText(PayDemoActivity.this, resultStatus+"", Toast.LENGTH_SHORT).show(); // 判斷resultStatus 為9000則代表支付成功 if (TextUtils.equals(resultStatus, "9000")) { // 該筆訂單是否真實支付成功,需要依賴服務端的非同步通知。 Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show(); } else { // 該筆訂單真實的支付結果,需要依賴服務端的非同步通知。 Toast.makeText(PayDemoActivity.this, "支付失敗", Toast.LENGTH_SHORT).show(); } break; } case SDK_AUTH_FLAG: { @SuppressWarnings("unchecked") AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true); String resultStatus = authResult.getResultStatus(); // 判斷resultStatus 為“9000”且result_code // 為“200”則代表授權成功,具體狀態碼代表含義可參考授權介面文件 if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) { // 獲取alipay_open_id,調支付時作為引數extern_token 的value // 傳入,則支付賬戶為該授權賬戶 Toast.makeText(PayDemoActivity.this, "授權成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT) .show(); } else { // 其他狀態值則為授權失敗 Toast.makeText(PayDemoActivity.this, "授權失敗" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show(); } break; } default: break; } }; };
app客戶端程式碼較為簡單,只需要請求伺服器,通過伺服器返回的訂單資訊進行操作即可呼叫支付。app支付demo地址:http://p.tb.cn/rmsportal_6680_WS_APP_PAY_SDK_BASE_2.0.zip