收銀臺APP開發(含微信和支付寶)

先介紹下背景哈,我朋友是搞PHP的,他之前搞了一個收銀臺,和小豬收銀臺的功能是相識的,先上個圖哈。
收銀臺圖片
我決定把這個做成APP版本的。(ps:原因是裏面有掃碼支付和掃碼退款的功能,網站上的這些功能只能用掃碼槍掃描,但是我們沒這些設備。不過現在智能手機也能掃描二維碼,所以我們便做了收銀臺的APP版本。)我花費了一些時間去熟悉這些功能。最開始我想的是獨立去實現這些功能。但是我在微信和支付寶的官方文檔,下圖是支付寶的當面付的說明。支付寶當面付
我便意識到當面付的功能一般是放在服務器上,而不是移動端的。於是讓我們php給我寫了些接口,我直接調用這些接口,具體的邏輯的處理放在服務器上,這一下子就減輕了好多負擔。簡單的貼下圖:
這裏寫圖片描述
開始寫代碼之前,我先思考了下大概的框架。建立了如下的包。
這裏寫圖片描述
畢竟是需要上線的代碼,所以需要檢測代碼的異常。我在這裏採用了騰訊的Bugly,騰訊bugly地址
http://blog.csdn.net/sinyu890807/article/details/51019856
然後還需要二維碼掃描的功能,我在這裏採用了Zxing。Zxing的項目地址爲:Zxing地址。同時還參考了郭神的項目: Android二維碼功能實現,在程序內嵌入ZXing項目項目是需要和服務器交互的,自然少不了和服務器交互,爲此引入了okhttp,okhttp Github地址
至此,所需要的第三方jar包已全部引入完畢,可以開始正式項目的編寫了。對了,還有一點要注意,因爲引用第三方jar包,所以最後打包時,想要混淆的時候,有可能無法通過。向這樣;
這裏寫圖片描述 所以要在proguard-rules.pro文件裏配置下,比如這個警告,這樣配置就可以:-dontwarn okio.** 其他的也類似。但是不建議到最後項目完成的時候再配置,一般如果引用第三方jar的話,最好立刻配置。
1.我首先寫了一個BaseActivity,裏面放置了公共的代碼
protected NetWorkChangerReceiver mReceiver;
protected IntentFilter mFilter;
public ActionBar actionBar;
public OkHttpClient mOkHttpClient;
public SharedPreferences mSharedPreference;
public SharedPreferences.Editor mEditor;

然後在onCreate()方法中進行實例化。

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTitle("");
        mOkHttpClient = new OkHttpClient();
        mReceiver = new NetWorkChangerReceiver();
        mFilter = new IntentFilter();
        mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        //實現記住密碼
        mSharedPreference = PreferenceManager.getDefaultSharedPreferences(this);
        mEditor = mSharedPreference.edit();
    }

2.因爲網絡請求是異步的,所以我寫了一個類 BaseAsyTask
簡要的代碼如下所示。

    protected static OkHttpClient okHttpClient;
    protected static ProgressDialog pDialog = null;
    private Context context = null;
    protected static FormBody.Builder builder = new          FormBody.Builder();
    protected static Request request = null;
    protected static Response response = null;
    protected static String string;
    protected static JSONObject jsonObject;
    protected static String seesion = null;
    public String serverUrl;
    protected static SharedPreferences    sharedPreference;

    protected static SharedPreferences.Editor editor;
    //表示哪個Activity傳遞過來
    private String TAG;

之後在BaseAsyTask的構造方法中去實例化這些變量。
在onPreExecute()去顯示一個Dialog,並且實例化Request請求

request = new Request.Builder().addHeader("Cookie", cooike).
                    url(URL).
                    post(builder.build()).build();

這裏採用post方式。

 @Override
    protected String doInBackground(String... params) {

        return null;
    }

doInBackground()是一個空方法,在相應子類中,實現對應的邏輯即可。

 @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        pDialog.dismiss();
    }

onPostExecute(String s)這裏也僅僅讓pDialog消失,具體的邏輯依然在子類中去實現。
3。應用需要隨時判斷是否聯網,這裏註冊了一個廣播,用於提醒用戶。

public class NetWorkChangerReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connectivityManager = (ConnectivityManager)
                context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = connectivityManager.getActiveNetworkInfo();
        if (info != null && info.isAvailable()) {
        } else {
            ToasUtils.showToast(context, "當前網絡不可用");
        }
    }
}

4.登錄功能就不說了,比較簡單,調用服務器的接口,處理下數據就可以了。先說下微信的收款功能。先放圖吧。
微信收銀
在WeiXinShouYinActivity裏處理倆個功能,一個是根據用戶輸入的金額,彈出一個收款的二維碼,用戶掃描即可付款。另外一個是打開掃一掃,掃描用戶的付款碼(這裏拿到的是用戶的付款嘛上面的數字),完成收款。這倆種還是不一樣的。大家可以在這裏去詳細的瞭解。先說第一個功能吧。根據用戶輸入的金額,攜帶需要的參數發送給服務器,根據服務器返回數據生成二維碼即可。這裏要注意的是,你使用的支付模式一還是支付模式二,如果弄錯了的話,是無法完成收款的。
第二個功能是掃碼支付。也是本APP最爲核心的部分。這個邏輯是商家輸入金額後,點擊掃一掃收款,會打開二維碼掃描的界面,這裏要注意,二維碼掃描需要用到攝像頭,如果要兼容6.0的話,需要動態申請權限。

 //獲取動態權限
   if (Build.VERSION.SDK_INT >= 23) {
      if (ContextCompat.checkSelfPermission(WeiXinShouYinActivity.this,
                                    Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                                ActivityCompat.requestPermissions(WeiXinShouYinActivity.this,
                                        new String[]{Manifest.permission.CAMERA},
                                        REQUEST_PERMISSION_CAMERA_CODE);
                            } else {
                                openScan();
                            }
                        } else {
                            openScan();
                        }

openScan()這個函數表示用Intent去打開二維碼掃描的Activity,這裏就不再貼出了。
注意,這個地方還要寫一個回調函數,如果用戶未授予權限的處理。我在這裏彈出一個dialog,提示下用戶,並且詢問用戶是否重新開啓該權限。
代碼如下:@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION_CAMERA_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openScan();
} else {
dialog();
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}

在二維碼掃描的Activity中的handleDecode()函數中,可以得到用戶付款碼的信息,然後攜帶用戶的信息,以及收款金額,異步傳遞給服務器,然後等待服務器處理完畢,處理下返回的數據即可。
此時,微信收款的倆種功能均已完成。支付寶的流程和微信的類似,不在贅述。
由於畢竟是公司的代碼,不方便全部上傳,如果有哪位朋友有需要的話,我很樂意與你交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章